e0/lib/parser.mly

51 lines
865 B
OCaml
Raw Normal View History

2022-03-08 06:16:27 +00:00
%{
open Ast
%}
2022-03-08 08:52:20 +00:00
%token EOF
%token KWD_EXTERN
2022-03-08 06:16:27 +00:00
%token KWD_FN
2022-03-08 08:52:20 +00:00
%token KWD_RETURN
%token PUNCT_COLON
%token PUNCT_LBRACE
2022-03-08 08:52:20 +00:00
%token PUNCT_LPAREN
%token PUNCT_RARROW
%token PUNCT_RBRACE
%token PUNCT_RPAREN
2022-03-08 08:52:20 +00:00
%token PUNCT_SEMI
2022-03-08 08:52:20 +00:00
%token <int> LIT_NEG_INT
%token <int> LIT_INT
2022-03-08 06:16:27 +00:00
%token <string> IDENT
%start <program> program
%%
program:
2022-03-08 08:52:20 +00:00
| decls=decl* EOF { decls }
2022-03-08 06:16:27 +00:00
decl:
| func=func { DeclFunc func }
| extern=extern_func { DeclExternFunc extern }
2022-03-08 06:16:27 +00:00
func:
2022-03-08 08:52:20 +00:00
| KWD_FN name=IDENT PUNCT_LPAREN PUNCT_RPAREN body=body { { name; body } }
extern_func:
| KWD_EXTERN KWD_FN name=IDENT PUNCT_LPAREN PUNCT_RPAREN PUNCT_SEMI { { name } }
2022-03-08 08:52:20 +00:00
body:
| PUNCT_LBRACE stmts=stmt* PUNCT_RBRACE { { stmts; ret=ExprUnit } }
stmt:
| KWD_RETURN expr=expr PUNCT_SEMI { StmtReturn expr }
expr:
| i=LIT_NEG_INT { ExprLit (LitNegInt i) }
| i=LIT_INT { ExprLit (LitInt i) }
(* vim: set ft=ocamlyacc *)