# 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, M, S ) ) } def stuff [item* `!] | [sub] parse S: stuff[ stdin ] print_xml( S ) print( '\n' ) ##### IN ##### 1 2 3 * ! ##### EXP ##### <_repeat_item>1<_literal_000d>!