use {peg, rules_from_peg};
fn text_peg2code() -> &'static str {
r#"
/* A peg grammar to parse peg grammars
*
*/
main = grammar
grammar = (rule / module)+
module = _ mod_name _ '{' _ grammar _ '}'
mod_name = symbol
symbol = [_a-zA-Z0-9] [_'"a-zA-Z0-9]*
rule = _ rule_name _ '=' _ expr _eol _
rule_name = '.'? symbol ('.' symbol)*
expr = or
or = and ( _ '/' _ or )?
error = 'error' _ '(' _ literal _ ')'
and = error
/ rep_or_neg ( _1 _ !(rule_name _ ('=' / '{')) and )*
_1 = (' ' / eol) // this is the and separator
rep_or_neg = atom_or_par ('*' / '+' / '?')?
/ '!' atom_or_par
atom_or_par = (atom / parenth)
parenth = '(' _ expr _ ')'
/ '(' _ expr _ error("unbalanced parethesis: missing ')'")
atom = literal
/ match
/ dot
/ rule_name
literal = lit_noesc / lit_esc
lit_noesc = _' ( !_' . )* _'
_' = "'"
lit_esc = _"
( esc_char
/ hex_char
/ !_" .
)*
_"
_" = '"'
esc_char = '\r'
/ '\n'
/ '\t'
/ '\\'
/ '\"'
hex_char = '\0x' [0-9A-F] [0-9A-F]
eol = ("\r\n" / "\n" / "\r")
_eol = (' ' / comment)* eol
match = '['
(
(mchars mbetween*)
/ mbetween+
)
']'
mchars = (!']' !(. '-') .)+
mbetween = (. '-' .)
dot = '.'
_ = ( ' '
/ eol
/ comment
)*
comment = line_comment
/ mline_comment
line_comment = '//' (!eol .)* eol
mline_comment = '/*' (!'*/' .)* '*/'
"#
}
pub fn print_rules2parse_peg() {
let rules = rules_from_peg(text_peg2code())
.map_err(|e| {
println!("{}", e);
panic!("FAIL");
}).unwrap();
println!("{}", peg::gcode::rust_from_rules(&rules))
}