@scinorandex/sparse
Version:
Yet another parser generator
38 lines (28 loc) • 2.35 kB
Plain Text
<S>: <PROGRAM>;
<PROGRAM>: (<FUNCTION_DEFINITION_LIST: functions>)? [EOF];
<FUNCTION_DEFINITION_LIST>: <FUNCTION_DEFINITION: function> (<FUNCTION_DEFINITION_LIST: rest>)?;
<FUNCTION_DEFINITION>: [FUNCTION] [IDENTIFIER] [LPAREN] (<PARAMETER_LIST: parameters>)? [RPAREN] [LBRACE] (<STATEMENT_LIST: statements>)? [RBRACE];
<PARAMETER_LIST>: [IDENTIFIER: parameter_name] ([COMMA] <PARAMETER_LIST: rest>)?;
<STATEMENT_LIST>: <STATEMENT: stmt> (<STATEMENT_LIST: rest>)?;
<BLOCK_STATEMENT>: [LBRACE] (<STATEMENT_LIST: stmt_list>) [RBRACE];
<STATEMENT>: <IF_STATEMENT | WHILE_LOOP | EXPRESSION_STATEMENT | BLOCK_STATEMENT | VARIABLE_DEFINITION: stmt>;
<VARIABLE_DEFINITION>: [VAR] [IDENTIFIER: identifier] [EQUALS] <EXPRESSION: expr> [SEMICOLON];
<IF_STATEMENT>: [IF] [LPAREN] (<EXPRESSION: condition>)? [RPAREN] <STATEMENT: stmt> ([ELSE] <STATEMENT: else_stmt>)?;
<WHILE_LOOP>: [WHILE] [IDENTIFIER: loop_name] [LPAREN] <EXPRESSION: condition> [RPAREN] <STATEMENT: stmt>;
<EXPRESSION_STATEMENT>: <EXPRESSION: expr> [SEMICOLON];
<EXPRESSION>: <ASSIGNMENT_EXPRESSION: expr>;
<ASSIGNMENT_EXPRESSION>: ([IDENTIFIER: identifier] [EQUALS])? <EQUALITY_EXPRESSION: expr>;
<EQUALITY_EXPRESSION>: <COMPARISON_EXPRESSION: left> ([DOUBLE_EQUALS | NOT_EQUALS: op] <COMPARISON_EXPRESSION: right>)?;
<COMPARISON_EXPRESSION>: <BITWISE_OR_EXPRESSION: left> ([LESS_THAN | GREATER_THAN | LESS_THAN_EQUALS | GREATER_THAN_EQUALS: op] <BITWISE_OR_EXPRESSION: right>)?;
<BITWISE_OR_EXPRESSION>: <BITWISE_AND_EXPRESSION: left> ([PIPE | TILDE_PIPE: op] <BITWISE_OR_EXPRESSION: right>)?;
<BITWISE_AND_EXPRESSION>: <BITWISE_XOR_EXPRESSION: left> ([AMPERSAND | TILDE_AMPERSAND: op] <BITWISE_AND_EXPRESSION: right>)?;
<BITWISE_XOR_EXPRESSION>: <TERM_EXPRESSION: left> ([CARAT | TILDE_CARAT: op] <BITWISE_XOR_EXPRESSION: right>)?;
<TERM_EXPRESSION>: <UNARY_EXPR: left> ([PLUS | MINUS: op] <TERM_EXPRESSION: right>)?;
<UNARY_EXPR>: ([LEFTSHIFT | RIGHTSHIFT | TILDE: op])? <ENDPOINT: expr>;
<GROUPING_EXPRESSION>: [LPAREN] <EXPRESSION: expr> [RPAREN];
<FUNCTION_CALL_EXPRESSION>: [IDENTIFIER: function_name] [LPAREN] (<ARGUMENT_LIST: arguments>)? [RPAREN];
<ARGUMENT_LIST>: <EXPRESSION: arg> ([COMMA] <ARGUMENT_LIST: rest>)?;
<ENDPOINT>: [IDENTIFIER: identifier];
<ENDPOINT>: [NUMBER: number];
<ENDPOINT>: <GROUPING_EXPRESSION: expr>;
<ENDPOINT>: <FUNCTION_CALL_EXPRESSION: expr>;