internal static CodeNode Parse(ParseInfo state, ref int index, CodeFragmentType ruleSet, bool throwError) { while ((index < state.Code.Length) && (Tools.IsWhiteSpace(state.Code[index]))) { index++; } if (index >= state.Code.Length || state.Code[index] == '}') { return(null); } int sindex = index; if (state.Code[index] == ',' || state.Code[index] == ';') { return(null); } if (index >= state.Code.Length) { return(null); } for (int i = 0; i < rules[(int)ruleSet].Count; i++) { if (rules[(int)ruleSet][i].Validate(state.Code, index)) { var result = rules[(int)ruleSet][i].Parse(state, ref index); if (result != null) { return(result); } } } if (throwError) { ExceptionHelper.ThrowUnknownToken(state.Code, sindex); } return(null); }
internal static CodeNode Parse(ParseInfo state, ref int index, CodeFragmentType ruleSet) { return(Parse(state, ref index, ruleSet, true)); }
public CustomCodeFragment(CodeFragmentType codeFragmentType, params string[] reservedWords) { Type = codeFragmentType; ReservedWords = reservedWords ?? new string[0]; }
public CustomCodeFragment(CodeFragmentType codeFragmentType) : this(codeFragmentType, null) { }
/** * Parses a piece of Java code that matches a certain grammar rule. * * @param pSource The Java source that should get parsed. * @param pCodeFragmentType The code fragment type defining the grammar * rule that should be used to parse the code * fragment. * @param pErrorMessages If this argument is not <code>null</code> error * messages emited by the parser will be added to * this list. Otherwise these error messages will be * written to <code>System.err</code>. * * @return An object of type <code>JSOParser.ParserResult</code> * containing the root node representing a Java code fragment and * the token stream containing the tokens of the parsed source. * * @ * if parsing the code fragment or creating the AST failes. * @throws RecognitionException * * __TEST__ All parsable code fragments still untested for parser failure. */ private ParserResult parse( ANTLRStringStream pSource, CodeFragmentType pCodeFragmentType, List<String> pErrorMessages) { ParserResult result = new ParserResult(); bool isMessageCollectingEnabled = pErrorMessages != null; mLexer.CharStream = pSource; mLexer.EnableErrorMessageCollection(isMessageCollectingEnabled); TokenRewriteStream tokenRewriteStream = new TokenRewriteStream(mLexer); if (mParser != null) { mParser.TokenStream = tokenRewriteStream; } else { mParser = new JavaParser(tokenRewriteStream); mParser.TreeAdaptor = mAST2JSOMTreeAdaptor; } mParser.EnableErrorMessageCollection(isMessageCollectingEnabled); AST2JSOMTree tree = null; if (pCodeFragmentType == CodeFragmentType.ANNOTATION) { tree = (AST2JSOMTree) mParser.annotation().Tree; } else if (pCodeFragmentType == CodeFragmentType.ASSERT_STATEMENT) { tree = (AST2JSOMTree) mParser.assertStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.BREAK_STATEMENT) { tree = (AST2JSOMTree) mParser.breakStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.CLASS_EXTENDS_CLAUSE) { tree = (AST2JSOMTree) mParser.classExtendsClause().Tree; } else if ( pCodeFragmentType == CodeFragmentType.COMPLEX_TYPE_IDENTIFIER) { tree = (AST2JSOMTree) mParser.typeIdent().Tree; } else if (pCodeFragmentType == CodeFragmentType.CONTINUE_STATEMENT) { tree = (AST2JSOMTree) mParser.continueStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.DO_WHILE_STATEMENT) { tree = (AST2JSOMTree) mParser.doWhileStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.ENUM_CONSTANT) { tree = (AST2JSOMTree) mParser.enumConstant().Tree; } else if (pCodeFragmentType == CodeFragmentType.EXPRESSION) { tree = (AST2JSOMTree) mParser.expression().Tree; } else if (pCodeFragmentType == CodeFragmentType.EXPRESSION_STATEMENT) { tree = (AST2JSOMTree) mParser.expressionStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.FOR_STATEMENT) { tree = (AST2JSOMTree) mParser.forStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.FOREACH_STATEMENT) { tree = (AST2JSOMTree) mParser.forEachStatement().Tree; } else if ( pCodeFragmentType == CodeFragmentType.FORMAL_PARAMETER_LIST) { tree = (AST2JSOMTree) mParser.formalParameterList().Tree; } else if ( pCodeFragmentType == CodeFragmentType.GENERIC_TYPE_ARGUMENT_LIST) { tree = (AST2JSOMTree) mParser.genericTypeArgumentList().Tree; } else if ( pCodeFragmentType == CodeFragmentType.GENERIC_TYPE_PARAMETER_LIST) { tree = (AST2JSOMTree) mParser.genericTypeParameterList().Tree; } else if (pCodeFragmentType == CodeFragmentType.IF_STATEMENT) { tree = (AST2JSOMTree) mParser.ifStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.IMPLEMENTS_CLAUSE) { tree = (AST2JSOMTree) mParser.implementsClause().Tree; } else if (pCodeFragmentType == CodeFragmentType.IMPORT_DECLARATION) { tree = (AST2JSOMTree) mParser.importDeclaration().Tree; } else if ( pCodeFragmentType == CodeFragmentType.INTERFACE_EXTENDS_CLAUSE) { tree = (AST2JSOMTree) mParser.interfaceExtendsClause().Tree; } else if (pCodeFragmentType == CodeFragmentType.JAVA_SOURCE) { tree = (AST2JSOMTree) mParser.javaSource().Tree; } else if (pCodeFragmentType == CodeFragmentType.LABELED_STATEMENT) { tree = (AST2JSOMTree) mParser.labeledStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.LOCAL_VARIABLE_DECLARATION) { tree = (AST2JSOMTree) mParser.localVariableDeclaration().Tree; } else if (pCodeFragmentType == CodeFragmentType.MODIFIER_LIST) { tree = (AST2JSOMTree) mParser.modifierList().Tree; } else if (pCodeFragmentType == CodeFragmentType.PRIMITIVE_TYPE) { tree = (AST2JSOMTree) mParser.primitiveType().Tree; } else if (pCodeFragmentType == CodeFragmentType.QUALIFIED_IDENTIFIER) { tree = (AST2JSOMTree) mParser.qualifiedIdentifier().Tree; } else if (pCodeFragmentType == CodeFragmentType.RETURN_STATEMENT) { tree = (AST2JSOMTree) mParser.returnStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.STATEMENT) { tree = (AST2JSOMTree) mParser.statement().Tree; } else if (pCodeFragmentType == CodeFragmentType.STATEMENT_BLOCK) { tree = (AST2JSOMTree) mParser.block().Tree; } else if (pCodeFragmentType == CodeFragmentType.STATEMENT_BLOCK_ELEMENT) { tree = (AST2JSOMTree) mParser.blockStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.SWITCH_CASE_LABEL) { tree = (AST2JSOMTree) mParser.switchCaseLabel().Tree; } else if (pCodeFragmentType == CodeFragmentType.SWITCH_DEFAULT_LABEL) { tree = (AST2JSOMTree) mParser.switchDefaultLabel().Tree; } else if (pCodeFragmentType == CodeFragmentType.SWITCH_STATEMENT) { tree = (AST2JSOMTree) mParser.switchStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.SYNCHRONIZED_STATEMENT) { tree = (AST2JSOMTree) mParser.synchronizedStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.THROW_STATEMENT) { tree = (AST2JSOMTree) mParser.throwStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.THROWS_CLAUSE) { tree = (AST2JSOMTree) mParser.throwsClause().Tree; } else if (pCodeFragmentType == CodeFragmentType.TRY_STATEMENT) { tree = (AST2JSOMTree) mParser.tryStatement().Tree; } else if (pCodeFragmentType == CodeFragmentType.TRY_STATEMENT_CATCH_CLAUSE) { tree = (AST2JSOMTree) mParser.catchClause().Tree; } else if (pCodeFragmentType == CodeFragmentType.TYPE) { tree = (AST2JSOMTree) mParser.type().Tree; } else if (pCodeFragmentType == CodeFragmentType.TYPE_DECLARATION) { tree = (AST2JSOMTree) mParser.typeDeclaration().Tree; } else if (pCodeFragmentType == CodeFragmentType.VARIABLE_DECLARATOR_IDENTIFIER) { // Simply use the grammar rule for local variables. tree = (AST2JSOMTree) mParser.variableDeclaratorId().Tree; } else if (pCodeFragmentType == CodeFragmentType.VARIABLE_INITIALIZER) { tree = (AST2JSOMTree) mParser.variableInitializer().Tree; } else if (pCodeFragmentType == CodeFragmentType.WHILE_STATEMENT) { tree = (AST2JSOMTree) mParser.whileStatement().Tree; } else if (pCodeFragmentType != null) { throw new JSourceUnmarshallerException( UnmarshallerMessages .getUnsupportedCodeFragmentTypeMessage( pCodeFragmentType)); } else { // TODO Internationalize the message. throw new JSourceUnmarshallerException( "The argument stating the code fragment type mustn't be " + "'null'"); } // On parser errors the generated parser may return something // undefined rather than 'null'. if (!mParser.HasErrors()) { // TODO It seems that the JSourceObjectizer uses the parser result // instead of the tree parser result. CHECK THIS! CommonTreeNodeStream treeNodes = new CommonTreeNodeStream(mAST2JSOMTreeAdaptor, tree); treeNodes.TokenStream = tokenRewriteStream; if (mTreeParser != null) { mTreeParser.Reset(); mTreeParser.SetTreeNodeStream(treeNodes); } else { mTreeParser = new JavaTreeParser(treeNodes); } mTreeParser.EnableErrorMessageCollection( isMessageCollectingEnabled); if (pCodeFragmentType == CodeFragmentType.ANNOTATION) { mTreeParser.annotation(); } else if ( pCodeFragmentType == CodeFragmentType.COMPLEX_TYPE_IDENTIFIER) { mTreeParser.typeIdent(); } else if (pCodeFragmentType == CodeFragmentType.ENUM_CONSTANT) { mTreeParser.enumConstant(); } else if (pCodeFragmentType == CodeFragmentType.EXPRESSION) { mTreeParser.expression(); } else if ( pCodeFragmentType == CodeFragmentType.CLASS_EXTENDS_CLAUSE || pCodeFragmentType == CodeFragmentType.INTERFACE_EXTENDS_CLAUSE) { mTreeParser.extendsClause(); } else if ( pCodeFragmentType == CodeFragmentType.FORMAL_PARAMETER_LIST) { mTreeParser.formalParameterList(); } else if ( pCodeFragmentType == CodeFragmentType.GENERIC_TYPE_ARGUMENT_LIST) { mTreeParser.genericTypeArgumentList(); } else if ( pCodeFragmentType == CodeFragmentType.GENERIC_TYPE_PARAMETER_LIST) { mTreeParser.genericTypeParameterList(); } else if ( pCodeFragmentType == CodeFragmentType.IMPLEMENTS_CLAUSE) { mTreeParser.implementsClause(); } else if ( pCodeFragmentType == CodeFragmentType.IMPORT_DECLARATION) { mTreeParser.importDeclaration(); } else if (pCodeFragmentType == CodeFragmentType.JAVA_SOURCE) { mTreeParser.javaSource(); } else if (pCodeFragmentType == CodeFragmentType.LOCAL_VARIABLE_DECLARATION) { mTreeParser.localVariableDeclaration(); } else if (pCodeFragmentType == CodeFragmentType.MODIFIER_LIST) { mTreeParser.modifierList(); } else if (pCodeFragmentType == CodeFragmentType.PRIMITIVE_TYPE) { mTreeParser.primitiveType(); } else if ( pCodeFragmentType == CodeFragmentType.QUALIFIED_IDENTIFIER) { mTreeParser.qualifiedIdentifier(); } else if ( pCodeFragmentType == CodeFragmentType.STATEMENT || pCodeFragmentType == CodeFragmentType.ASSERT_STATEMENT || pCodeFragmentType == CodeFragmentType.BREAK_STATEMENT || pCodeFragmentType == CodeFragmentType.CONTINUE_STATEMENT || pCodeFragmentType == CodeFragmentType.DO_WHILE_STATEMENT || pCodeFragmentType == CodeFragmentType.EXPRESSION_STATEMENT || pCodeFragmentType == CodeFragmentType.FOR_STATEMENT || pCodeFragmentType == CodeFragmentType.FOREACH_STATEMENT || pCodeFragmentType == CodeFragmentType.IF_STATEMENT || pCodeFragmentType == CodeFragmentType.LABELED_STATEMENT || pCodeFragmentType == CodeFragmentType.RETURN_STATEMENT || pCodeFragmentType == CodeFragmentType.SWITCH_STATEMENT || pCodeFragmentType == CodeFragmentType.SYNCHRONIZED_STATEMENT || pCodeFragmentType == CodeFragmentType.THROW_STATEMENT || pCodeFragmentType == CodeFragmentType.TRY_STATEMENT || pCodeFragmentType == CodeFragmentType.WHILE_STATEMENT) { mTreeParser.statement(); } else if (pCodeFragmentType == CodeFragmentType.SWITCH_CASE_LABEL) { mTreeParser.switchCaseLabel(); } else if (pCodeFragmentType == CodeFragmentType.SWITCH_DEFAULT_LABEL) { mTreeParser.switchDefaultLabel(); } else if (pCodeFragmentType == CodeFragmentType.STATEMENT_BLOCK) { mTreeParser.block(); } else if (pCodeFragmentType == CodeFragmentType.STATEMENT_BLOCK_ELEMENT) { mTreeParser.blockStatement(); } else if (pCodeFragmentType == CodeFragmentType.THROWS_CLAUSE) { mTreeParser.throwsClause(); } else if (pCodeFragmentType == CodeFragmentType.TRY_STATEMENT_CATCH_CLAUSE) { mTreeParser.catchClause(); } else if (pCodeFragmentType == CodeFragmentType.TYPE) { mTreeParser.type(); } else if (pCodeFragmentType == CodeFragmentType.TYPE_DECLARATION) { mTreeParser.typeDeclaration(); } else if (pCodeFragmentType == CodeFragmentType.VARIABLE_DECLARATOR_IDENTIFIER) { mTreeParser.variableDeclaratorId(); } else if (pCodeFragmentType == CodeFragmentType.VARIABLE_INITIALIZER) { mTreeParser.variableInitializer(); } else if (pCodeFragmentType != null) { throw new JSourceUnmarshallerException( UnmarshallerMessages .getUnsupportedCodeFragmentTypeMessage( pCodeFragmentType)); } else { // TODO Internationalize the message. throw new JSourceUnmarshallerException( "The argument stating the code fragment type mustn't be " + "'null'"); } result.mLineCount = mLexer.Line; result.mTokenRewriteStream = tokenRewriteStream; result.mTree = tree; } return result; }
/** * Parses a piece of Java code that matches a certain grammar rule. * * @param pCodeFragment The Java code fragment that should get parsed. * @param pCodeFragmentType The code fragment type defining the grammar * rule that should be used to parse the code * fragment. * @param pErrorMessages If this argument is not <code>null</code> error * messages emited by the parser will be added to * this list. Otherwise these error messages will be * written to <code>System.err</code>. * * @return An object of type <code>JSOParser.ParserResult</code> * containing the root node representing a Java code fragment and * the token stream containing the tokens of the parsed source. If * parsing the code fragment has been failed but no exception * has been thrown <code>null</code> will be returned and it's * very likely that there's at least one message within the message * list passed to this method (if a list has been passed at all, of * course). * * @ if parsing the code fragment * failed. */ protected ParserResult parse( String pCodeFragment, CodeFragmentType pCodeFragmentType, List<String> pErrorMessages) { ParserResult result = new ParserResult(); try { result = parse( new ANTLRStringStream(pCodeFragment), pCodeFragmentType, pErrorMessages); } catch (RecognitionException re) { throw new JSourceUnmarshallerException( UnmarshallerMessages .getJavaCodeFragmentParsingFailedMessage( pCodeFragment, pCodeFragmentType), re); } catch (JSourceUnmarshallerException jsue) { // Just catch 'JSourceUnmarshallerException' exceptions in order to // avoid jumping into the following 'catch' block. throw jsue; } catch (Exception e) { throw new JSourceUnmarshallerException( UnmarshallerMessages .getJavaCodeFragmentParsingFailedMessage( pCodeFragment, pCodeFragmentType), e); } finally { if (pErrorMessages != null) { List<String> parserMessages; bool isMessageHeaderEnabled = true; parserMessages = mLexer.GetMessages(); if (parserMessages.Count > 0) { pErrorMessages.Add( UnmarshallerMessages .getParserMessagesEmitedForCodeFragmentMessage( pCodeFragment, pCodeFragmentType)); isMessageHeaderEnabled = false; foreach (String message in parserMessages) { pErrorMessages.Add( UnmarshallerMessages .getLexerMessageMessage() + message); } } if (mParser != null) { parserMessages = mParser.GetMessages(); if (parserMessages.Count > 0) { if (isMessageHeaderEnabled) { pErrorMessages.Add( UnmarshallerMessages .getParserMessagesEmitedForCodeFragmentMessage( pCodeFragment, pCodeFragmentType)); } isMessageHeaderEnabled = false; foreach (String message in parserMessages) { pErrorMessages.Add( UnmarshallerMessages .getParserMessageMessage() + message); } } } if (mTreeParser != null) { parserMessages = mTreeParser.GetMessages(); if (parserMessages.Count > 0) { if (isMessageHeaderEnabled) { pErrorMessages.Add( UnmarshallerMessages .getParserMessagesEmitedForCodeFragmentMessage( pCodeFragment, pCodeFragmentType)); } foreach (String message in parserMessages) { String TEST_STR = "JavaTreeParser.g: "; int offset = message.IndexOf(TEST_STR); if (offset != -1) { pErrorMessages.Add( UnmarshallerMessages .getTreeParserMessageMessage() + message.Substring( offset + TEST_STR.Length)); } else { pErrorMessages.Add( UnmarshallerMessages .getTreeParserMessageMessage() + message); } } } } } } if (result.mTree != null) { return result; } return null; }