mod2.atg 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. COMPILER Mod2
  2. (* Alternative grammar for PIM style Modula-2 *)
  3. CHARACTERS
  4. eol = CHR(13) .
  5. letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .
  6. octDigit = "01234567" .
  7. digit = octDigit + '89'.
  8. hexDigit = digit + 'ABCDEF'.
  9. noQuote1 = ANY - "'" - eol .
  10. noQuote2 = ANY - '"' - eol .
  11. IGNORE CHR(9) .. CHR(13)
  12. COMMENTS
  13. FROM '(*' TO '*)' NESTED
  14. TOKENS
  15. id = letter { letter | digit }.
  16. integer = digit { digit }
  17. | digit { digit } CONTEXT ("..")
  18. | octDigit { octDigit } ("B" | "C")
  19. | digit { hexDigit } "H".
  20. real = digit { digit } "." { digit }
  21. [ "E" [ "+" | "-" ] digit { digit } ].
  22. string = "'" { noQuote1 } "'"
  23. | '"' { noQuote2 } '"'.
  24. PRODUCTIONS
  25. Mod2 = DefMod | [ "IMPLEMENTATION" ] ProgMod .
  26. ProgMod = "MODULE" id [ Priority ] ";" { Import } Block id "." .
  27. Def = "CONST" { ConstDecl ";" }
  28. | "TYPE" { id [ "=" Type ] ";" }
  29. | "VAR" { VarDecl ";" }
  30. | ProcHead ";" .
  31. DefMod = "DEFINITION" "MODULE" id ";" { Import } { Def } "END" id "." .
  32. Import = "FROM" id "IMPORT" IdList ";" | "IMPORT" id { "," id } ";" .
  33. Export = "EXPORT" [ "QUALIFIED" ] IdList ";" .
  34. Priority = "[" ConstExpr "]" .
  35. ModDecl = "MODULE" id [ Priority ] ";" { Import } [ Export ] Block id .
  36. FormType = [ "ARRAY" "OF" ] QualId .
  37. QualId = id { "." id } .
  38. FPSect = [ "VAR" ] IdList ":" FormType .
  39. FormPar = "(" [ FPSect { ";" FPSect } ] ")" [ ":" QualId ] .
  40. Decl = "CONST" { ConstDecl ";" }
  41. | "TYPE" { TypeDecl ";" }
  42. | "VAR" { VarDecl ";" }
  43. | ProcDecl ";"
  44. | ModDecl ";" .
  45. Block = { Decl } [ "BEGIN" StatSeq ] "END" .
  46. StatSeq = Stat { ";" Stat } .
  47. Stat = [ Design ( ":=" Expr | [ ActPar ] )
  48. | IfStat | CaseStat | LoopStat | ForStat
  49. | RepeatStat | WhileStat | WithStat
  50. | "EXIT" | "RETURN" [ Expr ]
  51. ] .
  52. ProcHead = "PROCEDURE" id [ FormPar ] .
  53. ProcDecl = ProcHead ";" ( Block id | "FORWARD" ) .
  54. WithStat = "WITH" Design "DO" StatSeq "END" .
  55. LoopStat = "LOOP" StatSeq "END" .
  56. ForStat = "FOR" id ":=" Expr "TO" Expr [ "BY" ConstExpr ]
  57. "DO" StatSeq "END".
  58. RepeatStat = "REPEAT" StatSeq "UNTIL" Expr .
  59. WhileStat = "WHILE" Expr "DO" StatSeq "END" .
  60. Case = [ CaseLabList ":" StatSeq ] .
  61. CaseStat = "CASE" Expr "OF" Case { "|" Case } [ "ELSE" StatSeq ] "END" .
  62. IfStat = "IF" Expr "THEN" StatSeq
  63. { "ELSIF" Expr "THEN" StatSeq }
  64. [ "ELSE" StatSeq ]
  65. "END" .
  66. ActPar = "(" [ ExpList ] ")" .
  67. Elem = ConstExpr [ ".." ConstExpr ] .
  68. Fact = integer | real | string | SetRest
  69. | id { SetRest | "." id | "[" ExpList "]" | "^" } [ ActPar ]
  70. | "(" Expr ")"
  71. | ( "NOT" | "~" ) Fact.
  72. SetRest = "{" [ Elem { "," Elem } ] "}" .
  73. MulOp = "*" | "/" | "DIV" | "REM" | "MOD" | "AND" | "&" .
  74. Term = Fact { MulOp Fact }.
  75. AddOp = "+" | "-" | "OR" .
  76. SimExpr = [ "+" | "-" ] Term { AddOp Term }.
  77. Rel = "=" | "#" | "<>" | "<" | "<=" | ">" | ">=" | "IN" .
  78. Expr = SimExpr [ Rel SimExpr ] .
  79. ConstDecl = id "=" ConstExpr .
  80. ConstExpr = Expr.
  81. TypeDecl = id "=" Type .
  82. Type = SimType | ArrayType | RecType
  83. | SetType | PointerType | ProcType .
  84. SimType = QualId [ "[" ConstExpr ".." ConstExpr "]" ]
  85. | Enum | "[" ConstExpr ".." ConstExpr "]" .
  86. Enum = "(" IdList ")" .
  87. IdList = id { "," id } .
  88. ArrayType = "ARRAY" SimType { "," SimType } "OF" Type.
  89. RecType = "RECORD" FieldListSeq "END" .
  90. FieldListSeq = FieldList { ";" FieldList } .
  91. FieldList = [ IdList ":" Type
  92. | "CASE" [ id ] ":" QualId "OF" Variant { "|" Variant }
  93. [ "ELSE" FieldListSeq ] "END"
  94. ].
  95. Variant = [ CaseLabList ":" FieldListSeq ] .
  96. CaseLabList = CaseLabs { "," CaseLabs } .
  97. CaseLabs = ConstExpr [ ".." ConstExpr ] .
  98. SetType = "SET" "OF" SimType .
  99. PointerType = "POINTER" "TO" Type .
  100. ProcType = "PROCEDURE" [ FormTypeList ] .
  101. FormTypeList = "(" [ [ "VAR" ] FormType { "," [ "VAR" ] FormType } ] ")"
  102. [ ":" QualId ] .
  103. VarDecl = IdList ":" Type .
  104. Design = id { "[" ExpList "]" | "^" | "." id }.
  105. ExpList = Expr { "," Expr }.
  106. END Mod2.