lex token func_chr /[^{}]+/ token func_open /'{'/ token func_close /'}'/ end def func_item [func_chr] | [func_open func_body func_close] def func_body [func_item*] def func [ident `( `) `{ func_body func_close ] lex token ident /[a-zA-Z_]+/ token number /[0-9]+/ rl s_string / "'" ([^'\\\n] | '\\' any )* "'" / rl d_string / '"' ([^"\\\n] | '\\' any )* '"' / token string /s_string | d_string/ literal `+ `* `; `( `) `{ `} ignore wp / [ \t\n]+ / end def class_item [func] | [class] | [ident `;] | [number `;] | [string `;] def class_body [class_item*] def class [ident `{ class_body `} ] def top_item [func] | [class] def start [top_item*] parse S: start[ stdin ] print( xml( S ) ) print( '\n' ) #pattern start # ~class { func() { func() { 1+{2}} } } func() {{a}} ##### IN ##### class { 1; "string"; foo; func() { func() { 1+{2} } } } func() { "data" {a} } ##### EXP ##### <_repeat_top_item>class<_literal_0017>{<_repeat_class_item>1<_literal_0011>;"string"<_literal_0011>;foo<_literal_0011>;func<_literal_0013>(<_literal_0015>)<_literal_0017>{<_repeat_func_item>func() {<_repeat_func_item> 1+{<_repeat_func_item>2} } }<_literal_0019>}func<_literal_0013>(<_literal_0015>)<_literal_0017>{<_repeat_func_item>"data" {<_repeat_func_item>a} }