adacs.atg 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. COMPILER AdaCS
  2. (* A subset of Ada from Fischer/LeBlanc: "Crafting a Compiler" *)
  3. IGNORE CASE
  4. CHARACTERS
  5. letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  6. digit = "0123456789".
  7. eol = CHR(13).
  8. anyButQuote = ANY - '"' - eol.
  9. COMMENTS
  10. FROM "--" TO eol
  11. TOKENS
  12. id = letter { ["_"] (letter | digit) }.
  13. int = digit { ["_"] digit}.
  14. float = digit { ["_"] digit}
  15. ( "." digit { ["_"] digit }
  16. [ ("E" | "e") ["+" | "-"] digit { ["_"] digit } ]
  17. | ("E" | "e") ["+" | "-"] digit { ["_"] digit }
  18. ).
  19. str = '"' {anyButQuote | '""'} '"'.
  20. PRODUCTIONS
  21. AdaCS = PragmaList CompUnit {PragmaList CompUnit}.
  22. PragmaList = {Pragma}.
  23. Pragma = "PRAGMA" id ";".
  24. CompUnit = PackDecl.
  25. PackDecl = "PACKAGE" PackSpecOrBody ";".
  26. PackSpecOrBody = id "IS" {SpecDecl} [PrivPart] BodyOpt "END" IdOpt ";"
  27. | "BODY" id "IS" {BodyDecl} {Stat} [ExcPart] "END" IdOpt ";".
  28. BodyOpt = ["BODY" {BodyDecl} {Stat} [ExcPart]].
  29. IdOpt = [id].
  30. SpecDecl = PrivTypeDecl | Decl.
  31. PrivTypeDecl = "TYPE" id "IS" "PRIVATE" ";".
  32. PrivPart = "PRIVATE" PrivItem {PrivItem}.
  33. PrivItem = "SUBTYPE" id "IS" SubtypeDef ";" | "TYPE" id "IS" TypeDef.
  34. BodyDecl = SubprogBodyDecl | Decl.
  35. Decl = ObjDecl | TypeDecl | SubtypeDecl | Pragma
  36. | SubprogBodyDecl | "USE" NameList ";"
  37. | IdList ":" "EXCEPTION" .
  38. ObjDecl = IdList ":" ConstOpt TypeOrSubtype InitOpt ";".
  39. IdList = id { "," id}.
  40. ConstOpt = ["CONSTANT"].
  41. TypeOrSubtype = Type | SubtypeDef.
  42. InitOpt = [":=" Expr].
  43. TypeDecl = "TYPE" id "IS" TypeDef ";" | IncomplTypeDecl.
  44. Type = TypeName | TypeDef.
  45. TypeName = id.
  46. TypeDef = RecTypeDef | ArrTypeDef | EnumTypeDef | "ACCESS" Subtype.
  47. IncomplTypeDecl = "TYPE" id ";".
  48. RecTypeDef = "RECORD" CompList "END" "RECORD".
  49. CompList = CompDecl {CompDecl} | {CompDecl} VarPart | "NULL" ";".
  50. CompDecl = IdList ":" TypeOrSubtype.
  51. VarPart = "CASE" id ":" TypeName "IS" Var {Var} "END" "CASE" ";".
  52. Var = "WHEN" VarChoice "=>" CompList.
  53. VarChoice = SimpleExpr.
  54. ArrTypeDef = UnconstrArrDef | ConstrArrDef.
  55. UnconstrArrDef = "ARRAY" UnconstrIndexList "OF" ElemType.
  56. UnconstrIndexList= "(" IndexSubtypeDef {"," IndexSubtypeDef} ")".
  57. IndexSubtypeDef = TypeName "RANGE" "<>".
  58. ConstrArrDef = "ARRAY" ConstrIndexList "OF" ElemType.
  59. ConstrIndexList = "(" DiscrRange {"," DiscrRange} ")".
  60. ElemType = TypeOrSubtype.
  61. EnumTypeDef = "(" EnumIdList ")".
  62. EnumIdList = id {"," id}.
  63. SubtypeDecl = "SUBTYPE" id "IS" SubtypeDef ";".
  64. Subtype = TypeName | SubtypeDef.
  65. SubtypeDef = [ TypeName ] RangeConstr | TypeName IndexConstr.
  66. RangeConstr = "RANGE" Range.
  67. Range = SimpleExpr ".." SimpleExpr.
  68. IndexConstr = "(" DiscrRange {"," DiscrRange} ")".
  69. DiscrRange = Subtype | Range.
  70. SubprogBodyDecl = SubprogSpec "IS" {BodyDecl} {Stat} [ExcPart] "END" IdOpt ";".
  71. SubprogSpec = "PROCEDURE" id FormalPart | "FUNCTION" Design FormalPart.
  72. Design = id | OpSymbol.
  73. OpSymbol = str.
  74. FormalPart = "(" ParamDeclList ")".
  75. ParamDeclList = ParamDecl {";" ParamDecl}.
  76. ParamDecl = IdList ":" [Mode] TypeOrSubtype.
  77. Mode = "IN" ["OUT"] | "OUT".
  78. ExcPart = "EXCEPTION" {ExcHandler}.
  79. ExcHandler = "WHEN" ExcWhenTail.
  80. ExcWhenTail = "OTHERS" "=>" StatList | Name { "|" Name } "=>" StatList.
  81. Stat = Pragma | NullStat | AssignStat | CallStat | Block | LoopStat
  82. | IfStat | ExitStat | ReturnStat | CaseStat | RaiseStat.
  83. StatList = Stat {Stat}.
  84. NullStat = "NULL" ";".
  85. AssignStat = Name ":=" Expr ";".
  86. CallStat = Name ";".
  87. Block = [id ":"] [DeclPart] "BEGIN" {Stat} [ExcPart] "END" [ id] ";".
  88. DeclPart = "DECLARE" BodyDecl.
  89. ReturnStat = "RETURN" [Expr] ";".
  90. RaiseStat = "RAISE" [Name] ";".
  91. IfStat = "IF" Expr "THEN" StatList {"ELSIF" Expr "THEN" StatList}
  92. [ElsePart] "END" "IF" ";".
  93. ElsePart = "ELSE" StatList.
  94. LoopStat = [id ":"] [IterClause] BasicLoop ";".
  95. BasicLoop = "LOOP" {Stat} "END" "LOOP" ";".
  96. IterClause = "WHILE" Expr | "FOR" id "IN" ["REVERSE"] DiscrRange.
  97. ExitStat = "EXIT" [Name] ["WHEN" Expr] ";".
  98. CaseStat = "CASE" Expr "IS" WhenList OthersOpt "END" "CASE" ";".
  99. WhenList = {ChoiceList "=>" StatList}.
  100. OthersOpt = ["WHEN" "OTHERS" "=>" StatList].
  101. ChoiceList = Choice {"|" Choice}.
  102. Choice = Expr | Expr ".." Expr.
  103. Expr = Rel {LogOp Rel} | Rel {"AND" "THEN" Rel} | Rel {"OR" "ELSE" Rel}.
  104. Rel = SimpleExpr [RelOp SimpleExpr].
  105. SimpleExpr = [UnaryAddOp] Term {AddOp Term}.
  106. Term = Factor {MulOp Factor}.
  107. Factor = Primary ["**" Primary] | "NOT" Primary | "ABS" Primary.
  108. Primary = Literal | Name | "(" Expr ")" | Agg.
  109. Literal = int | float | str.
  110. LogOp = "AND" | "OR".
  111. RelOp = "=" | "/=" | "<" | "<=" | ">" | ">=".
  112. AddOp = "+" | "-" | "&".
  113. UnaryAddOp = "+" | "-".
  114. MulOp = "*" | "/" | "MOD".
  115. Name = SimpleName {NameSuffix} ["." "ALL"].
  116. SimpleName = id.
  117. NameSuffix = "." SelSuffix | "(" Expr {"," Expr}")" | "'" id.
  118. SelSuffix = id | OpSymbol.
  119. Agg = Name "'" "(" Comp {"," Comp}")".
  120. Comp = [AggChoiceList "=>"] Expr.
  121. AggChoiceList = AggChoice {"|" AggChoice}.
  122. AggChoice = SimpleName | SimpleExpr | DiscrRange | "OTHERS".
  123. NameList = Name { "," Name } .
  124. END AdaCS.