Skip to content

Instantly share code, notes, and snippets.

@hackwaly
Created May 24, 2019 17:34
Show Gist options
  • Save hackwaly/2fd388826c05ecbfae2019b1bd6dc0af to your computer and use it in GitHub Desktop.
Save hackwaly/2fd388826c05ecbfae2019b1bd6dc0af to your computer and use it in GitHub Desktop.
%{
[@@@warning "-39"]
%}
%start <unit> file
%%
file:
| MODULE UIDENT item* EOF {}
item:
| DEF LIDENT EQ exp {}
stmt:
| exp SEMICOLON {}
| LIDENT EQ exp SEMICOLON {}
| IF exp THEN stmt {}
| IF exp LBRACE stmt+ RBRACE {}
| IF exp LBRACE stmt+ RBRACE ELSE LBRACE stmt+ RBRACE {}
| FOR LBRACE stmt+ RBRACE {}
| FOR exp LBRACE stmt+ RBRACE {}
| WHILE exp DO stmt {}
| WHILE exp LBRACE stmt+ RBRACE {}
| DO stmt WHILE exp SEMICOLON {}
| DO LBRACE stmt+ RBRACE WHILE exp SEMICOLON {}
| RETURN exp SEMICOLON {}
| RETURN UIDENT EQ exp SEMICOLON {}
seq_exp:
| exp {}
| stmt seq_exp {}
exp:
| ident_prefix_exp {}
ident_prefix_exp:
| ident_infix_exp {}
| LIDENT ident_prefix_exp {}
| IF exp THEN exp ELSE exp {}
| IF exp LBRACE seq_exp RBRACE ELSE LBRACE seq_exp RBRACE {}
| LIDENT EQ_GT exp {}
| FUNC LPAREN list_allow_trailing_separator(COMMA, param) RPAREN EQ_GT exp {}
ident_infix_exp:
| infix_exp {}
| infix_exp LIDENT ident_infix_exp {}
infix_exp:
| prefix_exp {}
| prefix_exp infix_op infix_exp {}
%inline infix_op:
| PLUS {}
| MINUS {}
| STAR {}
| SLASH {}
| LT {}
| LT_EQ {}
| GT {}
| GT_EQ {}
| EQ_EQ {}
| BANG_EQ {}
prefix_exp:
| prefix_op postfix_exp {}
%inline prefix_op:
| MINUS {}
postfix_exp:
| atom_exp {}
| LIDENT_LPAREN list_allow_trailing_separator(COMMA, arg) RPAREN {}
| postfix_exp LPAREN list_allow_trailing_separator(COMMA, arg) RPAREN {}
| postfix_exp LBRACKET exp RBRACKET {}
| postfix_exp DOT_LIDENT {}
arg:
| LIDENT_COLON exp {}
| exp {}
atom_exp:
| HALT {}
| INT {}
| FLOAT {}
| LIDENT {}
| UIDENT {}
| LPAREN exp RPAREN {}
| BLOCK LBRACE seq_exp RBRACE {}
| BLOCK UIDENT LBRACE seq_exp RBRACE {}
| FUNC LPAREN list_allow_trailing_separator(COMMA, param) RPAREN LBRACE seq_exp RBRACE {}
param:
| LIDENT_COLON LIDENT {}
| LIDENT {}
list_allow_trailing_separator(SEP, X):
| { [] }
| x=X { [x] }
| x=X SEP l=list_allow_trailing_separator(SEP, X) { x :: l }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment