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 >>