Skip to content
Snippets Groups Projects
grammar.txt 2.46 KiB
Newer Older
Peter Matta's avatar
Peter Matta committed
Program -> eof                           // eof | epsilon
Program -> GDecl ';' Program             // 'const', 'var'
Peter Matta's avatar
Peter Matta committed
Program -> Func Program                  // 'func'

GDecl -> 'const' identifier '=' GDecl_   // 'const'
GDecl -> 'var' identifier '=' GDecl_     // 'var'
GDecl_ -> identifier                     // 'identifier'
GDecl_ -> number_literal                 // 'number_literal'
Peter Matta's avatar
Peter Matta committed

Func -> 'func' identifier '(' Args ')' Block // 'func'


Block -> '{' Block_ '}'                  // '{'
Block_ -> epsilon                        // _ | '}'
Block_ -> Decl ';' Block_                // 'var' | '}'
Block_ -> Expr ';' Block_                // identifier, number_literal, '(' | '}'
Block_ -> Stmt Block_                    // 'for', 'while', 'if' | '}'
Peter Matta's avatar
Peter Matta committed

Decl -> 'var' identifier '=' Expr        // 'var'
Peter Matta's avatar
Peter Matta committed

Peter Matta's avatar
Peter Matta committed
TopExpr -> identifier TopExpr_ ';'       // identifier
TopExpr -> number_literal Expr_ ';'      // number_literal
TopExpr_ -> epsilon                      // _ | ';'
TopExpr_ -> '=' Expr                     // '='
TopExpr_ -> FuncCall                     // '('

Expr -> identifier idExpr Expr_          // identifier | Operator, ')', '{', ';'
Expr -> number_literal Expr_             // number_literal | Operator, ')', '{', ';'
Expr -> '(' Expr ')'                     // '('
Expr_ -> Operator Expr                   // Operator
Peter Matta's avatar
Peter Matta committed
Expr_ -> epsilon                         // _ | ')', '{', ';'
idExpr -> epsilon                        // _ | Operator, ')', '{', ';'
idExpr -> FuncCall                       // '(' | Operator ')', '{', ';'

Stmt -> For                              // 'for'
Stmt -> While                            // 'while'
Stmt -> If                               // 'if'
Peter Matta's avatar
Peter Matta committed

FuncCall -> epsilon                      // _ | Operator, ')', '{', ';'
Peter Matta's avatar
Peter Matta committed
FuncCall -> '(' Args ')'                 // '('


For -> 'for' identifier 'in' Range Block // 'for'
While -> 'while' Expr Block              // 'while'
If -> 'if' Expr Block Else               // 'if'
Else -> epsilon                          // _ | 'var', identifier, number_literal, '(', 'for', 'while', 'if', '}'
Else -> 'else' Block                     // 'else'

Args -> epsilon                          // _ | ')'
Args -> identifier Args_                 // identifier
Args_ -> epsilon                         // _ | ')'
Args_ -> ',' identifier Args_            // ','

Range -> Expr Range_                     // identifier, number_literal, '('
Range_ -> '..' Expr                      // '..'
Range_ -> '...' Expr                     // '...'