1 package org.antlr.works.grammar; 2 3 import org.antlr.works.ate.syntax.misc.ATEToken; 4 import org.antlr.works.components.grammar.CEditorGrammar; 5 import org.antlr.works.syntax.element.ElementGrammarName; 6 import org.antlr.works.syntax.element.ElementReference; 7 import org.antlr.works.syntax.element.ElementRule; 8 import org.antlr.xjlib.appkit.utils.XJAlert; 9 10 import java.util.ArrayList ; 11 import java.util.List ; 12 42 43 public class RulesDependency extends GrammarDOTTab { 44 45 protected List <String > visitedRules = new ArrayList <String >(); 46 protected List <String > visitedRefs = new ArrayList <String >(); 47 protected StringBuffer dependency; 48 49 protected boolean includeLexerRefs; 50 51 public RulesDependency(CEditorGrammar editor) { 52 super(editor); 53 } 54 55 @Override 56 protected boolean willLaunch() { 57 58 if(!checkForCurrentRule()) 59 return false; 60 61 ElementRule rule = editor.getCurrentRule(); 62 List <ElementReference> refs = editor.rules.getReferencesInRule(rule); 63 if(refs == null || refs.isEmpty()) { 64 XJAlert.display(editor.getWindowContainer(), "Error", "The selected rule doesn't contain any references"); 65 return false; 66 } 67 68 includeLexerRefs = true; 69 if(!rule.lexer && editor.getEngineGrammar().getType() == ElementGrammarName.COMBINED) { 70 includeLexerRefs = XJAlert.displayAlertYESNO(editor.getWindowContainer(), "Rule Dependency Graph", "Do you want to include lexer references ?") == XJAlert.YES; 71 } 72 73 return true; 74 } 75 76 @Override 77 public String getDOTString() throws Exception { 78 ElementRule rule = editor.getCurrentRule(); 79 80 visitedRules.clear(); 81 visitedRefs.clear(); 82 83 dependency = new StringBuffer (); 84 dependency.append("digraph {\n"); 85 buildGraph(rule); 86 dependency.append("}"); 87 88 return dependency.toString(); 89 } 90 91 protected void buildGraph(ElementRule rule) { 92 if(rule == null) 93 return; 94 95 visitedRules.add(rule.name); 96 97 List <ElementReference> refs = editor.rules.getReferencesInRule(rule); 98 if(refs == null || refs.isEmpty()) 99 return; 100 101 for (ElementReference reference : refs) { 102 String refRuleName = reference.token.getAttribute(); 103 String visitedRef = rule.name + " -> " + refRuleName; 104 105 if (visitedRefs.contains(visitedRef)) 106 continue; 107 108 if (ATEToken.isLexerName(reference.token.getAttribute()) && !includeLexerRefs) 109 continue; 110 111 visitedRefs.add(visitedRef); 112 113 dependency.append(visitedRef); 114 dependency.append(";\n"); 115 116 if (!visitedRules.contains(refRuleName)) 117 buildGraph(editor.rules.getRuleWithName(refRuleName)); 118 } 119 } 120 121 public String getTabName() { 122 return "Dependency of \""+rule.name+"\""; 123 } 124 125 } 126 | Popular Tags |