forked from jasder/antlr
track finally action separately now
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 6843]
This commit is contained in:
parent
9913972caa
commit
fbaeb50e5e
|
@ -1,18 +1,28 @@
|
||||||
package org.antlr.v4.codegen.src;
|
package org.antlr.v4.codegen.src;
|
||||||
|
|
||||||
|
import org.antlr.v4.misc.Utils;
|
||||||
import org.antlr.v4.tool.Attribute;
|
import org.antlr.v4.tool.Attribute;
|
||||||
import org.antlr.v4.tool.GrammarAST;
|
import org.antlr.v4.tool.GrammarAST;
|
||||||
import org.antlr.v4.tool.Rule;
|
import org.antlr.v4.tool.Rule;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
public class RuleFunction {
|
public class RuleFunction {
|
||||||
public String name;
|
public String name;
|
||||||
public List<String> modifiers;
|
public List<String> modifiers;
|
||||||
public List<Attribute> args;
|
public Collection<Attribute> args;
|
||||||
public List<Attribute> retvals;
|
public Collection<Attribute> retvals;
|
||||||
|
public Collection<Attribute> ruleScopeDecls;
|
||||||
|
public List<String> globalScopesUsed;
|
||||||
|
public Collection<String> ruleLabels;
|
||||||
|
public Collection<String> tokenLabels;
|
||||||
|
public List<String> elementsReferencedInRewrite;
|
||||||
|
public List<String> exceptions;
|
||||||
|
public String finallyAction;
|
||||||
|
|
||||||
public CodeBlock code;
|
public CodeBlock code;
|
||||||
|
|
||||||
public RuleFunction(Rule r) {
|
public RuleFunction(Rule r) {
|
||||||
|
@ -21,5 +31,14 @@ public class RuleFunction {
|
||||||
this.modifiers = new ArrayList<String>();
|
this.modifiers = new ArrayList<String>();
|
||||||
for (GrammarAST t : r.modifiers) modifiers.add(t.getText());
|
for (GrammarAST t : r.modifiers) modifiers.add(t.getText());
|
||||||
}
|
}
|
||||||
|
modifiers = Utils.nodesToStrings(r.modifiers);
|
||||||
|
|
||||||
|
args = r.args.attributes.values();
|
||||||
|
retvals = r.retvals.attributes.values();
|
||||||
|
ruleScopeDecls = r.scope.attributes.values();
|
||||||
|
ruleLabels = r.getLabelNames();
|
||||||
|
tokenLabels = r.getTokenRefs();
|
||||||
|
exceptions = Utils.nodesToStrings(r.exceptionActions);
|
||||||
|
finallyAction = r.finallyAction.getText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package org.antlr.v4.misc;
|
package org.antlr.v4.misc;
|
||||||
|
|
||||||
|
import org.antlr.v4.tool.GrammarAST;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -92,4 +95,9 @@ public class Utils {
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <T extends GrammarAST> List<String> nodesToStrings(List<T> nodes) {
|
||||||
|
List<String> a = new ArrayList<String>();
|
||||||
|
for (T t : nodes) a.add(t.getText());
|
||||||
|
return a;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,12 @@ public class AttributeChecks implements ActionSplitterListener {
|
||||||
for (ActionAST a : r.exceptionActions) {
|
for (ActionAST a : r.exceptionActions) {
|
||||||
AttributeChecks checker = new AttributeChecks(g, r, null, a, a.token);
|
AttributeChecks checker = new AttributeChecks(g, r, null, a, a.token);
|
||||||
checker.examineAction();
|
checker.examineAction();
|
||||||
}
|
}
|
||||||
|
if ( r.finallyAction!=null ) {
|
||||||
|
AttributeChecks checker =
|
||||||
|
new AttributeChecks(g, r, null, r.finallyAction, r.finallyAction.token);
|
||||||
|
checker.examineAction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// $ANTLR ${project.version} ${buildNumber} BasicSemanticTriggers.g 2010-04-19 16:22:28
|
// $ANTLR ${project.version} ${buildNumber} BasicSemanticTriggers.g 2010-05-06 12:54:52
|
||||||
|
|
||||||
/*
|
/*
|
||||||
[The "BSD license"]
|
[The "BSD license"]
|
||||||
|
|
|
@ -202,7 +202,7 @@ exceptionHandler
|
||||||
finallyClause
|
finallyClause
|
||||||
: ^(FINALLY ACTION)
|
: ^(FINALLY ACTION)
|
||||||
{
|
{
|
||||||
currentRule.exceptionActions.add((ActionAST)$ACTION);
|
currentRule.finallyAction = (ActionAST)$ACTION;
|
||||||
((ActionAST)$ACTION).resolver = currentRule;
|
((ActionAST)$ACTION).resolver = currentRule;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// $ANTLR ${project.version} ${buildNumber} CollectSymbols.g 2010-04-28 18:42:02
|
// $ANTLR ${project.version} ${buildNumber} CollectSymbols.g 2010-05-06 12:54:51
|
||||||
|
|
||||||
/*
|
/*
|
||||||
[The "BSD license"]
|
[The "BSD license"]
|
||||||
|
@ -1088,7 +1088,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
match(input, Token.UP, null); if (state.failed) return ;
|
match(input, Token.UP, null); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
|
||||||
currentRule.exceptionActions.add((ActionAST)ACTION13);
|
currentRule.finallyAction = (ActionAST)ACTION13;
|
||||||
((ActionAST)ACTION13).resolver = currentRule;
|
((ActionAST)ACTION13).resolver = currentRule;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,9 +63,13 @@ public class Rule implements AttributeResolver {
|
||||||
public Map<String, ActionAST> namedActions =
|
public Map<String, ActionAST> namedActions =
|
||||||
new HashMap<String, ActionAST>();
|
new HashMap<String, ActionAST>();
|
||||||
|
|
||||||
/** Track exception handlers, finally action */
|
/** Track exception handler actions (exception type is prev child);
|
||||||
|
* don't track finally action
|
||||||
|
*/
|
||||||
public List<ActionAST> exceptionActions = new ArrayList<ActionAST>();
|
public List<ActionAST> exceptionActions = new ArrayList<ActionAST>();
|
||||||
|
|
||||||
|
public ActionAST finallyAction;
|
||||||
|
|
||||||
public int numberOfAlts;
|
public int numberOfAlts;
|
||||||
|
|
||||||
/** Labels are visible to all alts in a rule. Record all defs here.
|
/** Labels are visible to all alts in a rule. Record all defs here.
|
||||||
|
@ -118,12 +122,19 @@ public class Rule implements AttributeResolver {
|
||||||
return d.get(y);
|
return d.get(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: move to code gen InvokeRule function? is only place we ref?
|
||||||
public Set<String> getRuleRefs() {
|
public Set<String> getRuleRefs() {
|
||||||
Set<String> refs = new HashSet<String>();
|
Set<String> refs = new HashSet<String>();
|
||||||
for (Alternative a : alt) refs.addAll(a.ruleRefs.keySet());
|
for (Alternative a : alt) refs.addAll(a.ruleRefs.keySet());
|
||||||
return refs;
|
return refs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<String> getTokenRefs() {
|
||||||
|
Set<String> refs = new HashSet<String>();
|
||||||
|
for (Alternative a : alt) refs.addAll(a.tokenRefs.keySet());
|
||||||
|
return refs;
|
||||||
|
}
|
||||||
|
|
||||||
public Set<String> getLabelNames() {
|
public Set<String> getLabelNames() {
|
||||||
Set<String> refs = new HashSet<String>();
|
Set<String> refs = new HashSet<String>();
|
||||||
for (int i=1; i<=numberOfAlts; i++) {
|
for (int i=1; i<=numberOfAlts; i++) {
|
||||||
|
|
Loading…
Reference in New Issue