Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 internal static CodeNode Parse(ParseInfo state, ref int index, CodeFragmentType ruleSet)
 {
     return(Parse(state, ref index, ruleSet, true));
 }
Esempio n. 3
0
 public CustomCodeFragment(CodeFragmentType codeFragmentType, params string[] reservedWords)
 {
     Type          = codeFragmentType;
     ReservedWords = reservedWords ?? new string[0];
 }
Esempio n. 4
0
 public CustomCodeFragment(CodeFragmentType codeFragmentType)
     : this(codeFragmentType, null)
 {
 }
Esempio n. 5
0
        /**
         * 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;
        }
Esempio n. 6
0
        /**
         * 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;
        }