module languages/modula-3/syntax/Statements imports languages/modula-3/syntax/Expressions imports languages/modula-3/syntax/Types exports sorts AssignStmt Stmt Block CallStmt CaseStmt ExitStmt EvalStmt ForStmt IfStmt LockStmt LoopStmt RaiseStmt RepeatStmt ReturnStmt TryFinStmt TryXptStmt TCaseStmt WhileStmt WithStmt Stmts Case TCase Handler Label Actual Binding context-free syntax AssignStmt -> Stmt Block -> Stmt CallStmt -> Stmt CaseStmt -> Stmt ExitStmt -> Stmt EvalStmt -> Stmt ForStmt -> Stmt IfStmt -> Stmt LockStmt -> Stmt LoopStmt -> Stmt RaiseStmt -> Stmt RepeatStmt -> Stmt ReturnStmt -> Stmt TryFinStmt -> Stmt TryXptStmt -> Stmt TCaseStmt -> Stmt WhileStmt -> Stmt WithStmt -> Stmt ({Stmt ";"}+ ";"?)? -> Stmts Expr ":=" Expr -> AssignStmt Expr "(" {Actual ","}* ")" -> CallStmt "CASE" Expr "OF" "|"? {Case "|"}+ ("ELSE" Stmts)? "END" -> CaseStmt "EXIT" -> ExitStmt "EVAL" Expr -> EvalStmt "FOR" Id ":=" Expr "TO" Expr ("BY" Expr)? "DO" Stmts "END" -> ForStmt "IF" Expr "THEN" Stmts ("ELSIF" Expr "THEN" Stmts)* ("ELSE" Stmts)? "END" -> IfStmt "LOCK" Expr "DO" Stmts "END" -> LockStmt "LOOP" Stmts "END" -> LoopStmt "RAISE" QualId ("(" Expr ")")? -> RaiseStmt "REPEAT" Stmts "UNTIL" Expr -> RepeatStmt "RETURN" Expr? -> ReturnStmt "TYPECASE" Expr "OF" "|"? {TCase "|"}+ ("ELSE" Stmts)? "END" -> TCaseStmt "TRY" Stmts "EXCEPT" "|"? {Handler "|"}+ ("ELSE" Stmts)? "END" -> TryXptStmt "TRY" Stmts "FINALLY" Stmts "END" -> TryFinStmt "WHILE" Expr "DO" Stmts "END" -> WhileStmt "WITH" {Binding ","}+ "DO" Stmts "END" -> WithStmt {Label ","}+ "=>" Stmts -> Case Expr (".." Expr)? -> Label {QualId ","}+ ("(" Id ")")? "=>" Stmts -> Handler {Type ","}+ ("(" Id ")")? "=>" Stmts -> TCase Id "=" Expr -> Binding TypeLiteral | ((Id ":=")? Expr) -> Actual