diff --git a/lib/lexer.mll b/lib/lexer.mll index 6ea1db4..612b623 100644 --- a/lib/lexer.mll +++ b/lib/lexer.mll @@ -11,7 +11,6 @@ let number_sign = '-' | '+' let int = number_sign? digit+ let double = digit* '.' digit+ | digit+ '.' digit* - let white = [' ' '\t']+ let newline = '\r' | '\n' | "\r\n" @@ -31,5 +30,6 @@ rule read = | '(' { LPAREN } | ')' { RPAREN } | '\'' { QUOTE } + | '.' { DOT } | _ { raise (SyntaxError ("Unexpected char: " ^ Lexing.lexeme lexbuf))} | eof { EOF } diff --git a/lib/parser.mly b/lib/parser.mly index 421e932..28aa6f9 100644 --- a/lib/parser.mly +++ b/lib/parser.mly @@ -9,6 +9,7 @@ %token LPAREN %token RPAREN %token QUOTE +%token DOT %token EOF %start prog @@ -25,10 +26,11 @@ expr: | s = SYM { LSymbol s } | s = STR { LString (String.uppercase_ascii s) } | LPAREN; l = lisp_list_rest { l } - | QUOTE; e = expr { LQuoted e} + | 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) } ;