parser.java

来自「有关编译器的编译器.」· Java 代码 · 共 2,776 行 · 第 1/5 页

JAVA
2,776
字号
/* This file was generated by SableCC (http://www.sablecc.org/). */package org.sablecc.sablecc.parser;import org.sablecc.sablecc.lexer.*;import org.sablecc.sablecc.node.*;import org.sablecc.sablecc.analysis.*;import java.util.*;import java.io.DataInputStream;import java.io.BufferedInputStream;import java.io.IOException;public class Parser{  public final Analysis ignoredTokens = new AnalysisAdapter();  protected Node node;  private final Lexer lexer;  private final ListIterator stack = new LinkedList().listIterator();  private int last_shift;  private int last_pos;  private int last_line;  private Token last_token;  private final TokenIndex converter = new TokenIndex();  private final int[] action = new int[2];  private final static int SHIFT = 0;  private final static int REDUCE = 1;  private final static int ACCEPT = 2;  private final static int ERROR = 3;  protected void filter() throws ParserException, LexerException, IOException    {}  public Parser(Lexer lexer)  {    this.lexer = lexer;    if(actionTable == null)    {      try      {        DataInputStream s = new DataInputStream(                              new BufferedInputStream(                                Parser.class.getResourceAsStream("parser.dat")));        // read actionTable        int length = s.readInt();        actionTable = new int[length][][];        for(int i = 0; i < actionTable.length; i++)        {          length = s.readInt();          actionTable[i] = new int[length][3];          for(int j = 0; j < actionTable[i].length; j++)          {            for(int k = 0; k < 3; k++)            {              actionTable[i][j][k] = s.readInt();            }          }        }        // read gotoTable        length = s.readInt();        gotoTable = new int[length][][];        for(int i = 0; i < gotoTable.length; i++)        {          length = s.readInt();          gotoTable[i] = new int[length][2];          for(int j = 0; j < gotoTable[i].length; j++)          {            for(int k = 0; k < 2; k++)            {              gotoTable[i][j][k] = s.readInt();            }          }        }        // read errorMessages        length = s.readInt();        errorMessages = new String[length];        for(int i = 0; i < errorMessages.length; i++)        {          length = s.readInt();          StringBuffer buffer = new StringBuffer();          for(int j = 0; j < length; j++)          {            buffer.append(s.readChar());          }          errorMessages[i] = buffer.toString();        }        // read errors        length = s.readInt();        errors = new int[length];        for(int i = 0; i < errors.length; i++)        {          errors[i] = s.readInt();        }        s.close();      }      catch(Exception e)      {        throw new RuntimeException("The file \"parser.dat\" is either missing or corrupted.");      }    }  }  private int goTo(int index)  {    int state = state();    int low = 1;    int high = gotoTable[index].length - 1;    int value = gotoTable[index][0][1];    while(low <= high)    {      int middle = (low + high) / 2;      if(state < gotoTable[index][middle][0])      {        high = middle - 1;      }      else if(state > gotoTable[index][middle][0])      {        low = middle + 1;      }      else      {        value = gotoTable[index][middle][1];        break;      }    }    return value;  }  private void push(int state, Node node, boolean filter) throws ParserException, LexerException, IOException  {    this.node = node;    if(filter)    {      filter();    }    if(!stack.hasNext())    {      stack.add(new State(state, this.node));      return;    }    State s = (State) stack.next();    s.state = state;    s.node = this.node;  }  private int state()  {    State s = (State) stack.previous();    stack.next();    return s.state;  }  private Node pop()  {    return (Node) ((State) stack.previous()).node;  }  private int index(Switchable token)  {    converter.index = -1;    token.apply(converter);    return converter.index;  }  public Start parse() throws ParserException, LexerException, IOException  {    push(0, null, false);    List ign = null;    while(true)    {      while(index(lexer.peek()) == -1)      {        if(ign == null)        {          ign = new TypedLinkedList(NodeCast.instance);        }        ign.add(lexer.next());      }      if(ign != null)      {        ignoredTokens.setIn(lexer.peek(), ign);        ign = null;      }      last_pos = lexer.peek().getPos();      last_line = lexer.peek().getLine();      last_token = lexer.peek();      int index = index(lexer.peek());      action[0] = actionTable[state()][0][1];      action[1] = actionTable[state()][0][2];      int low = 1;      int high = actionTable[state()].length - 1;      while(low <= high)      {        int middle = (low + high) / 2;        if(index < actionTable[state()][middle][0])        {          high = middle - 1;        }        else if(index > actionTable[state()][middle][0])        {          low = middle + 1;        }        else        {          action[0] = actionTable[state()][middle][1];          action[1] = actionTable[state()][middle][2];          break;        }      }      switch(action[0])      {      case SHIFT:        push(action[1], lexer.next(), true);        last_shift = action[1];        break;      case REDUCE:        switch(action[1])        {        case 0:          {            Node node = new0();            push(goTo(0), node, true);          }          break;        case 1:          {            Node node = new1();            push(goTo(0), node, true);          }          break;        case 2:          {            Node node = new2();            push(goTo(0), node, true);          }          break;        case 3:          {            Node node = new3();            push(goTo(0), node, true);          }          break;        case 4:          {            Node node = new4();            push(goTo(0), node, true);          }          break;        case 5:          {            Node node = new5();            push(goTo(0), node, true);          }          break;        case 6:          {            Node node = new6();            push(goTo(0), node, true);          }          break;        case 7:          {            Node node = new7();            push(goTo(0), node, true);          }          break;        case 8:          {            Node node = new8();            push(goTo(0), node, true);          }          break;        case 9:          {            Node node = new9();            push(goTo(0), node, true);          }          break;        case 10:          {            Node node = new10();            push(goTo(0), node, true);          }          break;        case 11:          {            Node node = new11();            push(goTo(0), node, true);          }          break;        case 12:          {            Node node = new12();            push(goTo(0), node, true);          }          break;        case 13:          {            Node node = new13();            push(goTo(0), node, true);          }          break;        case 14:          {            Node node = new14();            push(goTo(0), node, true);          }          break;        case 15:          {            Node node = new15();            push(goTo(0), node, true);          }          break;        case 16:          {            Node node = new16();            push(goTo(0), node, true);          }          break;        case 17:          {            Node node = new17();            push(goTo(0), node, true);          }          break;        case 18:          {            Node node = new18();            push(goTo(0), node, true);          }          break;        case 19:          {            Node node = new19();            push(goTo(0), node, true);          }          break;        case 20:          {            Node node = new20();            push(goTo(0), node, true);          }          break;        case 21:          {            Node node = new21();            push(goTo(0), node, true);          }          break;        case 22:          {            Node node = new22();            push(goTo(0), node, true);          }          break;        case 23:          {            Node node = new23();            push(goTo(0), node, true);          }          break;        case 24:          {            Node node = new24();            push(goTo(0), node, true);          }          break;        case 25:          {            Node node = new25();            push(goTo(0), node, true);          }          break;        case 26:          {            Node node = new26();            push(goTo(0), node, true);          }          break;        case 27:          {            Node node = new27();            push(goTo(0), node, true);          }          break;        case 28:          {            Node node = new28();            push(goTo(0), node, true);          }          break;        case 29:          {            Node node = new29();            push(goTo(0), node, true);          }          break;        case 30:          {            Node node = new30();            push(goTo(0), node, true);          }          break;        case 31:          {            Node node = new31();            push(goTo(0), node, true);          }          break;        case 32:          {            Node node = new32();            push(goTo(0), node, true);          }          break;        case 33:          {            Node node = new33();            push(goTo(0), node, true);          }          break;        case 34:          {            Node node = new34();            push(goTo(0), node, true);          }          break;        case 35:          {            Node node = new35();            push(goTo(0), node, true);          }          break;        case 36:          {            Node node = new36();            push(goTo(0), node, true);          }          break;        case 37:          {            Node node = new37();            push(goTo(0), node, true);          }          break;        case 38:          {            Node node = new38();            push(goTo(0), node, true);          }          break;        case 39:          {            Node node = new39();            push(goTo(0), node, true);          }          break;        case 40:          {            Node node = new40();            push(goTo(0), node, true);          }          break;        case 41:          {            Node node = new41();            push(goTo(0), node, true);          }          break;        case 42:          {            Node node = new42();            push(goTo(0), node, true);          }          break;        case 43:          {            Node node = new43();            push(goTo(0), node, true);          }          break;        case 44:          {            Node node = new44();            push(goTo(0), node, true);          }          break;        case 45:          {            Node node = new45();            push(goTo(0), node, true);          }          break;        case 46:          {            Node node = new46();            push(goTo(0), node, true);          }          break;        case 47:          {            Node node = new47();            push(goTo(0), node, true);          }          break;        case 48:          {            Node node = new48();            push(goTo(0), node, true);          }          break;        case 49:          {            Node node = new49();            push(goTo(0), node, true);          }          break;        case 50:          {            Node node = new50();            push(goTo(0), node, true);          }          break;        case 51:          {            Node node = new51();            push(goTo(0), node, true);          }          break;        case 52:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?