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
)+ )?