diff options
Diffstat (limited to 'test/commitbt.lm')
-rw-r--r-- | test/commitbt.lm | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/test/commitbt.lm b/test/commitbt.lm new file mode 100644 index 0000000..da78807 --- /dev/null +++ b/test/commitbt.lm @@ -0,0 +1,109 @@ +##### LM ##### +# 2010: I'm not sure what the following means. + +# +# Local commit: +# -clears reparse flags underneath +# -must be possible to backtrack after +# Global commit (revertOn) +# -clears all reparse flags +# -must be possible to backtrack after +# Global commit (!revertOn) +# -clears all reparse flags +# -clears all 'parsed' reverse code +# -clears all reverse code +# -clears all alg structures +# + +# This test shows that a global commit with revertOn correctly does not clear +# 'parsed' items because it must entertain the possibility of backtracking. + +lex + ignore /[\t\n ]+/ + literal `^ `| `- `, `: `! `? `. + literal `( `) `{ `} `* `& `+ + + literal `-- `:> `:>> `<: `-> `** + + token word /[a-zA-Z_][a-zA-Z0-9_]*/ + token uint /[0-9]+/ +end + + +def expression [term expression_op*] + +def expression_op + [`| term] +| [`& term] +| [`- term] +| [`-- term] + +def term [factor_rep term_rest] + +# This list is done manually to get shortest match. +def term_rest + [] +| [term_op term_rest] + +def term_op + [factor_rep] +| [`. factor_rep] +| [`:> factor_rep] +| [`:>> factor_rep] +| [`<: factor_rep] + +def factor_rep + [factor_neg factor_rep_op*] + +def factor_rep_op + [`*] +| [`**] +| [`?] +| [`+] +| [`{ factor_rep_num `}] +| [`{ `, factor_rep_num `}] +| [`{ factor_rep_num `, `}] +| [`{ factor_rep_num `, factor_rep_num `}] + +def factor_rep_num [uint] + +def factor_neg + [`! factor_neg] +| [`^ factor_neg] +| [factor] + +def factor + [alphabet_num] +| [word] +| [`( expression `)] + +def alphabet_num + [uint] + +def suint + i: int + [uint] + +def sub + [suint* `*] + +token item + S: sub + /[0-9]+/ + { + M: str = input.pull(match_length) + parse_stop S: sub[input] + input.push( make_token( typeid<item> M S ) ) + } + +def stuff + [item* `!] +| [sub] + +parse S: stuff[ stdin ] +print_xml( S ) +print( '\n' ) +##### IN ##### +1 2 3 * ! +##### EXP ##### +<stuff><_repeat_item><item>1</item></_repeat_item><_literal_000d>!</_literal_000d></stuff> |