diff --git a/tool/src/org/antlr/v4/codegen/model/ListenerFile.java b/tool/src/org/antlr/v4/codegen/model/ListenerFile.java index 2066c160d1..9cd38a5b36 100644 --- a/tool/src/org/antlr/v4/codegen/model/ListenerFile.java +++ b/tool/src/org/antlr/v4/codegen/model/ListenerFile.java @@ -46,7 +46,7 @@ public ListenerFile(OutputModelFactory factory, String fileName) { Grammar g = factory.getGrammar(); parserName = g.getRecognizerName(); grammarName = g.name; - namedActions = buildNamedActions(factory.getGrammar()); + namedActions = buildNamedActions(factory.getGrammar(), ast -> ast.getScope() == null); for (Rule r : g.rules.values()) { Map>> labels = r.getAltLabels(); if ( labels!=null ) { diff --git a/tool/src/org/antlr/v4/codegen/model/OutputFile.java b/tool/src/org/antlr/v4/codegen/model/OutputFile.java index cd233246bb..5e085b35fd 100644 --- a/tool/src/org/antlr/v4/codegen/model/OutputFile.java +++ b/tool/src/org/antlr/v4/codegen/model/OutputFile.java @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.function.Predicate; public abstract class OutputFile extends OutputModelObject { public final String fileName; @@ -32,10 +33,15 @@ public OutputFile(OutputModelFactory factory, String fileName) { } public Map buildNamedActions(Grammar g) { + return buildNamedActions(g, null); + } + + public Map buildNamedActions(Grammar g, Predicate filter) { Map namedActions = new HashMap(); for (String name : g.namedActions.keySet()) { ActionAST ast = g.namedActions.get(name); - namedActions.put(name, new Action(factory, ast)); + if(filter==null || filter.test(ast)) + namedActions.put(name, new Action(factory, ast)); } return namedActions; } diff --git a/tool/src/org/antlr/v4/codegen/model/VisitorFile.java b/tool/src/org/antlr/v4/codegen/model/VisitorFile.java index 3c746d6499..f647d5e168 100644 --- a/tool/src/org/antlr/v4/codegen/model/VisitorFile.java +++ b/tool/src/org/antlr/v4/codegen/model/VisitorFile.java @@ -58,7 +58,8 @@ public VisitorFile(OutputModelFactory factory, String fileName) { } } ActionAST ast = g.namedActions.get("header"); - if ( ast!=null ) header = new Action(factory, ast); + if ( ast!=null && ast.getScope()==null) + header = new Action(factory, ast); genPackage = g.tool.genPackage; accessLevel = g.getOptionString("accessLevel"); exportMacro = g.getOptionString("exportMacro"); diff --git a/tool/src/org/antlr/v4/semantics/SymbolCollector.java b/tool/src/org/antlr/v4/semantics/SymbolCollector.java index 66f8cac88e..f9f81faf06 100644 --- a/tool/src/org/antlr/v4/semantics/SymbolCollector.java +++ b/tool/src/org/antlr/v4/semantics/SymbolCollector.java @@ -63,6 +63,7 @@ public SymbolCollector(Grammar g) { @Override public void globalNamedAction(GrammarAST scope, GrammarAST ID, ActionAST action) { + action.setScope(scope); namedActions.add((GrammarAST)ID.getParent()); action.resolver = g; } diff --git a/tool/src/org/antlr/v4/tool/ast/ActionAST.java b/tool/src/org/antlr/v4/tool/ast/ActionAST.java index 30676062c7..3a976a3705 100644 --- a/tool/src/org/antlr/v4/tool/ast/ActionAST.java +++ b/tool/src/org/antlr/v4/tool/ast/ActionAST.java @@ -13,7 +13,8 @@ public class ActionAST extends GrammarASTWithOptions implements RuleElementAST { // Alt, rule, grammar space - public AttributeResolver resolver; + GrammarAST scope = null; + public AttributeResolver resolver; public List chunks; // useful for ANTLR IDE developers public ActionAST(ActionAST node) { @@ -31,4 +32,14 @@ public ActionAST(ActionAST node) { @Override public Object visit(GrammarASTVisitor v) { return v.visit(this); } + + public void setScope(GrammarAST scope) { + this.scope = scope; + } + + public GrammarAST getScope() { + return scope; + } + + }