Julio Biason
2 years ago
3 changed files with 102 additions and 16 deletions
@ -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 } |
||||||
|
@ -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); |
||||||
|
} |
||||||
|
} |
@ -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…
Reference in new issue