##### 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 ##### 1<_literal_0007>-1