##### 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 [term expression_op*] def expression_op ['|' term] | ['&' term] | ['-' term] | ['--' term] def term [factor_rep term_op_list_short] # This list is done manually to get shortest match. def term_op_list_short [] | [term_op term_op_list_short] 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] | ['-' uint] parse start[ stdin ] print( '\n' ) ##### IN ##### 1 - 1 ##### EXP ##### 1<_repeat_factor_rep_op><_repeat_expression_op><_literal_0007>-1<_repeat_factor_rep_op>