BNF for Lang.jj

NON-TERMINALS

CompilationUnit ::= ( WithClause | UseClause )* ProcedureDeclaration Semi <EOF>
WithClause ::= <WITH> Identifier ( <DOT> Identifier )* Semi
UseClause ::= <USE> Identifier ( <DOT> Identifier )* Semi
Semi ::= <SEMI>
Declaration ::= ( ( ProcedureDeclaration | FunctionDeclaration | VariableDeclaration | TypeDeclaration ) Semi )*
ProcedureDeclaration ::= <PROCEDURE> Identifier ( DeclarationParameters )? ( <IS> Declaration <BEGIN> SequenceOfStatement <END> )?
Identifier ::= <IDENTIFIER>
DeclarationParameters ::= <LPAREN> Parameter ( <SEMI> Parameter )* <RPAREN>
Parameter ::= Identifier ( <COMMA> Identifier )* <COLON> ( <IN> )? ( <OUT> )? Type ( <IS_ASSIGNED> TypeExpression )?
Type ::= ( Identifier | Boolean | Character | Float | Integer | String )
TypeExpression ::= ( BooleanExpression | CharacterLiteral | StringLiteral )
Boolean ::= <BOOLEAN>
Character ::= <CHARACTER>
Float ::= <FLOAT>
Integer ::= <INTEGER>
String ::= <STRING>
FunctionDeclaration ::= <FUNCTION> Identifier ( DeclarationParameters )? <RETURN> Type ( <IS> Declaration <BEGIN> SequenceOfStatement <END> )?
VariableDeclaration ::= Identifier ( <COMMA> Identifier )* <COLON> ( Type ( <IS_ASSIGNED> TypeExpression )? | ArrayDeclaration )
ArrayDeclaration ::= <ARRAY> <LPAREN> IntegerExpression <DOT_DOT> IntegerExpression ( <COMMA> IntegerExpression <DOT_DOT> IntegerExpression )* <RPAREN> <OF> Type ( <IS_ASSIGNED> ( Identifier | ArrayDeclarationOthers ) )?
ArrayDeclarationOthers ::= <LPAREN> <OTHERS> <RIGHT_SHAFT> ( TypeExpression | ArrayDeclarationOthers ) <RPAREN>
TypeDeclaration ::= <TYPE> Identifier ( <IS> ( PointerDeclaration | DiscreteDeclaration | RecordDeclaration ) )?
PointerDeclaration ::= <ACCESS> Type
DiscreteDeclaration ::= <LPAREN> Identifier ( <COMMA> Identifier )* <RPAREN>
RecordDeclaration ::= ( <RECORD> ( VariableDeclaration Semi )+ <END> <RECORD> | <NULL> <RECORD> )
SequenceOfStatement ::= ( ( CaseStatement | DeclareBlock | ExitStatement | ForStatement | IfStatement | LoopStatement | NullStatement | ProcedureCallStatement | ReturnStatement | WhileStatement ) Semi )+
CharacterLiteral ::= <CHARACTER_LITERAL>
StringLiteral ::= <STRING_LITERAL>
AssignmentStatement ::= <IS_ASSIGNED> TypeExpression
CaseStatement ::= <CASE> Identifier ( <DOT> Identifier )* <IS> ( <WHEN> CaseValues <RIGHT_SHAFT> SequenceOfStatement )* ( <WHEN> <OTHERS> <RIGHT_SHAFT> SequenceOfStatement )? <END> <CASE>
CaseValues ::= ( BooleanExpression ( <DOT_DOT> BooleanExpression )? ) ( <BAR> ( BooleanExpression ( <DOT_DOT> BooleanExpression )? ) )*
DeclareBlock ::= <DECLARE> Declaration <BEGIN> SequenceOfStatement <END>
ExitStatement ::= <EXIT>
ForStatement ::= <FOR> Identifier <IN> ( ForReverse )? IntegerExpression <DOT_DOT> IntegerExpression LoopStatement
ForReverse ::= <REVERSE>
IfStatement ::= <IF> BooleanExpression <THEN> SequenceOfStatement ( ElsifPart )* ( ElsePart )? <END> <IF>
ElsifPart ::= <ELSIF> BooleanExpression <THEN> SequenceOfStatement
ElsePart ::= <ELSE> SequenceOfStatement
NullStatement ::= <NULL>
LoopStatement ::= <LOOP> SequenceOfStatement <END> <LOOP>
ProcedureCallStatement ::= Identifier ( CallParameters )? ( AssignmentStatement )?
CallParameters ::= <LPAREN> TypeExpression ( <COMMA> TypeExpression )* <RPAREN>
ReturnStatement ::= <RETURN> TypeExpression
WhileStatement ::= <WHILE> BooleanExpression LoopStatement
BooleanExpression ::= OrExpression
OrExpression ::= XorExpression ( <OR> XorExpression )*
XorExpression ::= AndExpression ( <XOR> AndExpression )*
AndExpression ::= UnaryBooleanExpression ( <AND> UnaryBooleanExpression )*
UnaryBooleanExpression ::= <NOT> ( EqualityExpression | BooleanLiteral | <LPAREN> BooleanExpression <RPAREN> | FunctionCallExpression )
| EqualityExpression
| BooleanLiteral
| <LPAREN> BooleanExpression <RPAREN>
| FunctionCallExpression
EqualityExpression ::= RelationalExpression ( <EQ> RelationalExpression | <NE> RelationalExpression )?
RelationalExpression ::= IntegerExpression ( <GT> IntegerExpression | <GT_EQ> IntegerExpression | <LT> IntegerExpression | <LT_EQ> IntegerExpression )?
BooleanLiteral ::= <TRUE>
| <FALSE>
IntegerExpression ::= AdditiveExpression
AdditiveExpression ::= MultiplicativeExpression ( <PLUS> MultiplicativeExpression | <DASH> MultiplicativeExpression )*
MultiplicativeExpression ::= UnaryIntegerExpression ( <STAR> UnaryIntegerExpression | <SLASH> UnaryIntegerExpression | <MOD> UnaryIntegerExpression | <REM> UnaryIntegerExpression )*
UnaryIntegerExpression ::= <DASH> ( IntegerLiteral | FloatLiteral | <LPAREN> IntegerExpression <RPAREN> | FunctionCallExpression )
| IntegerLiteral
| FloatLiteral
| <LPAREN> IntegerExpression <RPAREN>
| FunctionCallExpression
IntegerLiteral ::= <INTEGER_LITERAL>
FloatLiteral ::= <FLOAT_LITERAL>
FunctionCallExpression ::= Identifier ( CallParameters | ( <DOT> Identifier )+ )?