Exemple #1
0
  public IElementType advance_layer1() throws IOException {

    LexerState saved;

    if (lexerStateStack.size() > 0) {

      if (!isRecording) {
        saved = lexerStateStack.firstElement();
        lexerStateStack.removeElementAt(0);
        setLexerState(saved);

        if (isValidToken(saved.currentElement)) {

          //                    if (saved.currentElement.equals(HackTypes.T_UNRESOLVED_OP) ||
          // saved.currentElement.equals(HackTypes.T_LPAREN))
          //                        parensBalance++;
          //
          //                    if (saved.currentElement.equals(HackTypes.T_RPAREN))
          //                        parensBalance--;

          lastToken = saved.currentElement;
        }
        return saved.currentElement;
      } else if (lexerStackPtr > -1 && lexerStateStack.size() > (lexerStackPtr + 1)) {
        lexerStackPtr++;
        saved = lexerStateStack.get(lexerStackPtr);
        setLexerState(saved);
        if (isValidToken(saved.currentElement)) {

          //                    if (saved.currentElement.equals(HackTypes.T_UNRESOLVED_OP) ||
          // saved.currentElement.equals(HackTypes.T_LPAREN))
          //                        parensBalance++;
          //
          //                    if (saved.currentElement.equals(HackTypes.T_RPAREN))
          //                        parensBalance--;
          lastToken = saved.currentElement;
        }
        return saved.currentElement;
      } else {
        lexerStackPtr++;
      }
    } else if (isRecording) {
      lexerStackPtr++;
    }

    IElementType iElementType = next_token();

    if (isValidToken(iElementType)) {

      if (iElementType.equals(HackTypes.T_UNRESOLVED_OP) || iElementType.equals(HackTypes.T_LPAREN))
        parensBalance++;

      if (iElementType.equals(HackTypes.T_RPAREN)) parensBalance--;

      // Type List Resolution Looking Back
      if (isTypeListAvailable) {
        if (iElementType.equals(HackTypes.T_UNRESOLVED_LT)) {
          iElementType = HackTypes.T_TYPELIST_LT;
        } else if (iElementType.equals(HackTypes.T_IS_NOT_EQUAL) && yytext().charAt(0) == '<') {
          yypushback(1);
          iElementType = HackTypes.T_TYPELIST_LT;
        } else if (iElementType.equals(HackTypes.T_SR)) {
          yypushback(1);
          iElementType = HackTypes.T_TYPELIST_GT;
        } else if (iElementType.equals(HackTypes.T_GREATER)) {
          iElementType = HackTypes.T_TYPELIST_GT;
        } else if (iElementType.equals(HackTypes.T_EQUAL)
            || iElementType.equals(HackTypes.T_UNRESOLVED_OP)
            || iElementType.equals(HackTypes.T_LBRACE)
            || iElementType.equals(HackTypes.T_RBRACE)
            || iElementType.equals(HackTypes.T_SEMICOLON)) {
          isTypeListAvailable = false;
        }
      }

      if (HackTypes.tsInTypeListActivate.contains(iElementType)) {
        isTypeListAvailable = true;
      }
    }

    if (isRecording) {
      LexerState lexerState = getLexerState();
      lexerState.currentElement = iElementType;
      lexerStateStack.add(lexerState);
    }

    if (isValidToken(iElementType)) {
      lastToken = iElementType;
    }

    return iElementType;
  }
Exemple #2
0
  private IElementType resolveLParen() throws IOException {
    LexerState saved;
    LexerState savedLastRParen = null;
    saved = getLexerState();

    int myParensBalance = parensBalance - 1;
    isRecording = true;
    int myIdx = lexerStackPtr;

    int variable = 0;

    for (IElementType iElementType1 = advance_layer2(false);
        iElementType1 != null;
        iElementType1 = advance_layer2(false)) {

      if (parensBalance < myParensBalance) break;

      if ((myParensBalance + 1) == parensBalance) {
        if (iElementType1.equals(HackTypes.T_VARIABLE)) variable++;
      }

      if (iElementType1.equals(HackTypes.T_LAMBDA_ARROW)) {

        if (parensBalance != myParensBalance) {
          break;
        }

        if (savedLastRParen != null) savedLastRParen.currentElement = HackTypes.T_LAMBDA_CP;

        setLexerState(saved);

        if (myIdx > -1) {
          lexerStateStack.get(myIdx).currentElement = HackTypes.T_LAMBDA_OP;
          lexerStackPtr = myIdx;
        }
        return HackTypes.T_LAMBDA_OP;

      } else if (iElementType1.equals(HackTypes.T_LAMBDA_OP)) {
        break;
      } else if (savedLastRParen == null) {
        if (iElementType1.equals(HackTypes.T_FUNCTION) && myParensBalance + 1 == parensBalance) {
          break;
        } else if (myParensBalance == parensBalance && iElementType1.equals(HackTypes.T_RPAREN)) {

          if (variable == 0) {
            if (!lastToken4Resolver.equals(HackTypes.T_UNRESOLVED_OP)) break;
            variable = 0;
          }

          savedLastRParen = lexerStateStack.get(lexerStackPtr);
        }
      }

      isRecording = true;
    }

    setLexerState(saved);
    if (myIdx > -1) {
      lexerStateStack.get(myIdx).currentElement = HackTypes.T_LPAREN;
      lexerStackPtr = myIdx;
    }
    return HackTypes.T_LPAREN;
  }