DavidNorgren

Untitled

Jan 11th, 2016
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.21 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows.Forms;
  7.  
  8. namespace lab3 {
  9.  
  10.     /* PARSER */
  11.  
  12.     class Parser {
  13.         LexicalAnalyzer l;
  14.         public ASTstmtList ast;
  15.  
  16.         public Parser(LexicalAnalyzer l) {
  17.             this.l = l;
  18.             ast = stmtList();
  19.         }
  20.  
  21.         public TreeNode createTree() {
  22.             return ast.createTree();
  23.         }
  24.  
  25.         ASTstmtList stmtList() {
  26.             ASTstmtList sl = new ASTstmtList(l.lastPeekedLine);
  27.  
  28.             while (true) {
  29.                 TokenType t = l.peek();
  30.  
  31.                 switch (t) {
  32.                     case TokenType.VOID:
  33.                     case TokenType.INT:
  34.                     case TokenType.ID:
  35.                     case TokenType.NUM:
  36.                     case TokenType.LPAR:
  37.                     case TokenType.RETURN:
  38.                     case TokenType.WRITE:
  39.                     case TokenType.READ:
  40.                     case TokenType.IF:
  41.                     case TokenType.WHILE:
  42.                     case TokenType.LBRACE: // stmt stmt_list
  43.                         sl.list.Add(stmt());
  44.                         break;
  45.  
  46.                     default:
  47.                         return sl;
  48.                 }
  49.             }
  50.         }
  51.  
  52.         ASTstmt stmt() {
  53.             switch (l.peek()) {
  54.                 case TokenType.VOID:
  55.                 case TokenType.INT: { // type ID decl_opt
  56.                     Token t = l.eat(l.lastPeeked);
  57.                     Token i = l.eat(TokenType.ID);
  58.                     return declOpt(t, i);
  59.                 }
  60.  
  61.                 case TokenType.NUM:
  62.                 case TokenType.ID:
  63.                 case TokenType.LPAR: { // expr SEMI
  64.                     ASTstmt s = new ASTstmt(expr(), l.lastPeekedLine);
  65.                     l.eat(TokenType.SEMI);
  66.                     return s;
  67.                 }
  68.  
  69.                 case TokenType.RETURN: { // RETURN return_opt SEMI
  70.                     l.eat(TokenType.RETURN);
  71.                     TokenType p = l.peek();
  72.                     ASTexpr e = null;
  73.                     if (p == TokenType.NUM || p == TokenType.ID || p == TokenType.LPAR)
  74.                         e = expr();
  75.                     ASTstmt s = new ASTstmtReturn(e, l.lastPeekedLine);
  76.                     l.eat(TokenType.SEMI);
  77.                     return s;
  78.                 }
  79.  
  80.                 case TokenType.WRITE: { // WRITE expr SEMI
  81.                     l.eat(TokenType.WRITE);
  82.                     ASTstmt s = new ASTstmtWrite(expr(), l.lastPeekedLine);
  83.                     l.eat(TokenType.SEMI);
  84.                     return s;
  85.                 }
  86.  
  87.  
  88.                 case TokenType.READ: { // READ expr SEMI
  89.                     l.eat(TokenType.READ);
  90.                     ASTstmt s = new ASTstmtRead(expr(), l.lastPeekedLine);
  91.                     l.eat(TokenType.SEMI);
  92.                     return s;
  93.                 }
  94.  
  95.                 case TokenType.IF:  { // IF LPAR expr RPAR stmt else_opt
  96.                     l.eat(TokenType.IF);
  97.                     l.eat(TokenType.LPAR);
  98.                     ASTexpr e = expr();
  99.                     l.eat(TokenType.RPAR);
  100.                     ASTstmt s = stmt();
  101.                     ASTstmt es = null;
  102.                     if (l.peek() == TokenType.ELSE) {
  103.                         l.eat(TokenType.ELSE);
  104.                         es = stmt();
  105.                     }
  106.                     return new ASTstmtIf(e, s, es, l.lastPeekedLine);
  107.                 }
  108.  
  109.                 case TokenType.WHILE: { // WHILE LPAR expr RPAR stmt
  110.                     l.eat(TokenType.WHILE);
  111.                     l.eat(TokenType.LPAR);
  112.                     ASTexpr e = expr();
  113.                     l.eat(TokenType.RPAR);
  114.                     ASTstmt s = stmt();
  115.                     ASTstmtWhile w = new ASTstmtWhile(e, s, l.lastPeekedLine);
  116.                     return w;
  117.                 }
  118.  
  119.                 case TokenType.LBRACE: { // LBRACE stmt_list RBRACE
  120.                     l.eat(TokenType.LBRACE);
  121.                     ASTstmtList sl = stmtList();
  122.                     l.eat(TokenType.RBRACE);
  123.                     return sl;
  124.                 }
  125.  
  126.             }
  127.  
  128.             l.eat(TokenType.ERROR);
  129.             return null;
  130.         }
  131.  
  132.         ASTstmt declOpt(Token type, Token id) {
  133.             switch (l.peek()) {
  134.                 case TokenType.ASSOP: { // ASSOP expr SEMI
  135.                     l.eat(TokenType.ASSOP);
  136.                     ASTexpr e = expr();
  137.                     ASTstmtVarDecl s = new ASTstmtVarDecl(type.type, new ASTid(id.attr, l.lastPeekedLine), e, l.lastPeekedLine);
  138.                     l.eat(TokenType.SEMI);
  139.                     return s;
  140.                 }
  141.  
  142.                 case TokenType.SEMI: { // SEMI
  143.                     ASTstmtVarDecl s = new ASTstmtVarDecl(type.type, new ASTid(id.attr, l.lastPeekedLine), null, l.lastPeekedLine);
  144.                     l.eat(TokenType.SEMI);
  145.                     return s;
  146.                 }
  147.  
  148.                 case TokenType.LPAR:  { // LPAR par_list RPAR LBRACE stmt_list RBRACE
  149.                     l.eat(TokenType.LPAR);
  150.                     ASTparList pl = parList();
  151.                     l.eat(TokenType.RPAR);
  152.                     l.eat(TokenType.LBRACE);
  153.                     ASTstmtList sl = stmtList();
  154.                     l.eat(TokenType.RBRACE);
  155.                     ASTstmtFuncDecl s = new ASTstmtFuncDecl(type.type, new ASTid(id.attr, l.lastPeekedLine), pl, sl, l.lastPeekedLine);
  156.                     return s;
  157.                 }
  158.             }
  159.  
  160.             l.eat(TokenType.ERROR);
  161.             return null;
  162.         }
  163.  
  164.         ASTparList parList() {
  165.             ASTparList pl = new ASTparList(l.lastPeekedLine);
  166.             while (true) { // par par_list_opt
  167.                 switch (l.peek()) {
  168.                     case TokenType.VOID: // VOID
  169.                         l.eat(TokenType.VOID);
  170.                         break;
  171.  
  172.                     case TokenType.INT: // INT ID
  173.                         l.eat(TokenType.INT);
  174.                         Token i = l.eat(TokenType.ID);
  175.                         pl.list.Add(new ASTpar(TokenType.INT, new ASTid(i.attr, l.lastPeekedLine), l.lastPeekedLine));
  176.                         break;
  177.  
  178.                     case TokenType.RPAR:
  179.                         break;
  180.  
  181.                     default:
  182.                         l.eat(TokenType.ERROR);
  183.                         break;
  184.                        
  185.                 }
  186.  
  187.                 if (l.peek() == TokenType.COMMA)
  188.                     l.eat(TokenType.COMMA);
  189.                 else
  190.                     break;
  191.             }
  192.  
  193.             return pl;
  194.  
  195.         }
  196.  
  197.         ASTargList argList() {
  198.             ASTargList al = new ASTargList(l.lastPeekedLine);
  199.             while (true) { // expr arg_list_opt
  200.                 switch (l.peek()) {
  201.                     case TokenType.NUM:
  202.                     case TokenType.ID:
  203.                     case TokenType.LPAR:
  204.                         al.list.Add(expr());
  205.                         break;
  206.                 }
  207.  
  208.                 if (l.peek() == TokenType.COMMA)
  209.                     l.eat(TokenType.COMMA);
  210.                 else
  211.                     break;
  212.             }
  213.  
  214.             return al;
  215.         }
  216.  
  217.         ASTexpr expr() {
  218.             return exprAss();
  219.         }
  220.  
  221.         ASTexpr exprAss() {
  222.             ASTexpr e = exprEq();
  223.             if (l.peek() == TokenType.ASSOP) {
  224.                 l.eat(l.lastPeeked);
  225.                 return new ASTexpr(l.lastPeeked, e, exprAss(), l.lastPeekedLine);
  226.             }
  227.             return e;
  228.         }
  229.  
  230.         ASTexpr exprEq() {
  231.             ASTexpr e = exprComp();
  232.             if (l.peek() == TokenType.EQOP) {
  233.                 l.eat(l.lastPeeked);
  234.                 return new ASTexpr(l.lastPeeked, e, exprEq(), l.lastPeekedLine);
  235.             }
  236.             return e;
  237.         }
  238.  
  239.         ASTexpr exprComp() {
  240.             ASTexpr e = exprAddSub();
  241.             if (l.peek() == TokenType.LTOP || l.peek() == TokenType.LEOP) {
  242.                 l.eat(l.lastPeeked);
  243.                 return new ASTexpr(l.lastPeeked, e, exprComp(), l.lastPeekedLine);
  244.             }
  245.             return e;
  246.         }
  247.  
  248.         ASTexpr exprAddSub() {
  249.             ASTexpr e = exprMulDiv();
  250.             if (l.peek() == TokenType.ADDOP || l.peek() == TokenType.SUBOP) {
  251.                 l.eat(l.lastPeeked);
  252.                 return new ASTexpr(l.lastPeeked, e, exprAddSub(), l.lastPeekedLine);
  253.             }
  254.             return e;
  255.         }
  256.  
  257.         ASTexpr exprMulDiv() {
  258.             ASTexpr e = exprNot();
  259.             if (l.peek() == TokenType.MULOP || l.peek() == TokenType.DIVOP) {
  260.                 l.eat(l.lastPeeked);
  261.                 return new ASTexpr(l.lastPeeked, e, exprMulDiv(), l.lastPeekedLine);
  262.             }
  263.             return e;
  264.         }
  265.  
  266.         ASTexpr exprNot() {
  267.             if (l.peek() == TokenType.NOTOP) {
  268.                 l.eat(l.lastPeeked);
  269.                 return new ASTexpr(l.lastPeeked, null, exprValue(), l.lastPeekedLine);
  270.             }
  271.             return exprValue();
  272.         }
  273.  
  274.         ASTexpr exprValue() {
  275.             TokenType t = l.peek();
  276.             switch (l.peek()) {
  277.                 case TokenType.NUM: // NUM
  278.                     Token n = l.eat(TokenType.NUM);
  279.                     return new ASTexprValue(new ASTint(Convert.ToInt32(n.attr), l.lastPeekedLine), l.lastPeekedLine);
  280.  
  281.                 case TokenType.ID: // ID call_opt
  282.                     Token i = l.eat(TokenType.ID);
  283.                     if (l.peek() == TokenType.LPAR) {
  284.                         l.eat(TokenType.LPAR);
  285.                         ASTexprCall c = new ASTexprCall(new ASTid(i.attr, l.lastPeekedLine), argList(), l.lastPeekedLine);
  286.                         l.eat(TokenType.RPAR);
  287.                         return c;
  288.                     }
  289.                     return new ASTexprValue(new ASTid(i.attr, l.lastPeekedLine), l.lastPeekedLine);
  290.  
  291.                 case TokenType.LPAR: // LPAR expr RPAR
  292.                     l.eat(TokenType.LPAR);
  293.                     ASTexpr e = expr();
  294.                     l.eat(TokenType.RPAR);
  295.                     return e;
  296.             }
  297.  
  298.             l.eat(TokenType.ERROR);
  299.             return null;
  300.         }
  301.     }
  302. }
Advertisement
Add Comment
Please, Sign In to add comment