Guest User

Untitled

a guest
Jul 17th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.04 KB | None | 0 0
  1. options {
  2. DEBUG_LOOKAHEAD = false;
  3. DEBUG_PARSER = false;
  4. }
  5.  
  6. PARSER_BEGIN(HarveyParser)
  7. import java.io.*;
  8. public class HarveyParser {
  9. public static void main(String[] args) {
  10. FileReader sr = null;
  11. try {
  12. sr = new FileReader(args[0]);
  13. } catch (Exception e) {}
  14.  
  15. HarveyParser p = new HarveyParser(sr);
  16.  
  17. try {
  18. //p.Program();
  19. SimpleNode node = p.Program();
  20. // dump is the AST printer
  21. node.dump(">");
  22. } catch (Exception e) {}
  23.  
  24. }
  25. }
  26. PARSER_END(HarveyParser)
  27.  
  28. SKIP : {
  29. <IGNORE : ["(", ")", " ", ",", "\n", "\r", "\t"]>
  30. | <SCOMMENT : ";" (~["\n", "\r"])* ("\r" | "\n" | "\r\n")>
  31. }
  32.  
  33. SimpleNode Program() : {} {
  34. { System.out.println("program");}
  35.  
  36.  
  37. <BEGIN_PROGRAM>
  38. (
  39. try {
  40. ctrlstatement()
  41. | Statement()
  42. | FunctionDecl()
  43. | Error() { handleError(token); }
  44. }
  45. catch (ParseException ex) {
  46. handleError(ex.currentToken);
  47. }
  48. )*
  49.  
  50. <END_PROGRAM>
  51.  
  52.  
  53. { System.out.println("end program");}
  54. <EOF>
  55.  
  56. // jjtree stuff - jjtThis is the current AST node
  57. { return jjtThis; }
  58.  
  59. }
  60.  
  61.  
  62. void ctrlstatement() :{} {
  63. (ifstatement() | condstatement() | dostatement())
  64.  
  65. }
  66. void ifstatement() :{Token t;} {
  67. t=<IF> { jjtThis.setImage(t.image); }
  68. condblock()
  69. }
  70. void condstatement() :{} {
  71. <COND>
  72. (
  73. condblock()
  74. )+
  75. }
  76. void condblock() : {} {
  77. "["
  78. expr()
  79. (Statement())*
  80. "]"
  81. }
  82. void dostatement() :{} {
  83.  
  84. <DO>
  85. <IDENTIFIER>
  86. <NUMBER>
  87. expr()
  88. condblock()
  89. }
  90. void Statement() : {} {
  91. { System.out.println("statement"); }
  92. "|"
  93. (
  94. ((FunctionName() | <PRINT>) expr())
  95. |sexpr()
  96. )
  97. }
  98.  
  99. void FunctionDecl() : {} {
  100. { System.out.println("function"); }
  101. "["
  102. FunctionName()
  103. (FuncArguments())*
  104. ( Statement() )*
  105. (FuncReturn())?
  106. "]"
  107. }
  108. void expr(): {} {
  109. (Arguments())+ | sexpr()
  110. }
  111. void sexpr(): {}{
  112. (<PLUS> | <MINUS> | <STAR> | <EQUAL> | <BACKSLASH> | <GREATER_THAN> | <GREATER_EQUALS> | <LESS_THAN> | <LESS_EQUALS>)
  113. (Arguments())
  114. (Arguments())+
  115. }
  116.  
  117. void FunctionName() : {} {
  118. { System.out.println("functionname"); }
  119. <IDENTIFIER>
  120. }
  121. void FuncReturn() : {} {
  122. {System.out.println("functionret"); }
  123. <RETURN>
  124. expr()
  125. }
  126. void FuncArguments() : {} {
  127. { System.out.println("func_arguments"); }
  128. (<IDENTIFIER> | (<NUMBER>))
  129. }
  130. void Arguments() : {} {
  131. { System.out.println("arguments"); }
  132. (<IDENTIFIER> | (<NUMBER>))
  133. }
  134.  
  135. TOKEN : {
  136. <BEGIN_PROGRAM : ("<PROGRAM>")>
  137. | <END_PROGRAM : ("</PROGRAM>")>
  138. //reserved
  139. |<RETURN: "return">
  140. |<COND: "cond">
  141. |<PRINT: "print">
  142. |<IF: "if">
  143. |<DO: "do">
  144. //tokens
  145. | <IDENTIFIER : (<LETTER> | "_") (<LETTER> | <DIGIT> | "_")*>
  146. { debugStream.println("IDENTIFIER token: " + matchedToken.image); }
  147. | <STRING : ("\"") (~["\n", "\r"])* ("\"")>
  148. { debugStream.println("STRING token: " + matchedToken.image); }
  149. | <NUMBER : (<INT_DECIMAL> | <INT_OCTAL> | <INT_HEXADECIMAL>)>
  150. { debugStream.println("NUMBER token: " + matchedToken.image); }
  151. | <FLOATING_POINT : (<DIGIT>)+<DOT>(<FLOATFRAC>)? (<FLOATEXP>)? | <DOT><FLOATFRAC>(<FLOATEXP>)? | (<DIGIT>)+<FLOATEXP> >
  152. { debugStream.println("FLOATING_POINT token: " + matchedToken.image); }
  153. | <#FLOATFRAC : (<DIGIT>)+>
  154. | <#FLOATEXP : ["E"](["+" , "-"])?(<DIGIT>)+>
  155. | <#DIGIT : ["0"-"9"]>
  156. | <#INT_DECIMAL : ["1"-"9"] (<DIGIT>)*>
  157. | <#INT_OCTAL : ["0"](["0"-"7"])*>
  158. | <#INT_HEXADECIMAL : ["0"]["x"](<DIGIT>|["a"-"f"]|["A"-"F"])*>
  159. | <#LETTER : <UPPER_LETTER> | <LOWER_LETTER>>
  160. | <#UPPER_LETTER : ["A"-"Z"]>
  161. | <#LOWER_LETTER : ["a"-"z"]>
  162. | <#SLASH : ["/"]>
  163.  
  164. //begin special symbols
  165. |<DOT : ".">
  166. |<PLUS:"+">
  167. |<MINUS:"-">
  168. |<STAR:"*">
  169. |<EQUAL:"=">
  170. |<SEMICOLON:";">
  171. |<COLON:":">
  172. |<EQUALS:"==">
  173. |<NOT_EQUALS:"!=">
  174. |<LESS_THAN:"<">
  175. |<LESS_EQUALS:"<=">
  176. |<GREATER_EQUALS:">=">
  177. |<GREATER_THAN:">">
  178. |<BACKSLASH:"/">
  179. |<LEFT_BRACE : "{">
  180. |<RIGHT_BRACE : "}">
  181.  
  182. //error handling
  183. |<ERROR : ~["\r", "\n"]>
  184. }
  185.  
  186. //error handling
  187. JAVACODE
  188. String handleError(Token token) {
  189. System.out.println("*** ERRORL Line " + token.beginLine + " after \"" + token.image + "\"");
  190.  
  191. Token t;
  192.  
  193. do {
  194. t = getNextToken();
  195. } while (t.kind != EOL);
  196.  
  197. // remove partially built AST node
  198. jjtree.popNode();
  199. return t.image;
  200. }
Add Comment
Please, Sign In to add comment