/**Duplicate a tree, assuming this is a root node of a tree-- * duplicate that node and what's below; ignore siblings of root node. */ public static GrammarAST DupTreeNoActions(GrammarAST t, GrammarAST parent) { GrammarAST d = (GrammarAST)t.DupNode(); foreach (GrammarAST subchild in GetChildrenForDupTree(t)) { d.AddChild(DupTreeNoActions(subchild, d)); } return(d); }
public static GrammarAST DupTree(GrammarAST t) { if (t == null) { return(null); } // make copy of root GrammarAST root = Dup(t); // copy all children of root. for (int i = 0; i < t.ChildCount; i++) { GrammarAST child = (GrammarAST)t.GetChild(i); root.AddChild(DupTree(child)); } return(root); }
public void AddRule(GrammarAST grammarTree, GrammarAST t) { GrammarAST p = null; for (int i = 0; i < grammarTree.ChildCount; i++) { p = (GrammarAST)grammarTree.GetChild(i); if (p == null || p.Type == ANTLRParser.RULE || p.Type == ANTLRParser.PREC_RULE) break; } if (p != null) grammarTree.AddChild(t); }
public virtual void ParseAndBuildAST( TextReader r ) { // BUILD AST FROM GRAMMAR ANTLRLexer lexer = new ANTLRLexer( new Antlr.Runtime.ANTLRReaderStream( r ) ); lexer.Filename = this.FileName; // use the rewrite engine because we want to buffer up all tokens // in case they have a merged lexer/parser, send lexer rules to // new grammar. //lexer.setTokenObjectClass( "antlr.TokenWithIndex" ); tokenBuffer = new Antlr.Runtime.CommonTokenStream( lexer ); //tokenBuffer = new TokenStreamRewriteEngine( lexer ); //tokenBuffer.Discard( ANTLRParser.WS, ANTLRParser.ML_COMMENT, ANTLRParser.COMMENT, ANTLRParser.SL_COMMENT ); //tokenBuffer.discard( ANTLRParser.WS ); //tokenBuffer.discard( ANTLRParser.ML_COMMENT ); //tokenBuffer.discard( ANTLRParser.COMMENT ); //tokenBuffer.discard( ANTLRParser.SL_COMMENT ); ANTLRParser parser = new ANTLRParser( tokenBuffer ); parser.FileName = this.FileName; ANTLRParser.grammar__return result = null; try { result = parser.grammar_( this ); } //catch ( TokenStreamException tse ) //{ // ErrorManager.internalError( "unexpected stream error from parsing " + fileName, tse ); //} catch ( RecognitionException re ) { ErrorManager.InternalError( "unexpected parser recognition error from " + fileName, re ); } DealWithTreeFilterMode(); // tree grammar and filter=true? if ( lexer.hasASTOperator && !BuildAST ) { object value = GetOption( "output" ); if ( value == null ) { ErrorManager.GrammarWarning( ErrorManager.MSG_REWRITE_OR_OP_WITH_NO_OUTPUT_OPTION, this, null ); SetOption( "output", "AST", null ); } else { ErrorManager.GrammarError( ErrorManager.MSG_AST_OP_WITH_NON_AST_OUTPUT_OPTION, this, null, value ); } } //grammarTree = (GrammarAST)parser.getAST(); grammarTree = (GrammarAST)result.tree; FileName = lexer.Filename; // the lexer #src might change name if ( grammarTree == null || grammarTree.FindFirstType( ANTLRParser.RULE ) == null ) { ErrorManager.Error( ErrorManager.MSG_NO_RULES, FileName ); return; } // Get syn pred rules and add to existing tree IList<GrammarAST> synpredRules = GetArtificialRulesForSyntacticPredicates( parser, nameToSynpredASTMap ); for ( int i = 0; i < synpredRules.Count; i++ ) { GrammarAST rAST = (GrammarAST)synpredRules[i]; grammarTree.AddChild( rAST ); } }