bit-hack/nano-script

Accurately define the grammar

Opened this issue · 2 comments

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

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'

I should make nice rail road diagrams for the manual for this too.