Accurately define the grammar
Opened this issue · 2 comments
bit-hack commented
This is a starting point but it would be nice to accurately define the grammar, and generate a railroad diagram for the manual.
Program ::= ( FunctionDecl | VarDecl )*
Identifier ::= [a-fA-F_] [0-9a-fA-F_]*
Number ::= [0-9]+
Expression ::= Identifier
| Number
| FunctionCall
ExpressionList ::= Expression ( ',' Expression )*
VarDecl ::= 'var' Identifier ( '=' Number )?
ArgDeclList ::= Identifier ( ',' Identifier )+
FunctionCall ::= Identifier '(' ExpressionList? ')'
FunctionDecl ::= 'function' Identifier '(' ArgDeclList? ')' ( Statement )* 'end'
IfStatement ::= 'if' '(' Expression ')' ( Statement )* 'end'
WhileStatement ::= 'while' '(' Expression ')' ( Statement )* 'end'
Statement ::= ( 'return' Expression )
| IfStatement
| WhileStatement
| VarDecl
| FunctionCall
bit-hack commented
More accurately:
program ::= ( var_decl '\n' | array_decl '\n' | function_decl '\n' )+
identifier ::= [a-fA-F_] [0-9a-fA-F_]*
number ::= '-'? [0-9]+
expr_l1 ::= identifier
| number
| function_call
| '(' expression ')'
| identifier '[' expression ']'
expr_l2 ::= expression '*' expression
| expression '/' expression
| expression '%' expression
| expr_l1
expr_l3 ::= expression '+' expression
| expression '-' expression
| expr_l2
expr_l4 ::= expression '<' expression
| expression '>' expression
| expression '<=' expression
| expression '>=' expression
| expression '==' expression
| expr_l3
expression ::= 'not' expression
| expression 'and' expression
| expression 'or' expression
| expr_14
expression_list ::= expression ( ',' expression )*
array_decl ::= 'var' identifier '[' number ']'
var_decl ::= 'var' identifier ( '=' number )?
arg_decl_list ::= identifier ( ',' identifier )+
function_call ::= identifier '(' expression_list? ')'
function_decl ::= 'function' identifier '(' arg_decl_list? ')' '\n' ( statement )* 'end' '\n'
if_statement ::= 'if' '(' expression ')' '\n' ( statement )* 'end'
while_statement ::= 'while' '(' expression ')' '\n' ( statement )* 'end' '\n'
statement ::= 'return' Expression '\n'
| if_statement '\n'
| while_statement '\n'
| function_call '\n'
| identifier '=' expression '\n'
| identifier '[' expression ']' '=' expression '\n'
| var_decl '\n'
| array_decl '\n'
bit-hack commented
I should make nice rail road diagrams for the manual for this too.