Browse Source

Dicts and dicts in dicts

master
Julio Biason 2 years ago
parent
commit
8ac76fc9b2
  1. 13
      pestfoamtest/src/foam.pest
  2. 90
      pestfoamtest/src/lib.rs
  3. 15
      pestfoamtest/src/main.rs

13
pestfoamtest/src/foam.pest

@ -1,4 +1,15 @@
whitespace = _{ " " | "\t" | "\r" | "\n" }
multi_comment = { "/*" ~ (!"*/" ~ ANY)* ~ "*/" } multi_comment = { "/*" ~ (!"*/" ~ ANY)* ~ "*/" }
single_comment = { "//" ~ (!NEWLINE ~ ANY)* } single_comment = { "//" ~ (!NEWLINE ~ ANY)* }
identifier = { ASCII_ALPHA+ ~ (ASCII_ALPHA | ASCII_DIGIT | "_")* }
rvalue = { (!";" ~ ANY)+ }
attribution = { identifier ~ whitespace+ ~ rvalue ~ ";" }
dictionary = { identifier ~ whitespace+ ~ "{" ~ (dictionary | attribution | whitespace)+ ~ "}" }
field = { (ASCII_DIGIT | "." | "-")+ } file = { SOI ~ (
whitespace
| multi_comment
| single_comment
| dictionary
| attribution)*
~ EOI }

90
pestfoamtest/src/lib.rs

@ -0,0 +1,90 @@
//! Parse a Foam file into a major structure.
use pest_derive::Parser;
#[derive(Parser)]
#[grammar = "foam.pest"]
pub struct Foam;
#[cfg(test)]
mod test {
use super::*;
use pest::Parser;
#[test]
fn multi_comment() {
let parse = Foam::parse(Rule::multi_comment, "/* this is comment */");
assert!(parse.is_ok());
}
#[test]
fn broken_multi() {
let parse = Foam::parse(Rule::multi_comment, "/* bad comment");
assert!(parse.is_err());
}
#[test]
fn single_comment() {
let parse = Foam::parse(Rule::single_comment, "// this is comment");
assert!(parse.is_ok());
}
#[test]
fn chained_comments() {
let text = "/* this is one comment */
// And this is another";
let parse = Foam::parse(Rule::file, text);
assert!(parse.is_ok(), "{:?}", parse);
}
#[test]
fn identifier() {
let parse = Foam::parse(Rule::identifier, "FoamFile");
assert!(parse.is_ok());
let parse = Foam::parse(Rule::identifier, "foam_file");
assert!(parse.is_ok());
}
#[test]
fn broken_identifer() {
let parse = Foam::parse(Rule::identifier, "123");
assert!(parse.is_err());
let parse = Foam::parse(Rule::identifier, "asd ");
assert!(parse.is_ok(), "{:?}", parse);
// XXX check if the identifier lost its space.
}
#[test]
fn attribution() {
let parse = Foam::parse(Rule::attribution, "version 2.0;");
assert!(parse.is_ok(), "{:?}", parse);
}
#[test]
fn broken_attribution() {
let parse = Foam::parse(Rule::attribution, "version 2.0");
assert!(parse.is_err(), "{:?}", parse);
}
#[test]
fn dictionary() {
let text = "FoamFile
{
version 2.0;
format ascii;
class dictionary;
location system;
object caseSetupDict;
}";
let parse = Foam::parse(Rule::dictionary, text);
assert!(parse.is_ok(), "{:#?}", parse);
}
#[test]
fn dict_in_dict() {
let text = "dict1 { dict2 { class bad; } }";
let parse = Foam::parse(Rule::dictionary, text);
assert!(parse.is_err(), "{:#?}", parse);
}
}

15
pestfoamtest/src/main.rs

@ -1,15 +0,0 @@
use pest::Parser;
use pest_derive::Parser;
#[derive(Parser)]
#[grammar = "foam.pest"]
pub struct Foam;
fn main() {
let parse = Foam::parse(Rule::multi_comment, "/* this is comment */");
println!("{:?}", parse);
let parse = Foam::parse(Rule::single_comment, "// this is comment");
println!("{:?}", parse);
let parse = Foam::parse(Rule::field, "-273.15");
println!("{:?}", parse);
}
Loading…
Cancel
Save