public virtual void Process() { if (g.ast == null) { return; } // COLLECT RULE OBJECTS RuleCollector ruleCollector = new RuleCollector(g); ruleCollector.Process(g.ast); // CLONE RULE ASTs FOR CONTEXT REFERENCE foreach (Rule rule in ruleCollector.rules.Values) { IList <RuleAST> list; if (!g.contextASTs.TryGetValue(rule.GetBaseContext(), out list) || list == null) { list = new List <RuleAST>(); g.contextASTs[rule.GetBaseContext()] = list; } list.Add((RuleAST)rule.ast.DupTree()); } // DO BASIC / EASY SEMANTIC CHECKS int prevErrors = g.tool.errMgr.GetNumErrors(); BasicSemanticChecks basics = new BasicSemanticChecks(g, ruleCollector); basics.Process(); if (g.tool.errMgr.GetNumErrors() > prevErrors) { return; } // TRANSFORM LEFT-RECURSIVE RULES prevErrors = g.tool.errMgr.GetNumErrors(); LeftRecursiveRuleTransformer lrtrans = new LeftRecursiveRuleTransformer(g.ast, ruleCollector.rules.Values, g); lrtrans.TranslateLeftRecursiveRules(); // don't continue if we got errors during left-recursion elimination if (g.tool.errMgr.GetNumErrors() > prevErrors) { return; } // AUTO LEFT FACTORING LeftFactoringRuleTransformer lftrans = new LeftFactoringRuleTransformer(g.ast, ruleCollector.rules, g); lftrans.TranslateLeftFactoredRules(); // STORE RULES IN GRAMMAR foreach (Rule r in ruleCollector.rules.Values) { g.DefineRule(r); } // COLLECT SYMBOLS: RULES, ACTIONS, TERMINALS, ... SymbolCollector collector = new SymbolCollector(g); collector.Process(g.ast); // CHECK FOR SYMBOL COLLISIONS SymbolChecks symcheck = new SymbolChecks(g, collector); symcheck.Process(); // side-effect: strip away redef'd rules. foreach (GrammarAST a in collector.namedActions) { g.DefineAction(a); } // LINK (outermost) ALT NODES WITH Alternatives foreach (Rule r in g.rules.Values) { for (int i = 1; i <= r.numberOfAlts; i++) { r.alt[i].ast.alt = r.alt[i]; } } // ASSIGN TOKEN TYPES g.ImportTokensFromTokensFile(); if (g.IsLexer()) { AssignLexerTokenTypes(g, collector.tokensDefs); } else { AssignTokenTypes(g, collector.tokensDefs, collector.tokenIDRefs, collector.terminals); } symcheck.CheckForModeConflicts(g); AssignChannelTypes(g, collector.channelDefs); // CHECK RULE REFS NOW (that we've defined rules in grammar) symcheck.CheckRuleArgs(g, collector.rulerefs); IdentifyStartRules(collector); symcheck.CheckForQualifiedRuleIssues(g, collector.qualifiedRulerefs); // don't continue if we got symbol errors if (g.tool.GetNumErrors() > 0) { return; } // CHECK ATTRIBUTE EXPRESSIONS FOR SEMANTIC VALIDITY AttributeChecks.CheckAllAttributeExpressions(g); UseDefAnalyzer.TrackTokenRuleRefsInActions(g); }
public virtual void Process() { if (g.ast == null) return; // COLLECT RULE OBJECTS RuleCollector ruleCollector = new RuleCollector(g); ruleCollector.Process(g.ast); // CLONE RULE ASTs FOR CONTEXT REFERENCE foreach (Rule rule in ruleCollector.rules.Values) { IList<RuleAST> list; if (!g.contextASTs.TryGetValue(rule.GetBaseContext(), out list) || list == null) { list = new List<RuleAST>(); g.contextASTs[rule.GetBaseContext()] = list; } list.Add((RuleAST)rule.ast.DupTree()); } // DO BASIC / EASY SEMANTIC CHECKS int prevErrors = g.tool.errMgr.GetNumErrors(); BasicSemanticChecks basics = new BasicSemanticChecks(g, ruleCollector); basics.Process(); if (g.tool.errMgr.GetNumErrors() > prevErrors) return; // TRANSFORM LEFT-RECURSIVE RULES prevErrors = g.tool.errMgr.GetNumErrors(); LeftRecursiveRuleTransformer lrtrans = new LeftRecursiveRuleTransformer(g.ast, ruleCollector.rules.Values, g); lrtrans.TranslateLeftRecursiveRules(); // don't continue if we got errors during left-recursion elimination if (g.tool.errMgr.GetNumErrors() > prevErrors) { return; } // AUTO LEFT FACTORING LeftFactoringRuleTransformer lftrans = new LeftFactoringRuleTransformer(g.ast, ruleCollector.rules, g); lftrans.TranslateLeftFactoredRules(); // STORE RULES IN GRAMMAR foreach (Rule r in ruleCollector.rules.Values) { g.DefineRule(r); } // COLLECT SYMBOLS: RULES, ACTIONS, TERMINALS, ... SymbolCollector collector = new SymbolCollector(g); collector.Process(g.ast); // CHECK FOR SYMBOL COLLISIONS SymbolChecks symcheck = new SymbolChecks(g, collector); symcheck.Process(); // side-effect: strip away redef'd rules. foreach (GrammarAST a in collector.namedActions) { g.DefineAction(a); } // LINK (outermost) ALT NODES WITH Alternatives foreach (Rule r in g.rules.Values) { for (int i = 1; i <= r.numberOfAlts; i++) { r.alt[i].ast.alt = r.alt[i]; } } // ASSIGN TOKEN TYPES g.ImportTokensFromTokensFile(); if (g.IsLexer()) { AssignLexerTokenTypes(g, collector.tokensDefs); } else { AssignTokenTypes(g, collector.tokensDefs, collector.tokenIDRefs, collector.terminals); } symcheck.CheckForModeConflicts(g); AssignChannelTypes(g, collector.channelDefs); // CHECK RULE REFS NOW (that we've defined rules in grammar) symcheck.CheckRuleArgs(g, collector.rulerefs); IdentifyStartRules(collector); symcheck.CheckForQualifiedRuleIssues(g, collector.qualifiedRulerefs); // don't continue if we got symbol errors if (g.tool.GetNumErrors() > 0) return; // CHECK ATTRIBUTE EXPRESSIONS FOR SEMANTIC VALIDITY AttributeChecks.CheckAllAttributeExpressions(g); UseDefAnalyzer.TrackTokenRuleRefsInActions(g); }