Guest User

Untitled

a guest
Jul 17th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.59 KB | None | 0 0
  1. ## HarveyParser.jj
  2.  
  3. options {
  4. DEBUG_LOOKAHEAD = false;
  5. DEBUG_PARSER = false;
  6. }
  7.  
  8. PARSER_BEGIN(HarveyParser)
  9. import java.io.*;
  10. public class HarveyParser {
  11. public static void main(String[] args) {
  12. FileReader sr = null;
  13. try {
  14. sr = new FileReader(args[0]);
  15. } catch (Exception e) {}
  16.  
  17. HarveyParser p = new HarveyParser(sr);
  18.  
  19. try {
  20. //p.Program();
  21. SimpleNode node = p.Program();
  22. // dump is the AST printer
  23. node.dump(">");
  24. } catch (Exception e) {}
  25.  
  26. }
  27. }
  28. PARSER_END(HarveyParser)
  29.  
  30. SKIP : {
  31. <IGNORE : ["(", ")", " ", ",", "\n", "\r", "\t"]>
  32. | <SCOMMENT : ";" (~["\n", "\r"])* ("\r" | "\n" | "\r\n")>
  33. }
  34.  
  35. SimpleNode Program() : {} {
  36. { System.out.println("program");}
  37.  
  38.  
  39. <BEGIN_PROGRAM>
  40. (
  41. try {
  42. ctrlstatement()
  43. | Statement()
  44. | FunctionDecl()
  45. | Error() { handleError(token); }
  46. }
  47. catch (ParseException ex) {
  48. handleError(ex.currentToken);
  49. }
  50. )*
  51.  
  52. <END_PROGRAM>
  53.  
  54.  
  55. { System.out.println("end program");}
  56. <EOF>
  57.  
  58. // jjtree stuff - jjtThis is the current AST node
  59. { return jjtThis; }
  60.  
  61. }
  62.  
  63. void Error() :{} {
  64. { System.out.println("error"); }
  65. <ERROR>
  66. }
  67.  
  68. void ctrlstatement() :{} {
  69. (ifstatement() | condstatement() | dostatement())
  70.  
  71. }
  72. void ifstatement() :{} {
  73. <IF>
  74. condblock()
  75. }
  76. void condstatement() :{} {
  77. <COND>
  78. (
  79. condblock()
  80. )+
  81. }
  82. void condblock() : {} {
  83. "["
  84. expr()
  85. (Statement())*
  86. "]"
  87. }
  88. void dostatement() :{} {
  89.  
  90. <DO>
  91. <IDENTIFIER>
  92. <NUMBER>
  93. expr()
  94. condblock()
  95. }
  96. void Statement() : {} {
  97. { System.out.println("statement"); }
  98. "|"
  99. (
  100. ((FunctionName() | <PRINT>) expr())
  101. |sexpr()
  102. )
  103. }
  104.  
  105. void FunctionDecl() : {} {
  106. { System.out.println("function"); }
  107. "["
  108. FunctionName()
  109. (FuncArguments())*
  110. ( Statement() )*
  111. (FuncReturn())?
  112. "]"
  113. }
  114. void expr(): {} {
  115. (Arguments())+ | sexpr()
  116. }
  117. void sexpr(): {}{
  118. (<PLUS> | <MINUS> | <STAR> | <EQUAL> | <BACKSLASH> | <GREATER_THAN> | <GREATER_EQUALS> | <LESS_THAN> | <LESS_EQUALS>)
  119. (Arguments())
  120. (Arguments())+
  121. }
  122.  
  123. void FunctionName() : {} {
  124. { System.out.println("functionname"); }
  125. <IDENTIFIER>
  126. }
  127. void FuncReturn() : {} {
  128. {System.out.println("functionret"); }
  129. <RETURN>
  130. expr()
  131. }
  132. void FuncArguments() : {} {
  133. { System.out.println("func_arguments"); }
  134. (<IDENTIFIER> | (<NUMBER>))
  135. }
  136. void Arguments() : {} {
  137. { System.out.println("arguments"); }
  138. (<IDENTIFIER> | (<NUMBER>))
  139. }
  140.  
  141. TOKEN : {
  142. <BEGIN_PROGRAM : ("<PROGRAM>")>
  143. | <END_PROGRAM : ("</PROGRAM>")>
  144. //reserved
  145. |<RETURN: "return">
  146. |<COND: "cond">
  147. |<PRINT: "print">
  148. |<IF: "if">
  149. |<DO: "do">
  150. //tokens
  151. | <IDENTIFIER : (<LETTER> | "_") (<LETTER> | <DIGIT> | "_")*>
  152. { debugStream.println("IDENTIFIER token: " + matchedToken.image); }
  153. | <STRING : ("\"") (~["\n", "\r"])* ("\"")>
  154. { debugStream.println("STRING token: " + matchedToken.image); }
  155. | <NUMBER : (<INT_DECIMAL> | <INT_OCTAL> | <INT_HEXADECIMAL>)>
  156. { debugStream.println("NUMBER token: " + matchedToken.image); }
  157. | <FLOATING_POINT : (<DIGIT>)+<DOT>(<FLOATFRAC>)? (<FLOATEXP>)? | <DOT><FLOATFRAC>(<FLOATEXP>)? | (<DIGIT>)+<FLOATEXP> >
  158. { debugStream.println("FLOATING_POINT token: " + matchedToken.image); }
  159. | <#FLOATFRAC : (<DIGIT>)+>
  160. | <#FLOATEXP : ["E"](["+" , "-"])?(<DIGIT>)+>
  161. | <#DIGIT : ["0"-"9"]>
  162. | <#INT_DECIMAL : ["1"-"9"] (<DIGIT>)*>
  163. | <#INT_OCTAL : ["0"](["0"-"7"])*>
  164. | <#INT_HEXADECIMAL : ["0"]["x"](<DIGIT>|["a"-"f"]|["A"-"F"])*>
  165. | <#LETTER : <UPPER_LETTER> | <LOWER_LETTER>>
  166. | <#UPPER_LETTER : ["A"-"Z"]>
  167. | <#LOWER_LETTER : ["a"-"z"]>
  168. | <#SLASH : ["/"]>
  169.  
  170. //begin special symbols
  171. |<DOT : ".">
  172. |<PLUS:"+">
  173. |<MINUS:"-">
  174. |<STAR:"*">
  175. |<EQUAL:"=">
  176. |<SEMICOLON:";">
  177. |<COLON:":">
  178. |<EQUALS:"==">
  179. |<NOT_EQUALS:"!=">
  180. |<LESS_THAN:"<">
  181. |<LESS_EQUALS:"<=">
  182. |<GREATER_EQUALS:">=">
  183. |<GREATER_THAN:">">
  184. |<BACKSLASH:"/">
  185. |<LEFT_BRACE : "{">
  186. |<RIGHT_BRACE : "}">
  187.  
  188. //error handling
  189. |<ERROR : ~["\r", "\n"]> { debugStream.println("ERROR token: " + matchedToken.image); }
  190. }
  191.  
  192. //error handling
  193. JAVACODE
  194. String handleError(Token token) {
  195. System.out.println("*** ERROR Line " + token.beginLine + " after \"" + token.image + "\"");
  196.  
  197. Token t;
  198.  
  199. do {
  200. t = getNextToken();
  201. } while (t.kind != EOF);
  202.  
  203. // remove partially built AST node
  204. jjtree.popNode();
  205. return t.image;
  206. }
  207.  
  208. ## test.txt
  209. <PROGRAM>
  210.  
  211. ;statements
  212. | = c 2
  213.  
  214. ;function defs
  215. [ func1 a b
  216.  
  217. return + a b
  218.  
  219. ]
  220.  
  221.  
  222. ;function calls
  223. | print + c func1 2 3
  224. | func1 b c
  225.  
  226. \fartknocker
  227.  
  228. ;if statements
  229. if [< c 2
  230. | = c 3]
  231.  
  232.  
  233. ;cond statements (acting as a switch)
  234. cond [ < c 2 ]
  235. [ >= c 3
  236. | func1 b c]
  237.  
  238.  
  239. ;do statements
  240. do d 10 (+ d 1)
  241. [>= d 15
  242. | func1 b c]
  243.  
  244.  
  245. </PROGRAM>
  246.  
  247. ##Output
  248. macbookpro13:HW7 kristen$ java HarveyParser test.txt
  249. program
  250. statement
  251. arguments
  252. IDENTIFIER token: c
  253. arguments
  254. NUMBER token: 2
  255. function
  256. functionname
  257. IDENTIFIER token: func1
  258. IDENTIFIER token: a
  259. func_arguments
  260. IDENTIFIER token: b
  261. func_arguments
  262. functionret
  263. arguments
  264. IDENTIFIER token: a
  265. arguments
  266. IDENTIFIER token: b
  267. statement
  268. arguments
  269. IDENTIFIER token: c
  270. arguments
  271. IDENTIFIER token: func1
  272. NUMBER token: 2
  273. arguments
  274. NUMBER token: 3
  275. arguments
  276. statement
  277. IDENTIFIER token: func1
  278. functionname
  279. IDENTIFIER token: b
  280. arguments
  281. IDENTIFIER token: c
  282. arguments
  283. ERROR token: \
  284. error
  285. *** ERROR Line 18 after "\"
  286. IDENTIFIER token: fartknocker
  287. IDENTIFIER token: c
  288. NUMBER token: 2
  289. IDENTIFIER token: c
  290. NUMBER token: 3
  291. IDENTIFIER token: c
  292. NUMBER token: 2
  293. IDENTIFIER token: c
  294. NUMBER token: 3
  295. IDENTIFIER token: func1
  296. IDENTIFIER token: b
  297. IDENTIFIER token: c
  298. IDENTIFIER token: d
  299. NUMBER token: 10
  300. IDENTIFIER token: d
  301. NUMBER token: 1
  302. IDENTIFIER token: d
  303. NUMBER token: 15
  304. IDENTIFIER token: func1
  305. IDENTIFIER token: b
  306. IDENTIFIER token: c
Add Comment
Please, Sign In to add comment