module languages/nqc/syntax/NQC-Statements

imports languages/nqc/syntax/NQC-Declarations 
        languages/nqc/syntax/NQC-Tasks

exports
  sorts BlockStatement
  context-free syntax
    "{" StatementList? "}" -> BlockStatement {cons("list")}

  sorts StatementList
  context-free syntax
    Statement+ -> StatementList

  sorts Statement
  context-free syntax
    AssignmentStatement ";"     -> Statement {cons("assign")}
    IfStatement                 -> Statement
    WhileStatement              -> Statement {cons("while")}
    DoStatement ";"             -> Statement {cons("do")}
    VarDeclarationListStatement -> Statement {cons("vardecllist")}
    RepeatStatement             -> Statement {cons("repeat")}
    UntilStatement              -> Statement {cons("until")}
    ContinueStatement ";"       -> Statement {cons("continue")}
    BreakStatement ";"          -> Statement {cons("break")}
    StartStatement ";"          -> Statement {cons("start")}
    SwitchStatement             -> Statement {cons("switch")}
    ExpressionStatement ";"     -> Statement {cons("expression")}
    BlockStatement              -> Statement {cons("block")}
    EmptyStatement              -> Statement {cons("empty")}

  sorts EmptyStatement 
  context-free syntax
    ";" -> EmptyStatement

  sorts AssignmentStatement
  context-free syntax
    VarName "=" Expression   -> AssignmentStatement {cons("varassign")} 
    VarName "+=" Expression  -> AssignmentStatement {cons("varaddassign")}
    VarName "-=" Expression  -> AssignmentStatement {cons("varsubassign")}
    VarName "*=" Expression  -> AssignmentStatement {cons("varmulassign")}
    VarName "/=" Expression  -> AssignmentStatement {cons("vardivassign")}
    VarName "%=" Expression  -> AssignmentStatement {cons("varmodassign")}
    VarName "||=" Expression -> AssignmentStatement {cons("varabsassign")}
    VarName "+-=" Expression -> AssignmentStatement {cons("varsignassign")}
    ArrayName "=" Expression   -> AssignmentStatement {cons("arrayassign")} 
    ArrayName "+=" Expression  -> AssignmentStatement {cons("arrayaddassign")} 
    ArrayName "-=" Expression  -> AssignmentStatement {cons("arraysubassign")} 
    ArrayName "*=" Expression  -> AssignmentStatement {cons("arraymulassign")} 
    ArrayName "/=" Expression  -> AssignmentStatement {cons("arraydivassign")} 
    ArrayName "%=" Expression  -> AssignmentStatement {cons("arraymodassign")} 
    ArrayName "||=" Expression -> AssignmentStatement {cons("arrayabsassign")} 
    ArrayName "+-=" Expression -> AssignmentStatement {cons("arraysignassign")} 

  sorts IfStatement
  context-free syntax
    "if" "(" Expression ")" Statement                  -> IfStatement {cons("if")}
    "if" "(" Expression ")" Statement "else" Statement -> IfStatement {cons("ifelse")}

  sorts WhileStatement
  context-free syntax
    "while" "(" Expression ")" Statement -> WhileStatement

  sorts DoStatement
  context-free syntax
    "do" Statement "while" "(" Expression ")" -> DoStatement

  sorts VarDeclarationListStatement
  context-free syntax
    TypeDenoter VarMultipleDeclaration ";" -> VarDeclarationListStatement

  sorts RepeatStatement
  context-free syntax
    "repeat" "(" Expression ")" Statement -> RepeatStatement

  sorts UntilStatement
  context-free syntax
    "until" "(" Expression ")" Statement -> UntilStatement

  sorts BreakStatement
  context-free syntax
    "break" -> BreakStatement
 
  sorts ContinueStatement
  context-free syntax
    "continue" -> ContinueStatement

  sorts StartStatement
  context-free syntax
    "start" TaskName -> StartStatement

  sorts SwitchStatement
  context-free syntax
    "switch" "(" Expression ")" "{" CaseList DefaultCaseStatement? "}" -> SwitchStatement

  sorts CaseList
  context-free syntax
    CaseStatement+ -> CaseList

  sorts CaseStatement
  context-free syntax
    "case" ConstantExpression ":" StatementList? -> CaseStatement

  sorts DefaultCaseStatement
  context-free syntax
    "default" ":" StatementList -> DefaultCaseStatement

  sorts ExpressionStatement
  context-free syntax
    Expression -> ExpressionStatement