134 Statement Grammar
(************** Statements **************)
Statement =
BlockStatement
| VarDecl, ";"
| UpdateStmt, ";"
| ProcedureCallStmt, ";"
| IfStmt
| WhileStmt
| ForStmt
| BreakStmt, ";"
| ContinueStmt, ";"
| ReturnStmt, ";"
| UnreachableStmt, ";"
| TryStmt
| PrintStmt, ";";
BlockStatement =
"{", { Statement }, "}";
VarDecl =
"var",
( InferredVariableDecl | TypedVariableDecl ),
[ "=", Expression ];
InferredVariableDecl =
VariableWithCardinality;
TypedVariableDecl =
TypeExpression, VariableWithCardinality;
VariableWithCardinality =
Identifier, CardinalityQualifier;
UpdateStmt =
UpdateTarget, AssignmentOperator, Expression
| UpdateTarget, IncrementOperator;
UpdateTarget =
Expression;
ProcedureCallStmt =
QualifiedProcedureName, [ GenericApplication ], "(", [ CallArgumentList ], ")";
QualifiedProcedureName =
Identifier, { ".", Identifier };
AssignmentOperator =
":="
| "+=" | "-=" | "*=" | "/=" | "^="
| "∪=" | "∩=" | "∖=";
IncrementOperator =
"++"
| "--";
IfStmt =
"if", Expression, BlockStatement, [ "else", ( IfStmt | BlockStatement ) ];
WhileStmt =
"while", Expression, BlockStatement;
ForStmt =
"for", ForBinding, "in", Expression, BlockStatement;
ForBinding =
TypedForBinding
| InferredForBinding;
TypedForBinding =
TypeExpression, Identifier;
InferredForBinding =
Identifier;
BreakStmt =
"break";
ContinueStmt =
"continue";
ReturnStmt =
"return", [ Expression ];
UnreachableStmt =
"unreachable";
TryStmt =
"try", BlockStatement, CatchClause, { CatchClause };
CatchClause =
"catch", "(", TypeExpression, Identifier, ")", BlockStatement;
PrintStmt = "print", Expression, { ",", Expression };