diff options
Diffstat (limited to 'test/ragelambig3.lm')
-rw-r--r-- | test/ragelambig3.lm | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/test/ragelambig3.lm b/test/ragelambig3.lm new file mode 100644 index 0000000..74b7254 --- /dev/null +++ b/test/ragelambig3.lm @@ -0,0 +1,72 @@ +##### LM ##### +lex + ignore /[\t\n ]+/ + literal `^ `| `- `, `: `! `? `. + literal `( `) `{ `} `* `& `+ + + literal `-- `:> `:>> `<: `-> `** + + token word /[a-zA-Z_][a-zA-Z0-9_]*/ + token uint /[0-9]+/ +end + + +def start + [expression] + { + print_xml( lhs ) + } + +def expression + [expression `| term_short] +| [expression `& term_short] +| [expression `- term_short] +| [expression `-- term_short] +| [term_short] + +# Works, but is confusing. +def term_short + reducefirst + [term] + +def term + [term factor_with_rep] +| [term `. factor_with_rep] +| [term `:> factor_with_rep] +| [term `:>> factor_with_rep] +| [term `<: factor_with_rep] +| [factor_with_rep] + +def factor_with_rep + [factor_with_rep `*] +| [factor_with_rep `**] +| [factor_with_rep `?] +| [factor_with_rep `+] +| [factor_with_rep `{ factor_rep_num `}] +| [factor_with_rep `{ `, factor_rep_num `}] +| [factor_with_rep `{ factor_rep_num `, `}] +| [factor_with_rep `{ factor_rep_num `, factor_rep_num `}] +| [factor_with_neg] + +def factor_rep_num [uint] + +def factor_with_neg + [`! factor_with_neg] +| [`^ factor_with_neg] +| [factor] + +def factor + [alphabet_num] +| [word] +| [`( expression `)] + +def alphabet_num + [uint] +| [`- uint] + +parse start[ stdin ] +print( '\n' ) +##### IN ##### +1 - 1 +##### EXP ##### +<start><expression><expression><term_short><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep></term></term_short></expression><_literal_0007>-</_literal_0007><term_short><term><factor_with_rep><factor_with_neg><factor><alphabet_num><uint>1</uint></alphabet_num></factor></factor_with_neg></factor_with_rep></term></term_short></expression></start> |