Skip to content
Snippets Groups Projects
grammar.txt 4.57 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 ')'                 // '('

Peter Matta's avatar
Peter Matta committed
ExprPattern -> '(' ExprPattern_ ')'      // '('
ExprPattern_ -> epsilon                  // _ | ')'
ExprPattern_ -> Expr ExprPattern__       // identifier, number_literal, '('
ExprPattern__ -> epsilon                 // ')'
ExprPattern__ -> ',' Expr ExprPattern__  // ','

VarPattern -> '(' VarPattern_ ')'        // '('
VarPattern_ -> epsilon                   // ')'
VarPattern_ -> identifier VarPattern__   // identifier
VarPattern__ -> epsilon                  // ')'
VarPattern__ -> ',' identifier           // ','
                VarPattern__

Peter Matta's avatar
Peter Matta committed

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                     // '...'
TopExpr       -> Expr ';'                    // '(', identifier, number_literal, '-'
Expr          -> AssignExpr                  // '(', identifier, number_literal, '-'

AssignExpr    -> LogExpr AssignExpr_         // '(', identifier, number_literal, '-'
AssignExpr_   -> epsilon                     // _ | ')', ';'
AssignExpr_   -> '=' Expr                    // '='
Peter Matta's avatar
Peter Matta committed

LogExpr       -> ArithAddExpr LogExpr_       // '(', identifier, number_literal, '-'
LogExpr_      -> epsilon                     // _ | '=', ')', ';'
Peter Matta's avatar
Peter Matta committed
LogExpr_      -> LogOp ArithAddExpr          // '==', '!=', '<', '>', '<=', '>='

ArithAddExpr  -> ArithMulExpr ArithAddExpr_  // '(', identifier, number_literal, '-'
ArithAddExpr_ -> epsilon                     // _ | '==', '!=', '<', '>', '<=', '>=', '=', ')', ';'
ArithAddExpr_ -> AddOp ArithMulExpr          // '+', '-'
Peter Matta's avatar
Peter Matta committed

ArithMulExpr  -> PrimaryExpr ArithMulExpr_   // '(', identifier, number_literal, '-'
ArithMulExpr_ -> epsilon                     // _ | '+', '-', '==', '!=', '<', '>', '<=', '>=', '=', ')', ';'
Peter Matta's avatar
Peter Matta committed
ArithMulExpr_ -> MulOp PrimaryExpr           // '*', '/'

PrimaryExpr   -> '(' Expr ')'                // '('
PrimaryExpr   -> identiier IdExpr            // identifier
Peter Matta's avatar
Peter Matta committed
PrimaryExpr   -> number_literal              // number_literal
PrimaryExpr   -> '-' PrimaryExpr             // '-'
PrimaryExpr   -> '!' PrimaryExpr             // '!'
Peter Matta's avatar
Peter Matta committed

IdExpr        -> epsilon                     // _ | '*', '/', '+', '-', '==', '!=', '<', '>', '<=', '>=', '=', ')', ';'
IdExpr        -> '(' Args ')'                // '('
IdExpr        -> '[' Expr ']'                // '['