Advertisement
Guest User

parser

a guest
Nov 26th, 2014
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.97 KB | None | 0 0
  1.  
  2.  
  3. /**
  4.  * En rekursiv medåknings-parser för aritmetiska uttryck
  5.  */
  6. public class Parser {
  7.     private Lexer lexer;
  8.     private int currentLine;
  9.     private int lastInsLine;
  10.  
  11.     public Parser(Lexer lexer) {
  12.         this.lexer = lexer;
  13.         currentLine = 1;
  14.         lastInsLine = 1;
  15.     }
  16.  
  17.     public ParseTree parse() throws SyntaxError {
  18.         // Startsymbol är start
  19.         ParseTree result = start();
  20.         // Borde inte finnas något kvar av indata när vi parsat ett uttryck
  21.         if (lexer.nextToken().getType() != TokenType.EOF) {
  22.             throw new SyntaxError(currentLine);
  23.         }
  24.         return result;
  25.     }
  26.  
  27.     private ParseTree start() throws SyntaxError {
  28.         maybespace();
  29.         ParseTree result = null;
  30.         if (isInstruction(lexer.peekToken().getType())) {  
  31.             lastInsLine = currentLine;
  32.             result = instructionlist();
  33.         }
  34.         return result;
  35.     }
  36.  
  37.     private void maybespace() throws SyntaxError {
  38.         TokenType peek = lexer.peekToken().getType();
  39.         while (peek == TokenType.WHITESPACE || peek == TokenType.NL || peek == TokenType.COMMENT) {
  40.             if (peek == TokenType.NL)
  41.                 currentLine++;
  42.             lexer.nextToken();
  43.             peek = lexer.peekToken().getType();
  44.         }
  45.     }
  46.  
  47.     private void space() throws SyntaxError {
  48.         TokenType peek = lexer.peekToken().getType();
  49.         if (peek == TokenType.WHITESPACE || peek == TokenType.NL || peek == TokenType.COMMENT) {
  50.             if(peek == TokenType.NL)
  51.                 currentLine++;
  52.             lexer.nextToken();
  53.             maybespace();
  54.         }
  55.         else
  56.             throw new SyntaxError(lastInsLine);
  57.     }
  58.  
  59.     private ParseTree instruction() throws SyntaxError {
  60.         Token t = lexer.nextToken();
  61.         TokenType nextToken;
  62.         ParseTree result = null;
  63.         switch (t.getType()) {
  64.  
  65.         case MOVE:
  66.             lastInsLine = currentLine;
  67.             space();
  68.             nextToken = lexer.peekToken().getType();
  69.             if (nextToken != TokenType.NUM) {
  70.                 if (isCode(nextToken))
  71.                     lastInsLine = currentLine;
  72.                 throw new SyntaxError(lastInsLine);
  73.             }
  74.             lastInsLine = currentLine;
  75.             Integer steps = (Integer) lexer.nextToken().getData();
  76.             Integer forwOrBack = (Integer) t.getData();
  77.             result = new Move(steps*forwOrBack);
  78.             maybespace();
  79.             nextToken = lexer.nextToken().getType();
  80.             if (nextToken != TokenType.DOT) {
  81.                 if (isCode(nextToken))
  82.                     lastInsLine = currentLine;
  83.                 throw new SyntaxError(lastInsLine);
  84.             }
  85.             lastInsLine = currentLine;
  86.             break;
  87.  
  88.         case TURN:
  89.             lastInsLine = currentLine;
  90.             space();
  91.             nextToken = lexer.peekToken().getType();
  92.             if (nextToken != TokenType.NUM) {
  93.                 if (isCode(nextToken))
  94.                     lastInsLine = currentLine;
  95.                 throw new SyntaxError(lastInsLine);
  96.             }
  97.             lastInsLine = currentLine;
  98.             Integer degrees = (Integer) lexer.nextToken().getData();
  99.             Integer leftOrRight = (Integer) t.getData();
  100.             result = new Turn(degrees*leftOrRight);
  101.             maybespace();
  102.             nextToken = lexer.nextToken().getType();
  103.             if (nextToken != TokenType.DOT) {
  104.                 if (isCode(nextToken))
  105.                     lastInsLine = currentLine;
  106.                 throw new SyntaxError(lastInsLine);
  107.             }
  108.             lastInsLine = currentLine;
  109.             break;
  110.  
  111.         case PEN:
  112.             lastInsLine = currentLine;
  113.             int upOrDown = (Integer) t.getData();
  114.             result = new Pen(upOrDown);
  115.             maybespace();
  116.             nextToken = lexer.nextToken().getType();
  117.             if (nextToken != TokenType.DOT) {
  118.                 if (isCode(nextToken))
  119.                     lastInsLine = currentLine;
  120.                 throw new SyntaxError(lastInsLine);
  121.             }
  122.             lastInsLine = currentLine;
  123.             break;
  124.  
  125.         case COLOR:
  126.             lastInsLine = currentLine;
  127.             space();
  128.             nextToken = lexer.peekToken().getType();
  129.             if (nextToken != TokenType.HEX) {
  130.                 if (isCode(nextToken))
  131.                     lastInsLine = currentLine;
  132.                 throw new SyntaxError(lastInsLine);
  133.             }
  134.             lastInsLine = currentLine;
  135.             String hex = (String) lexer.nextToken().getData();
  136.             result = new Color(hex);
  137.             maybespace();
  138.             nextToken = lexer.nextToken().getType();
  139.             if (nextToken != TokenType.DOT) {
  140.                 if (isCode(nextToken))
  141.                     lastInsLine = currentLine;
  142.                 throw new SyntaxError(lastInsLine);
  143.             }
  144.             lastInsLine = currentLine;
  145.             break;
  146.  
  147.         case REP:          
  148.             lastInsLine = currentLine;
  149.             space();
  150.             nextToken = lexer.peekToken().getType();
  151.             if (nextToken != TokenType.NUM) {
  152.                 if (isCode(nextToken))
  153.                     lastInsLine = currentLine;
  154.                 throw new SyntaxError(lastInsLine);
  155.             }
  156.             lastInsLine = currentLine;
  157.             Integer repeat = (Integer) lexer.nextToken().getData();
  158.             space();
  159.            
  160.             nextToken = lexer.peekToken().getType();
  161.             if (nextToken != TokenType.QUOTATION) {
  162.                 if (isInstruction(nextToken)) {
  163.                     lastInsLine = currentLine;
  164.                     result = new Rep(repeat, instruction());                   
  165.                 }
  166.                 else
  167.                     throw new SyntaxError(lastInsLine);
  168.             }
  169.             else if (nextToken == TokenType.QUOTATION) {
  170.                 lastInsLine = currentLine;
  171.                 lexer.nextToken();
  172.                 maybespace();
  173.                
  174.                 result = instruction();
  175.                 maybespace();
  176.                
  177.                 if (isInstruction(lexer.peekToken().getType())) {
  178.                     lastInsLine = currentLine;
  179.                     result = new Branch(result, instructionlist());
  180.                 }
  181.                
  182.                 result = new Rep(repeat, result);
  183.                
  184.                 maybespace();
  185.                
  186.                 if (lexer.nextToken().getType() != TokenType.QUOTATION)
  187.                     throw new SyntaxError(lastInsLine);
  188.                 lastInsLine = currentLine;
  189.             }
  190.             break;
  191.            
  192.         default:
  193.             throw new SyntaxError(lastInsLine);
  194.         }
  195.  
  196.         return result;
  197.     }
  198.  
  199.     private ParseTree instructionlist() throws SyntaxError {
  200.         ParseTree result = null;
  201.         TokenType peek = lexer.peekToken().getType();
  202.  
  203.         if (isInstruction(peek)) {
  204.             result = instruction();
  205.             maybespace();
  206.  
  207.             TokenType next = lexer.peekToken().getType();
  208.  
  209.             if (isInstruction(next)){
  210.                 lastInsLine = currentLine;
  211.                 result = new Branch(result, instructionlist());
  212.             }
  213.         }
  214.         return result;
  215.     }
  216.  
  217.     private boolean isInstruction(TokenType t) {
  218.         if (t == TokenType.MOVE || t == TokenType.TURN || t == TokenType.PEN
  219.                 || t == TokenType.COLOR || t == TokenType.REP)
  220.             return true;
  221.         return false;
  222.     }
  223.    
  224.     private boolean isCode(TokenType t) {
  225.         if(isInstruction(t) || t == TokenType.NUM || t == TokenType.HEX || t == TokenType.QUOTATION || t == TokenType.DOT)
  226.             return true;
  227.         return false;
  228.     }
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement