35 lines
		
	
	
		
			568 B
		
	
	
	
		
			OCaml
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			568 B
		
	
	
	
		
			OCaml
		
	
	
	
	
	
%{
 | 
						|
    open Ast
 | 
						|
%}
 | 
						|
 | 
						|
%token <int> INT
 | 
						|
%token <float> DOUBLE
 | 
						|
%token <string> SYM
 | 
						|
%token <string> STR
 | 
						|
%token LPAREN
 | 
						|
%token RPAREN
 | 
						|
%token QUOTE
 | 
						|
%token EOF
 | 
						|
 | 
						|
%start <Ast.lisp_val option> 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 { LQuoted e}
 | 
						|
    ;
 | 
						|
 | 
						|
lisp_list_rest:
 | 
						|
    | RPAREN { LNil }
 | 
						|
    | e = expr; lr = lisp_list_rest { LCons (e, lr) }
 | 
						|
    ;
 |