%{ open Ast %} %token INT %token DOUBLE %token SYM %token STR %token LPAREN %token RPAREN %token QUOTE %token DOT %token EOF %start prog %% prog: | EOF { None } | e = expr { Some e } ; expr: | i = INT { LInt i } | d = DOUBLE {LDouble d} | s = SYM { LSymbol s } | s = STR { LString (String.uppercase_ascii s) } | LPAREN; l = lisp_list_rest { l } | QUOTE; e = expr { LCons (LSymbol "quote", LCons (e, LNil)) } ; lisp_list_rest: | RPAREN { LNil } | DOT; e = expr; RPAREN { e } | e = expr; lr = lisp_list_rest { LCons (e, lr) } ;