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; }
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; }