parser Lisp: ignore: '[ \t\n\r]+' token NUM: '[0-9]+' token ID: '[-+*/!@$%^&=.a-zA-Z0-9_]+' token STR: '"\\([^\\"]+\|\\\\.\\)*"' rule expr: ID -> << ('id',ID)>> | STR -> << ('str',eval(STR))>> | NUM -> << ('num',atoi(NUM))>> | list -> << list>> rule list: "(" seq ")" -> << seq>> rule seq: -> << []>> | expr seq -> << [expr] + seq>>