/** * Define the specified rule in the grammar. This method assigns the rule's * {@link Rule#index} according to the {@link #ruleNumber} field, and adds * the {@link Rule} instance to {@link #rules} and {@link #indexToRule}. * * @param r The rule to define in the grammar. * @return {@code true} if the rule was added to the {@link Grammar} * instance; otherwise, {@code false} if a rule with this name already * existed in the grammar instance. */ public boolean defineRule(Rule r) { if ( rules.get(r.name)!=null ) { return false; } rules.put(r.name, r); r.index = ruleNumber++; indexToRule.add(r); return true; }
@Override public List<AltAST> getUnlabeledAltASTs() { List<AltAST> alts = new ArrayList<AltAST>(); for (LeftRecursiveRuleAltInfo altInfo : recPrimaryAlts) { if (altInfo.altLabel == null) alts.add(altInfo.originalAltAST); } for (int i = 0; i < recOpAlts.size(); i++) { LeftRecursiveRuleAltInfo altInfo = recOpAlts.getElement(i); if ( altInfo.altLabel==null ) alts.add(altInfo.originalAltAST); } if ( alts.isEmpty() ) return null; return alts; }
public String getDOT(ATNState startState, boolean isLexer) { Set<String> ruleNames = grammar.rules.keySet(); String[] names = new String[ruleNames.size()+1]; int i = 0; for (String s : ruleNames) names[i++] = s; return getDOT(startState, names, isLexer); }
/** * Gets an array of rule names for rules defined or imported by the * grammar. The array index is the rule index, and the value is the name of * the rule with the corresponding {@link Rule#index}. * * <p>If no rule is defined with an index for an element of the resulting * array, the value of that element is {@link #INVALID_RULE_NAME}.</p> * * @return The names of all rules defined in the grammar. */ public String[] getRuleNames() { String[] result = new String[rules.size()]; Arrays.fill(result, INVALID_RULE_NAME); for (Rule rule : rules.values()) { result[rule.index] = rule.name; } return result; }
public Recognizer(OutputModelFactory factory) { super(factory); Grammar g = factory.getGrammar(); grammarFileName = new File(g.fileName).getName(); grammarName = g.name; name = g.getRecognizerName(); tokens = new LinkedHashMap<String,Integer>(); for (Map.Entry<String, Integer> entry : g.tokenNameToTypeMap.entrySet()) { Integer ttype = entry.getValue(); if ( ttype>0 ) { tokens.put(entry.getKey(), ttype); } } ruleNames = g.rules.keySet(); rules = g.rules.values(); atn = new SerializedATN(factory, g.atn); if (g.getOptionString("superClass") != null) { superClass = new ActionText(null, g.getOptionString("superClass")); } else { superClass = null; } CodeGenerator gen = factory.getGenerator(); tokenNames = translateTokenStringsToTarget(g.getTokenDisplayNames(), gen); literalNames = translateTokenStringsToTarget(g.getTokenLiteralNames(), gen); symbolicNames = translateTokenStringsToTarget(g.getTokenSymbolicNames(), gen); }
/** * Undefine the specified rule from this {@link Grammar} instance. The * instance {@code r} is removed from {@link #rules} and * {@link #indexToRule}. This method updates the {@link Rule#index} field * for all rules defined after {@code r}, and decrements {@link #ruleNumber} * in preparation for adding new rules. * <p> * This method does nothing if the current {@link Grammar} does not contain * the instance {@code r} at index {@code r.index} in {@link #indexToRule}. * </p> * * @param r * @return {@code true} if the rule was removed from the {@link Grammar} * instance; otherwise, {@code false} if the specified rule was not defined * in the grammar. */ public boolean undefineRule(Rule r) { if (r.index < 0 || r.index >= indexToRule.size() || indexToRule.get(r.index) != r) { return false; } assert rules.get(r.name) == r; rules.remove(r.name); indexToRule.remove(r.index); for (int i = r.index; i < indexToRule.size(); i++) { assert indexToRule.get(i).index == i + 1; indexToRule.get(i).index--; } ruleNumber--; return true; }
r.recOpAlts = new OrderedHashMap<Integer, LeftRecursiveRuleAltInfo>(); r.recOpAlts.putAll(leftRecursiveRuleWalker.binaryAlts); r.recOpAlts.putAll(leftRecursiveRuleWalker.ternaryAlts); r.recOpAlts.putAll(leftRecursiveRuleWalker.suffixAlts);
public LinkedHashMap<Integer, PredAST> getIndexToPredicateMap() { LinkedHashMap<Integer, PredAST> indexToPredMap = new LinkedHashMap<Integer, PredAST>(); for (Rule r : rules.values()) { for (ActionAST a : r.actions) { if (a instanceof PredAST) { PredAST p = (PredAST) a; indexToPredMap.put(sempreds.get(p), p); } } } return indexToPredMap; }
public Rule getRule(String name) { Rule r = rules.get(name); if ( r!=null ) return r; return null; /* List<Grammar> imports = getAllImportedGrammars(); if ( imports==null ) return null; for (Grammar g : imports) { r = g.getRule(name); // recursively walk up hierarchy if ( r!=null ) return r; } return null; */ }
@Override public void putAll(Map<? extends K, ? extends V> m) { for (Map.Entry<? extends K, ? extends V> entry : m.entrySet()) { put(entry.getKey(), entry.getValue()); } }
@Override public int getOriginalNumberOfAlts() { int n = 0; if ( recPrimaryAlts!=null ) n += recPrimaryAlts.size(); if ( recOpAlts!=null ) n += recOpAlts.size(); return n; }
LeftRecursiveRuleAltInfo altInfo = r.recOpAlts.getElement(i); String templateName; if ( altInfo.altLabel!=null ) {
/** * Gets an array of rule names for rules defined or imported by the * grammar. The array index is the rule index, and the value is the name of * the rule with the corresponding {@link Rule#index}. * * <p>If no rule is defined with an index for an element of the resulting * array, the value of that element is {@link #INVALID_RULE_NAME}.</p> * * @return The names of all rules defined in the grammar. */ public String[] getRuleNames() { String[] result = new String[rules.size()]; Arrays.fill(result, INVALID_RULE_NAME); for (Rule rule : rules.values()) { result[rule.index] = rule.name; } return result; }
public Recognizer(OutputModelFactory factory) { super(factory); Grammar g = factory.getGrammar(); grammarFileName = new File(g.fileName).getName(); grammarName = g.name; name = g.getRecognizerName(); tokens = new LinkedHashMap<String,Integer>(); for (Map.Entry<String, Integer> entry : g.tokenNameToTypeMap.entrySet()) { Integer ttype = entry.getValue(); if ( ttype>0 ) { tokens.put(entry.getKey(), ttype); } } ruleNames = g.rules.keySet(); rules = g.rules.values(); atn = new SerializedATN(factory, g.atn); if (g.getOptionString("superClass") != null) { superClass = new ActionText(null, g.getOptionString("superClass")); } else { superClass = null; } CodeGenerator gen = factory.getGenerator(); tokenNames = translateTokenStringsToTarget(g.getTokenDisplayNames(), gen); literalNames = translateTokenStringsToTarget(g.getTokenLiteralNames(), gen); symbolicNames = translateTokenStringsToTarget(g.getTokenSymbolicNames(), gen); }
/** * Undefine the specified rule from this {@link Grammar} instance. The * instance {@code r} is removed from {@link #rules} and * {@link #indexToRule}. This method updates the {@link Rule#index} field * for all rules defined after {@code r}, and decrements {@link #ruleNumber} * in preparation for adding new rules. * <p> * This method does nothing if the current {@link Grammar} does not contain * the instance {@code r} at index {@code r.index} in {@link #indexToRule}. * </p> * * @param r * @return {@code true} if the rule was removed from the {@link Grammar} * instance; otherwise, {@code false} if the specified rule was not defined * in the grammar. */ public boolean undefineRule(Rule r) { if (r.index < 0 || r.index >= indexToRule.size() || indexToRule.get(r.index) != r) { return false; } assert rules.get(r.name) == r; rules.remove(r.name); indexToRule.remove(r.index); for (int i = r.index; i < indexToRule.size(); i++) { assert indexToRule.get(i).index == i + 1; indexToRule.get(i).index--; } ruleNumber--; return true; }
r.recOpAlts = new OrderedHashMap<Integer, LeftRecursiveRuleAltInfo>(); r.recOpAlts.putAll(leftRecursiveRuleWalker.binaryAlts); r.recOpAlts.putAll(leftRecursiveRuleWalker.ternaryAlts); r.recOpAlts.putAll(leftRecursiveRuleWalker.suffixAlts);
public LinkedHashMap<Integer, PredAST> getIndexToPredicateMap() { LinkedHashMap<Integer, PredAST> indexToPredMap = new LinkedHashMap<Integer, PredAST>(); for (Rule r : rules.values()) { for (ActionAST a : r.actions) { if (a instanceof PredAST) { PredAST p = (PredAST) a; indexToPredMap.put(sempreds.get(p), p); } } } return indexToPredMap; }
public Rule getRule(String name) { Rule r = rules.get(name); if ( r!=null ) return r; return null; /* List<Grammar> imports = getAllImportedGrammars(); if ( imports==null ) return null; for (Grammar g : imports) { r = g.getRule(name); // recursively walk up hierarchy if ( r!=null ) return r; } return null; */ }
@Override public void putAll(Map<? extends K, ? extends V> m) { for (Map.Entry<? extends K, ? extends V> entry : m.entrySet()) { put(entry.getKey(), entry.getValue()); } }
@Override public int getOriginalNumberOfAlts() { int n = 0; if ( recPrimaryAlts!=null ) n += recPrimaryAlts.size(); if ( recOpAlts!=null ) n += recOpAlts.size(); return n; }