module languages/nqc/syntax/NQC-Functions

imports languages/nqc/syntax/NQC-Statements

exports
  sorts FunctionList
  context-free syntax
      Function+   -> FunctionList

  sorts Function
  context-free syntax
    "void" FunctionName "(" ParameterList? ")" BlockStatement     -> Function {cons("void")}
    "function" FunctionName "(" ParameterList? ")" BlockStatement -> Function {cons("function")}
    "sub" FunctionName "(" ")" BlockStatement                     -> Function {cons("subroutine")}


  sorts ParameterList
  context-free syntax
    {Parameter ","}+ -> ParameterList

  sorts Parameter
  context-free syntax
    TypeDenoter ParameterName -> Parameter {cons("param")}

  sorts ParameterName
  context-free syntax
    Identifier -> ParameterName