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 };