Advertisement
Lennnyo

Untitled

Jan 10th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.06 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. using Lexer;
  5.  
  6. namespace Parser
  7. {
  8. public class Parser
  9. {
  10. Lexer.Lexer lexer;
  11.  
  12. public Parser(string prg)
  13. {
  14. lexer = new Lexer.Lexer(prg);
  15. }
  16.  
  17. public Parser(Lexer.Lexer lexer)
  18. {
  19. this.lexer = lexer;
  20. }
  21.  
  22. public bool LookUp(Token.Type type)
  23. {
  24. if (lexer.Peek().type == type) return true;
  25. else return false;
  26. }
  27.  
  28. public bool LookUp(String s)
  29. {
  30. if (lexer.Peek().lexeme == s) return true;
  31. else return false;
  32. }
  33.  
  34. public Token GetToken()
  35. {
  36. var t = lexer.Next();
  37. return t;
  38. }
  39.  
  40. public Statement Parse()
  41. {
  42. if (LookUp(Token.Type.EOF))
  43. {
  44. GetToken();
  45. return null ;
  46. }
  47.  
  48.  
  49. var head = StmtU();
  50. var tail = StmtT();
  51. if (tail == null)
  52. {
  53. return head;
  54. }
  55. return new SequenceStatement(head, tail);
  56. }
  57.  
  58. public Statement StmtT()
  59. {
  60. if (LookUp(Token.Type.SEP) && LookUp(";"))
  61. {
  62. GetToken(); // ;
  63.                 var head = StmtU();
  64. var tail = StmtT();
  65. if (tail == null)
  66. {
  67. return head;
  68. }
  69. return new SequenceStatement(head, tail);
  70. }
  71. else
  72. {
  73. return null;
  74. }
  75. }
  76.  
  77.  
  78. public Statement StmtU()
  79. {
  80. if (LookUp(Token.Type.ID))
  81. {
  82. var asn = Asn();
  83. return asn;
  84. }
  85. else if (LookUp(Token.Type.KEYW))
  86. {
  87. var pr = Print();
  88. return pr;
  89. }
  90. else
  91. {
  92. var t = GetToken();
  93. throw new Exception("Expected ID or print: " + t.type + " " + t.lexeme + " c: " + t.column + " l: " + t.line);
  94. }
  95. }
  96.  
  97. public AssignmentStatement Asn()
  98. {
  99. var id = GetToken().lexeme;
  100. GetToken(); // :=
  101. var expr = ExprE();
  102. return new AssignmentStatement(id, expr);
  103. }
  104.  
  105. public PrintStatement Print()
  106. {
  107. GetToken();             // print
  108.             GetToken();             // (
  109.             var exprList = ExprL();
  110. GetToken();             // )
  111.             return new PrintStatement(exprList);
  112. }
  113.  
  114. public Expression ExprE()
  115. {
  116. if (LookUp(Token.Type.ID) || LookUp(Token.Type.NUM) || LookUp(Token.Type.SEP))
  117. {
  118. var g = ExprG();
  119. var f = ExprF();
  120.  
  121. if (f == null)
  122. {
  123. return g;
  124. }
  125. else
  126. {
  127. return new BinaryOperatorExpression(BinaryOperatorExpression.Type.ADD, g, f);
  128. }
  129.  
  130. }
  131. var t = GetToken();
  132. throw new Exception("Ex ID, num or LetExpression: " + t.type + " " + t.lexeme + " c: " + t.column + " l: " + t.line);
  133. }
  134.  
  135. public Expression ExprF()
  136. {
  137. if (LookUp(Token.Type.OP) && LookUp("+"))
  138. {
  139. GetToken(); // +
  140. var g = ExprG();
  141. var f = ExprF();
  142.  
  143. if (f == null)
  144. {
  145. return g;
  146. }
  147. else
  148. {
  149. return new BinaryOperatorExpression(BinaryOperatorExpression.Type.ADD, g, f);
  150. }
  151. }
  152. else return null;
  153. }
  154.  
  155. public Expression ExprG()
  156. {
  157. if (LookUp(Token.Type.ID))
  158. {
  159. return Ident();
  160. }
  161. else if (LookUp(Token.Type.NUM))
  162. {
  163. return Num();
  164. }
  165. else if (LookUp(Token.Type.SEP))
  166. {
  167. return LE();
  168. }
  169. var t = GetToken();
  170. throw new Exception("Expected ID, num or LetExpression: " + t.type + " " + t.lexeme + " c: " + t.column + " l: " + t.line);
  171.  
  172. }
  173.  
  174. public IdentifierExpression Ident()
  175. {
  176. var id = GetToken().lexeme;
  177. return new IdentifierExpression(id);
  178. }
  179.  
  180. public NumberExpression Num()
  181. {
  182. var n = GetToken().lexeme;
  183. return new NumberExpression(n);
  184. }
  185.  
  186. public LetExpression LE()
  187. {
  188. GetToken();             // (
  189.             var st = Parse();
  190.  
  191. GetToken();             // ,
  192.             var ex = ExprE();
  193.  
  194. GetToken(); // )
  195.  
  196.  
  197. return new LetExpression(st, ex);
  198. }
  199.  
  200.  
  201.  
  202. public LinkedList<Expression> ExprL()
  203. {
  204. var head = ExprE();
  205. var tail = ExprM();
  206. if (tail == null)
  207. {
  208. var list = new LinkedList<Expression>();
  209. list.AddFirst(head);
  210. return list;
  211. }
  212. tail.AddFirst(head);
  213. return tail;
  214. }
  215.  
  216. public LinkedList<Expression> ExprM()
  217. {
  218. if (LookUp(","))
  219. {
  220. GetToken(); // ,
  221. var head = ExprE();
  222.  
  223. var tail = ExprM();
  224. if (tail == null)
  225. {
  226. var list = new LinkedList<Expression>();
  227. list.AddFirst(head);
  228. return list;
  229. }
  230. tail.AddFirst(head);
  231. return tail;
  232. }
  233. else
  234. {
  235. return null;
  236. }
  237. }
  238. }
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement