Package test; Helpers tab = 9; cr = 13; lf = 10; eol = [[cr + lf] + [cr + lf]]; white = [[' ' + tab] + eol]; lowercase = ['a' .. 'z']; uppercase = ['A' .. 'Z']; letter = [uppercase + lowercase]; digit = ['0'..'9']; id_part = lowercase (lowercase | digit)*; blank = (' ' | tab | eol)+; Tokens tar = 'tar'; id = id_part ('_' id_part)*; minus = '-'; semicolon = ';'; letter = letter; comma = ','; sharp = '#'; l_bkt = '['; r_bkt = ']'; blank = blank; Ignored Tokens /* These tokens are simply ignored by the parser. */ blank; /*****************/ Productions grammar = P.tar /*semicolon*/ {-> New grammar.first(P.tar.tar, P.tar.id) }; tar {-> T.tar* id* } = {first} T.tar [previous]:id+ minus+ [first]:id letter+ id* sharp {-> [T.tar] [id first previous] } | {second} tar_tail {-> [tar_tail.tar] [tar_tail.id] }; tar_tail {-> T.tar* id* } = comma otar* {-> [otar.tar] [otar.id]}; otar {-> T.tar* id* } = sharp P.tar {-> [P.tar.tar] [P.tar.id]}; Abstract Syntax Tree grammar = {first} T.tar* id* | {second} ;