clang2.atg 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. COMPILER Clang2
  2. (* CLANG level 2 pretty printer *)
  3. FROM Prettier IMPORT
  4. Append, NewLine, IndentNextLine, ExdentNextLine, Indent, Exdent;
  5. PROCEDURE WriteIdent;
  6. VAR
  7. IdentName : ARRAY [0 .. 20] OF CHAR;
  8. BEGIN
  9. LexString(IdentName); Append(IdentName);
  10. END WriteIdent;
  11. PROCEDURE WriteNumber;
  12. VAR
  13. IdentName : ARRAY [0 .. 20] OF CHAR;
  14. BEGIN
  15. LexString(IdentName); Append(IdentName);
  16. END WriteNumber;
  17. PROCEDURE WriteString;
  18. VAR
  19. IdentName : ARRAY [0 .. 80] OF CHAR;
  20. BEGIN
  21. LexString(IdentName); Append(IdentName);
  22. END WriteString;
  23. IGNORE CASE
  24. CHARACTERS
  25. letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  26. lowline = "_".
  27. octdigit = "01234567".
  28. digit = octdigit + "89".
  29. eol = CHR(13).
  30. noquote1 = ANY - "'" - eol.
  31. noquote2 = ANY - '"' - eol.
  32. IGNORE CHR(9) .. CHR(13)
  33. COMMENTS FROM "{" TO "}" NESTED
  34. TOKENS
  35. identifier = letter {letter | digit} .
  36. number = digit { digit} .
  37. string = "'" noquote1 {noquote1} "'" | '"' noquote2 {noquote2} '"' .
  38. PRODUCTIONS
  39. Clang2 =
  40. "PROGRAM" (. Append("PROGRAM ") .)
  41. identifier (. WriteIdent .)
  42. ";" (. Append(";"); IndentNextLine .)
  43. Block
  44. "." (. Append(".") .).
  45. Block =
  46. { ConstDeclaration
  47. | VarDeclaration
  48. | ProcDeclaration }
  49. StatementPart .
  50. ConstDeclaration =
  51. "CONST" (. Append("CONST"); IndentNextLine .)
  52. OneConst
  53. { (. NewLine .)
  54. OneConst } (. ExdentNextLine .) .
  55. OneConst =
  56. identifier (. WriteIdent .)
  57. "=" (. Append(" = ") .)
  58. number (. WriteNumber .)
  59. ";" (. Append(";") .) .
  60. VarDeclaration =
  61. "VAR" (. Append("VAR"); IndentNextLine .)
  62. OneVar
  63. { "," (. Append(", ") .)
  64. OneVar }
  65. ";" (. Append(";"); ExdentNextLine .) .
  66. OneVar =
  67. identifier (. WriteIdent .)
  68. [ "[" (. Append("[") .)
  69. number (. WriteNumber .)
  70. "]" (. Append("]") .)
  71. ] .
  72. ProcDeclaration =
  73. ( "PROCEDURE" (. NewLine; Append("PROCEDURE ") .)
  74. | "FUNCTION" (. NewLine; Append("FUNCTION ") .)
  75. )
  76. identifier (. WriteIdent .)
  77. [ FormalParameters ]
  78. ";" (. Append(";"); IndentNextLine .)
  79. ProcBlock
  80. ";" (. Append(";"); ExdentNextLine;
  81. NewLine .) .
  82. FormalParameters =
  83. "(" (. Append(" (") .)
  84. OnePar
  85. { "," (. Append(", ") .)
  86. OnePar }
  87. ")" (. Append(")") .) .
  88. OnePar =
  89. [ "VAR" (. Append("VAR ") .)
  90. ]
  91. identifier (. WriteIdent .) .
  92. ProcBlock =
  93. "FORWARD" (. Append("FORWARD") .)
  94. | Block .
  95. StatementPart =
  96. CompoundStatement .
  97. CompoundStatement =
  98. "BEGIN" (. Append("BEGIN"); IndentNextLine .)
  99. Statement
  100. { ";" (. Append(";"); NewLine .)
  101. Statement }
  102. "END" (. ExdentNextLine; Append("END") .).
  103. Statement =
  104. [ CompoundStatement
  105. | CallOrAssignment
  106. | IfStatement
  107. | WhileStatement
  108. | ReturnStatement
  109. | WriteStatement
  110. | ReadStatement
  111. | StackDump
  112. ] .
  113. CallOrAssignment =
  114. identifier (. WriteIdent .)
  115. (
  116. [ Subscript ]
  117. ":=" (. Append(" := ") .)
  118. Expression
  119. | [ ActualParameters ]
  120. ) .
  121. IfStatement =
  122. "IF" (. Append("IF ") .)
  123. Condition
  124. "THEN" (. IndentNextLine; Append("THEN ") .)
  125. Statement
  126. { "ELSIF" (. NewLine; Append("ELSIF ") .)
  127. Condition
  128. "THEN" (. IndentNextLine; Append("THEN ") .)
  129. Statement (. Exdent .)
  130. }
  131. [ "ELSE" (. NewLine; Append("ELSE ") .)
  132. Statement ]
  133. (. Exdent .) .
  134. WhileStatement =
  135. "WHILE" (. Append("WHILE ") .)
  136. Condition
  137. "DO" (. Append(" DO ") .)
  138. Statement .
  139. ReturnStatement =
  140. "RETURN" (. Append("RETURN ") .)
  141. [ Expression ] .
  142. WriteStatement =
  143. "WRITE" (. Append("WRITE") .)
  144. [ "(" (. Append("(") .)
  145. WriteList
  146. ")" (. Append(")") .)
  147. ] .
  148. ReadStatement =
  149. "READ" "(" (. Append("READ(") .)
  150. ReadList
  151. ")" (. Append(")") .).
  152. StackDump =
  153. "STACKDUMP" (. Append("STACKDUMP") .) .
  154. Condition =
  155. "ODD" "(" (. Append("ODD(") .)
  156. Expression
  157. ")" (. Append(")") .)
  158. | Expression RelOp Expression .
  159. Expression =
  160. [ Sign ] Term { AddOp Term } .
  161. Term =
  162. Factor { MulOp Factor } .
  163. Factor =
  164. identifier (. WriteIdent .)
  165. ( ActualParameters
  166. | Subscript |
  167. )
  168. | number (. WriteNumber .)
  169. | "(" (. Append("(") .)
  170. Expression
  171. ")" (. Append(")") .) .
  172. ActualParameters =
  173. "(" (. Append("(") .)
  174. Expression
  175. { "," (. Append(", ") .)
  176. Expression }
  177. ")" (. Append(")") .) .
  178. WriteList =
  179. ( Expression
  180. | string (. WriteString .)
  181. )
  182. { "," (. Append(", ") .)
  183. ( Expression
  184. | string (. WriteString .)
  185. )
  186. } .
  187. ReadList =
  188. VarDesignator
  189. { "," (. Append(", ") .)
  190. VarDesignator
  191. } .
  192. VarDesignator =
  193. identifier (. WriteIdent .)
  194. [ Subscript ] .
  195. Subscript =
  196. "[" (. Append("[") .)
  197. Expression
  198. "]" (. Append("]") .) .
  199. Sign = AddOp .
  200. AddOp =
  201. "+" (. Append(" + ") .)
  202. | "-" (. Append(" - ") .) .
  203. MulOp =
  204. "*" (. Append(" * ") .)
  205. | "/" (. Append(" / ") .) .
  206. RelOp =
  207. "=" (. Append(" = ") .)
  208. | "<>" (. Append(" <> ") .)
  209. | "<" (. Append(" < ") .)
  210. | "<=" (. Append(" <= ") .)
  211. | ">" (. Append(" > ") .)
  212. | ">=" (. Append(" >= ") .) .
  213. END Clang2.