oberon.atg

From: Anes Sadikovic <"Anes>
Date: Tue, 12 Dec 2000 10:25:45 -0500

Here is Oberon.atg from pm3 distribution. You might need to modify the
example slightly. The reason is that COCO/R for Oberon is original version
and it does not have some extensions that other COCOs have. I did not try to
compile the example with COCOR for Oberon.

Anes Sadikovic


COMPILER Oberon
(* A grammar for Oberon *)

CHARACTERS
  eol = CHR(13) .
  letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .
  digit = "0123456789" .
  hexDigit = digit + "ABCDEF" .
  noQuote = ANY - '"' - eol .

IGNORE CHR(9) .. CHR(13)

COMMENTS
  FROM "(*" TO "*)" NESTED

TOKENS
  ident = letter { letter | digit } .
  integer = digit { digit } | digit { hexDigit } "H" .
  real = digit { digit } "." { digit }
           [ ("E" | "D") [ "+" | "-" ] digit { digit } ] .
  CharConstant = digit { hexDigit } "X" .
  string = '"' { noQuote } '"' .

PRODUCTIONS
  Oberon = module .
  number = integer | real .
  identdef = ident [ "*" ] .
  qualident = [ ident "." ] ident .
  ConstantDeclaration = identdef "=" ConstExpression .
  ConstExpression = expression .
  TypeDeclaration = identdef "=" type .
  type = qualident | ArrayType | RecordType | PointerType |
ProcedureType .
  ArrayType = "ARRAY" length { "," length } "OF" type .
  length = ConstExpression .
  RecordType = "RECORD" [ "(" BaseType ")" ] FieldListSequence "END"
.
  BaseType = qualident .
  FieldListSequence = FieldList { ";" FieldList } .
  FieldList = [ IdentList ":" type ] .
  IdentList = identdef { "," identdef } .
  PointerType = "POINTER" "TO" type .
  ProcedureType = "PROCEDURE" [ FormalParameters ] .
  VariableDeclaration = IdentList ":" type .
  designator = qualident { "." ident | "[" ExpList "]" | "("
qualident ")" | "^" } .
  ExpList = expression { "," expression } .
  expression = SimpleExpression [ relation SimpleExpression ] .
  relation = "=" | "#" | "<" | "<=" | ">" | ">=" | "IN" | "IS" .
  SimpleExpression = [ "+" | "-" ] term { AddOperator term } .
  AddOperator = "+" | "-" | "OR" .
  term = factor { MulOperator factor } .
  MulOperator = "*" | "/" | "DIV" | "MOD" | "&" .
  factor = number | CharConstant | string | "NIL" | set
                      | designator [ ActualParameters ]
                      | "(" expression ")" | "~" factor .
  set = "{" [ element { "," element } ] "}" .
  element = expression [ ".." expression ] .
  ActualParameters = "(" [ ExpList ] ")" .
  statement = [ assignment | ProcedureCall | IfStatement |
                        CaseStatement | WhileStatement | RepeatStatement |
                        LoopStatement | WithStatement | "EXIT" |
                        "RETURN" [ expression ] ] .
  assignment = designator ":=" expression .
  ProcedureCall = designator [ ActualParameters ] .
  StatementSequence = statement { ";" statement } .
  IfStatement = "IF" expression "THEN" StatementSequence
                     { "ELSIF" expression "THEN" StatementSequence }
                     [ "ELSE" StatementSequence ] "END" .
  CaseStatement = "CASE" expression "OF" case { "|" case }
                     [ "ELSE" StatementSequence ] "END" .
  case = [ CaseLabelList ":" StatementSequence ] .
  CaseLabelList = CaseLabels { "," CaseLabels } .
  CaseLabels = ConstExpression [ ".." ConstExpression ] .
  WhileStatement = "WHILE" expression "DO" StatementSequence "END" .
  RepeatStatement = "REPEAT" StatementSequence "UNTIL" expression .
  LoopStatement = "LOOP" StatementSequence "END" .
  WithStatement = "WITH" qualident ":" qualident "DO" StatementSequence
"END" .
  ProcedureDeclaration = ProcedureHeading ";" ProcedureBody ident .
  ProcedureHeading = "PROCEDURE" [ "*" ] identdef [ FormalParameters ] .
  ProcedureBody = DeclarationSequence [ "BEGIN" StatementSequence ]
"END" .
  ForwardDeclaration = "PROCEDURE" "^" ident [ "*" ] [ FormalParameters ]
.
  DeclarationSequence = { "CONST" { ConstantDeclaration ";" }
                            | "TYPE" { TypeDeclaration ";" }
                            | "VAR" { VariableDeclaration ";" } }
                          { ProcedureDeclaration ";"
                            | ForwardDeclaration ";" } .
  FormalParameters = "(" [ FPSection { ";" FPSection } ] ")" [ ":"
qualident ] .
  FPSection = [ "VAR" ] ident { "," ident } ":" FormalType .
  FormalType = { "ARRAY" "OF" } (qualident | ProcedureType) .
  ImportList = "IMPORT" import { "," import } ";" .
  import = ident [ ":=" ident ] .
  module = "MODULE" ident ";"
                      [ ImportList ] DeclarationSequence
                      [ "BEGIN" StatementSequence ] "END" ident "." .
END Oberon.
Received on Tue Dec 12 2000 - 15:25:45 UTC

This archive was generated by hypermail 2.3.0 : Thu Sep 26 2013 - 06:27:45 UTC