##### LM ##### # Or-literal scanner lex token orlit_dash /'-' / token orlit_close /']'/ rl orlit_specials /[\-\]]/ token orlit_chr /^orlit_specials | '\\' any/ end def orlit_item [orlit_chr] | [orlit_chr orlit_dash orlit_chr] def orlit [orlit_item*] # Regex scanner lex token orlit_open /'['/ token orlit_neg_open /'[^'/ token regex_dot /'.'/ token regex_star /'*'/ token regex_close /'/'/ rl regex_specials /[\[\.\*\/\\]/ token regex_chr /(^regex_specials)+ | '\\' any/ end def regex_rep [regex_star] | [] def regex_base [regex_chr] | [regex_dot] | [orlit_open orlit orlit_close] | [orlit_neg_open orlit orlit_close] def regex_item [regex_base regex_rep] def regex_body [regex_item*] rl s_string /"'" ([^'\\\n] | '\\' any )* "'"/ rl d_string /'"' ([^"\\\n] | '\\' any )* '"'/ # Root scanner lex token ident /[a-zA-Z_]+/ token number /[0-9]+/ token string /s_string | d_string/ literal `+ `- `* `; `/ token slash /'/'/ token semi /';'/ ignore wp /[ \t\n]+/ end def factor [ident] | [number] | [string] | [`/ regex_body regex_close] def term [term `* factor] | [term `/ factor] | [factor] def expr [expr `+ term] | [expr `- term] | [term] def statement [expr `;] def start [statement*] parse S: start[ stdin ] for I:orlit_item in S { if match I [orlit_chr] { print( I '\n' ) } } print_xml( S ) print( '\n' ) ##### IN ##### 2 / /[^gu-zy].*o[\d-xa]*/; ##### EXP ##### g y a <_repeat_statement>2<_literal_0021>/<_literal_0021>/<_repeat_regex_item>[^<_repeat_orlit_item>gu-zy].*o[<_repeat_orlit_item>\d-xa]*/<_literal_001f>;