From fd9027b4a07a2296a1fa91e9c4f8a83008682a47 Mon Sep 17 00:00:00 2001 From: parrt Date: Mon, 10 Oct 2011 14:01:27 -0800 Subject: [PATCH] new nodes, added visitor [git-p4: depot-paths = "//depot/code/antlr4/main/": change = 9136] --- .../org/antlr/v4/codegen/SourceGenTriggers.g | 1 + tool/src/org/antlr/v4/parse/ANTLRParser.g | 18 +++++++++++------- tool/src/org/antlr/v4/parse/ASTVerifier.g | 1 + tool/src/org/antlr/v4/parse/ATNBuilder.g | 1 + tool/src/org/antlr/v4/parse/ActionSplitter.g | 1 + .../org/antlr/v4/parse/BlockSetTransformer.g | 3 ++- .../org/antlr/v4/parse/GrammarASTAdaptor.java | 4 ++-- .../org/antlr/v4/parse/GrammarTreeVisitor.g | 1 + .../antlr/v4/parse/LeftRecursiveRuleWalker.g | 1 + tool/src/org/antlr/v4/tool/ast/ActionAST.java | 4 +++- tool/src/org/antlr/v4/tool/ast/AltAST.java | 3 +++ tool/src/org/antlr/v4/tool/ast/BlockAST.java | 5 ++++- tool/src/org/antlr/v4/tool/ast/DownAST.java | 3 +++ tool/src/org/antlr/v4/tool/ast/GrammarAST.java | 1 + .../antlr/v4/tool/ast/GrammarASTVisitor.java | 13 +++++++++++++ .../v4/tool/ast/GrammarASTWithOptions.java | 2 +- .../org/antlr/v4/tool/ast/GrammarRootAST.java | 3 +++ tool/src/org/antlr/v4/tool/ast/NotAST.java | 10 ++++++++++ .../antlr/v4/tool/ast/OptionalBlockAST.java | 7 +++++++ .../org/antlr/v4/tool/ast/PlusBlockAST.java | 10 ++++++++++ tool/src/org/antlr/v4/tool/ast/PredAST.java | 3 +++ tool/src/org/antlr/v4/tool/ast/RangeAST.java | 10 ++++++++++ tool/src/org/antlr/v4/tool/ast/RuleAST.java | 1 + .../org/antlr/v4/tool/ast/RuleElementAST.java | 5 +++++ tool/src/org/antlr/v4/tool/ast/SetAST.java | 10 ++++++++++ .../org/antlr/v4/tool/ast/StarBlockAST.java | 10 ++++++++++ .../src/org/antlr/v4/tool/ast/TerminalAST.java | 5 ++++- .../org/antlr/v4/tool/ast/TreePatternAST.java | 5 ++++- tool/src/org/antlr/v4/tool/ast/UpAST.java | 3 +++ 29 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 tool/src/org/antlr/v4/tool/ast/NotAST.java create mode 100644 tool/src/org/antlr/v4/tool/ast/OptionalBlockAST.java create mode 100644 tool/src/org/antlr/v4/tool/ast/PlusBlockAST.java create mode 100644 tool/src/org/antlr/v4/tool/ast/RangeAST.java create mode 100644 tool/src/org/antlr/v4/tool/ast/RuleElementAST.java create mode 100644 tool/src/org/antlr/v4/tool/ast/SetAST.java create mode 100644 tool/src/org/antlr/v4/tool/ast/StarBlockAST.java diff --git a/tool/src/org/antlr/v4/codegen/SourceGenTriggers.g b/tool/src/org/antlr/v4/codegen/SourceGenTriggers.g index 46c03dbe9..94e217082 100644 --- a/tool/src/org/antlr/v4/codegen/SourceGenTriggers.g +++ b/tool/src/org/antlr/v4/codegen/SourceGenTriggers.g @@ -40,6 +40,7 @@ import org.antlr.v4.codegen.model.*; import org.antlr.v4.codegen.model.decl.*; import org.antlr.v4.codegen.model.ast.*; import org.antlr.v4.tool.*; +import org.antlr.v4.tool.ast.*; import java.util.Collections; import java.util.Map; import java.util.HashMap; diff --git a/tool/src/org/antlr/v4/parse/ANTLRParser.g b/tool/src/org/antlr/v4/parse/ANTLRParser.g index a93291ca7..cc76cbd63 100644 --- a/tool/src/org/antlr/v4/parse/ANTLRParser.g +++ b/tool/src/org/antlr/v4/parse/ANTLRParser.g @@ -704,9 +704,9 @@ blockSuffix ; ebnfSuffix - : QUESTION -> OPTIONAL[$start] - | STAR -> CLOSURE[$start] - | PLUS -> POSITIVE_CLOSURE[$start] + : QUESTION -> OPTIONAL[$start] + | STAR -> CLOSURE[$start] + | PLUS -> POSITIVE_CLOSURE[$start] ; atom @@ -722,13 +722,17 @@ atom // lexically contiguous (no spaces either side of the DOT) // otherwise it is two references with a wildcard in between // and not a qualified reference. + /* { input.LT(1).getCharPositionInLine()+input.LT(1).getText().length()== input.LT(2).getCharPositionInLine() && input.LT(2).getCharPositionInLine()+1==input.LT(3).getCharPositionInLine() }? id DOT ruleref -> ^(DOT id ruleref) - | range (ROOT^ | BANG^)? // Range x..y - only valid in lexers + + | + */ + range (ROOT^ | BANG^)? // Range x..y - only valid in lexers | terminal (ROOT^ | BANG^)? | ruleref | notSet (ROOT^|BANG^)? @@ -749,8 +753,8 @@ atom // A set of characters (in a lexer) or terminal tokens, if a parser, // that are then used to create the inverse set of them. notSet - : NOT setElement -> ^(NOT ^(SET[$setElement.start,"SET"] setElement)) - | NOT blockSet -> ^(NOT blockSet) + : NOT setElement -> ^(NOT[$NOT] ^(SET[$setElement.start,"SET"] setElement)) + | NOT blockSet -> ^(NOT[$NOT] blockSet) ; blockSet @@ -822,7 +826,7 @@ ruleref // error about any abuse of the .. operator. // range - : STRING_LITERAL RANGE^ STRING_LITERAL + : STRING_LITERAL RANGE^ STRING_LITERAL ; terminal diff --git a/tool/src/org/antlr/v4/parse/ASTVerifier.g b/tool/src/org/antlr/v4/parse/ASTVerifier.g index 866ae5020..0694db98d 100644 --- a/tool/src/org/antlr/v4/parse/ASTVerifier.g +++ b/tool/src/org/antlr/v4/parse/ASTVerifier.g @@ -65,6 +65,7 @@ options { */ package org.antlr.v4.parse; import org.antlr.v4.tool.*; +import org.antlr.v4.tool.ast.*; } @members { diff --git a/tool/src/org/antlr/v4/parse/ATNBuilder.g b/tool/src/org/antlr/v4/parse/ATNBuilder.g index e65da317f..a75256ec5 100644 --- a/tool/src/org/antlr/v4/parse/ATNBuilder.g +++ b/tool/src/org/antlr/v4/parse/ATNBuilder.g @@ -61,6 +61,7 @@ options { */ package org.antlr.v4.parse; import org.antlr.v4.tool.*; +import org.antlr.v4.tool.ast.*; import org.antlr.v4.automata.ATNFactory; } diff --git a/tool/src/org/antlr/v4/parse/ActionSplitter.g b/tool/src/org/antlr/v4/parse/ActionSplitter.g index ec8fb7048..6860c3b8a 100644 --- a/tool/src/org/antlr/v4/parse/ActionSplitter.g +++ b/tool/src/org/antlr/v4/parse/ActionSplitter.g @@ -5,6 +5,7 @@ options { filter=true; } @header { package org.antlr.v4.parse; import org.antlr.v4.tool.*; +import org.antlr.v4.tool.ast.*; } @members { diff --git a/tool/src/org/antlr/v4/parse/BlockSetTransformer.g b/tool/src/org/antlr/v4/parse/BlockSetTransformer.g index c2a4cc261..5c0536f60 100644 --- a/tool/src/org/antlr/v4/parse/BlockSetTransformer.g +++ b/tool/src/org/antlr/v4/parse/BlockSetTransformer.g @@ -12,6 +12,7 @@ package org.antlr.v4.parse; import org.antlr.v4.misc.Utils; import org.antlr.v4.misc.*; import org.antlr.v4.tool.*; +import org.antlr.v4.tool.ast.*; import java.util.List; import java.util.Set; import java.util.HashSet; @@ -92,4 +93,4 @@ setElement[boolean inLexer] {CharSupport.getCharValueFromGrammarCharLiteral($a.getText())!=-1 && CharSupport.getCharValueFromGrammarCharLiteral($b.getText())!=-1}? ) - ; \ No newline at end of file + ; diff --git a/tool/src/org/antlr/v4/parse/GrammarASTAdaptor.java b/tool/src/org/antlr/v4/parse/GrammarASTAdaptor.java index 733063ca9..ff1af6a18 100644 --- a/tool/src/org/antlr/v4/parse/GrammarASTAdaptor.java +++ b/tool/src/org/antlr/v4/parse/GrammarASTAdaptor.java @@ -34,7 +34,7 @@ import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.antlr.v4.tool.ast.GrammarAST; import org.antlr.v4.tool.ast.GrammarASTErrorNode; -import org.antlr.v4.tool.ast.GrammarASTWithOptions; +import org.antlr.v4.tool.ast.RuleAST; import org.antlr.v4.tool.ast.TerminalAST; public class GrammarASTAdaptor extends CommonTreeAdaptor { @@ -52,7 +52,7 @@ public class GrammarASTAdaptor extends CommonTreeAdaptor { GrammarAST t = null; if ( tokenType==ANTLRParser.RULE ) { // needed by TreeWizard to make RULE tree - t = new GrammarASTWithOptions(new CommonToken(tokenType, text)); + t = new RuleAST(new CommonToken(tokenType, text)); } else if ( tokenType==ANTLRParser.STRING_LITERAL ) { // implicit lexer construction done with wizard; needs this node type diff --git a/tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g b/tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g index afab47511..7ec6d86ed 100644 --- a/tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g +++ b/tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g @@ -76,6 +76,7 @@ options { */ package org.antlr.v4.parse; import org.antlr.v4.tool.*; +import org.antlr.v4.tool.ast.*; import java.lang.reflect.Method; } diff --git a/tool/src/org/antlr/v4/parse/LeftRecursiveRuleWalker.g b/tool/src/org/antlr/v4/parse/LeftRecursiveRuleWalker.g index 26171f346..68f3167bb 100644 --- a/tool/src/org/antlr/v4/parse/LeftRecursiveRuleWalker.g +++ b/tool/src/org/antlr/v4/parse/LeftRecursiveRuleWalker.g @@ -43,6 +43,7 @@ package org.antlr.v4.parse; import org.antlr.v4.misc.*; import org.antlr.v4.tool.*; +import org.antlr.v4.tool.ast.*; } @members { diff --git a/tool/src/org/antlr/v4/tool/ast/ActionAST.java b/tool/src/org/antlr/v4/tool/ast/ActionAST.java index 58c322e6d..47a625942 100644 --- a/tool/src/org/antlr/v4/tool/ast/ActionAST.java +++ b/tool/src/org/antlr/v4/tool/ast/ActionAST.java @@ -35,7 +35,7 @@ import org.antlr.v4.tool.AttributeResolver; import java.util.List; -public class ActionAST extends GrammarAST { +public class ActionAST extends GrammarAST implements RuleElementAST { // Alt, rule, grammar space public AttributeResolver resolver; public List chunks; // useful for ANTLR IDE developers @@ -53,4 +53,6 @@ public class ActionAST extends GrammarAST { @Override public Tree dupNode() { return new ActionAST(this); } + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/AltAST.java b/tool/src/org/antlr/v4/tool/ast/AltAST.java index f3a6ddbad..36731c4f4 100644 --- a/tool/src/org/antlr/v4/tool/ast/AltAST.java +++ b/tool/src/org/antlr/v4/tool/ast/AltAST.java @@ -62,4 +62,7 @@ public class AltAST extends GrammarAST { @Override public Tree dupNode() { return new AltAST(this); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/BlockAST.java b/tool/src/org/antlr/v4/tool/ast/BlockAST.java index d3020a439..d0b9efc93 100644 --- a/tool/src/org/antlr/v4/tool/ast/BlockAST.java +++ b/tool/src/org/antlr/v4/tool/ast/BlockAST.java @@ -35,7 +35,7 @@ import org.antlr.runtime.tree.Tree; import java.util.HashMap; import java.util.Map; -public class BlockAST extends GrammarASTWithOptions { +public class BlockAST extends GrammarASTWithOptions implements RuleElementAST { // TODO: maybe I need a Subrule object like Rule so these options mov to that? /** What are the default options for a subrule? */ public static final Map defaultBlockOptions = @@ -55,4 +55,7 @@ public class BlockAST extends GrammarASTWithOptions { @Override public Tree dupNode() { return new BlockAST(this); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/DownAST.java b/tool/src/org/antlr/v4/tool/ast/DownAST.java index c1c228134..92ac91e41 100644 --- a/tool/src/org/antlr/v4/tool/ast/DownAST.java +++ b/tool/src/org/antlr/v4/tool/ast/DownAST.java @@ -46,4 +46,7 @@ public class DownAST extends TerminalAST { public String toString() { return getText(); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/GrammarAST.java b/tool/src/org/antlr/v4/tool/ast/GrammarAST.java index 5d36afcf9..f4f14c50f 100644 --- a/tool/src/org/antlr/v4/tool/ast/GrammarAST.java +++ b/tool/src/org/antlr/v4/tool/ast/GrammarAST.java @@ -215,4 +215,5 @@ public class GrammarAST extends CommonTree { return buf.toString(); } + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/GrammarASTVisitor.java b/tool/src/org/antlr/v4/tool/ast/GrammarASTVisitor.java index a363c61f6..07f9a13f0 100644 --- a/tool/src/org/antlr/v4/tool/ast/GrammarASTVisitor.java +++ b/tool/src/org/antlr/v4/tool/ast/GrammarASTVisitor.java @@ -8,4 +8,17 @@ t.visit(v); public interface GrammarASTVisitor { Object visit(RuleAST node); Object visit(AltAST node); + Object visit(DownAST node); + Object visit(GrammarAST node); + Object visit(GrammarRootAST node); + Object visit(NotAST node); + Object visit(OptionalBlockAST node); + Object visit(PlusBlockAST node); + Object visit(PredAST node); + Object visit(RangeAST node); + Object visit(SetAST node); + Object visit(StarBlockAST node); + Object visit(TerminalAST node); + Object visit(TreePatternAST node); + Object visit(UpAST node); } diff --git a/tool/src/org/antlr/v4/tool/ast/GrammarASTWithOptions.java b/tool/src/org/antlr/v4/tool/ast/GrammarASTWithOptions.java index 623146416..c039c9a90 100644 --- a/tool/src/org/antlr/v4/tool/ast/GrammarASTWithOptions.java +++ b/tool/src/org/antlr/v4/tool/ast/GrammarASTWithOptions.java @@ -34,7 +34,7 @@ import org.antlr.runtime.Token; import java.util.HashMap; import java.util.Map; -public class GrammarASTWithOptions extends GrammarAST { +public abstract class GrammarASTWithOptions extends GrammarAST { protected Map options; public GrammarASTWithOptions(GrammarAST node) { diff --git a/tool/src/org/antlr/v4/tool/ast/GrammarRootAST.java b/tool/src/org/antlr/v4/tool/ast/GrammarRootAST.java index 94a1799fb..dfc66ba2a 100644 --- a/tool/src/org/antlr/v4/tool/ast/GrammarRootAST.java +++ b/tool/src/org/antlr/v4/tool/ast/GrammarRootAST.java @@ -63,4 +63,7 @@ public class GrammarRootAST extends GrammarASTWithOptions { public GrammarRootAST(int type, Token t, String text) { super(type,t,text); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/NotAST.java b/tool/src/org/antlr/v4/tool/ast/NotAST.java new file mode 100644 index 000000000..70818f4a6 --- /dev/null +++ b/tool/src/org/antlr/v4/tool/ast/NotAST.java @@ -0,0 +1,10 @@ +package org.antlr.v4.tool.ast; + +import org.antlr.runtime.Token; + +public class NotAST extends GrammarAST implements RuleElementAST { + public NotAST(int type, Token t) { super(type, t); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } +} diff --git a/tool/src/org/antlr/v4/tool/ast/OptionalBlockAST.java b/tool/src/org/antlr/v4/tool/ast/OptionalBlockAST.java new file mode 100644 index 000000000..e24695576 --- /dev/null +++ b/tool/src/org/antlr/v4/tool/ast/OptionalBlockAST.java @@ -0,0 +1,7 @@ +package org.antlr.v4.tool.ast; + +import org.antlr.runtime.Token; + +public class OptionalBlockAST extends GrammarAST implements RuleElementAST { + public OptionalBlockAST(int type, Token t) { super(type, t); } +} diff --git a/tool/src/org/antlr/v4/tool/ast/PlusBlockAST.java b/tool/src/org/antlr/v4/tool/ast/PlusBlockAST.java new file mode 100644 index 000000000..ff1eff848 --- /dev/null +++ b/tool/src/org/antlr/v4/tool/ast/PlusBlockAST.java @@ -0,0 +1,10 @@ +package org.antlr.v4.tool.ast; + +import org.antlr.runtime.Token; + +public class PlusBlockAST extends GrammarAST implements RuleElementAST { + public PlusBlockAST(int type, Token t) { super(type, t); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } +} diff --git a/tool/src/org/antlr/v4/tool/ast/PredAST.java b/tool/src/org/antlr/v4/tool/ast/PredAST.java index 672e7e3be..ba255f663 100644 --- a/tool/src/org/antlr/v4/tool/ast/PredAST.java +++ b/tool/src/org/antlr/v4/tool/ast/PredAST.java @@ -41,4 +41,7 @@ public class PredAST extends ActionAST { public PredAST(Token t) { super(t); } public PredAST(int type) { super(type); } public PredAST(int type, Token t) { super(type, t); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/RangeAST.java b/tool/src/org/antlr/v4/tool/ast/RangeAST.java new file mode 100644 index 000000000..2a04ca1e5 --- /dev/null +++ b/tool/src/org/antlr/v4/tool/ast/RangeAST.java @@ -0,0 +1,10 @@ +package org.antlr.v4.tool.ast; + +import org.antlr.runtime.Token; + +public class RangeAST extends GrammarAST implements RuleElementAST { + public RangeAST(Token t) { super(t); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } +} diff --git a/tool/src/org/antlr/v4/tool/ast/RuleAST.java b/tool/src/org/antlr/v4/tool/ast/RuleAST.java index 86e9607c6..5f4722018 100644 --- a/tool/src/org/antlr/v4/tool/ast/RuleAST.java +++ b/tool/src/org/antlr/v4/tool/ast/RuleAST.java @@ -58,5 +58,6 @@ public class RuleAST extends GrammarASTWithOptions { return null; } + @Override public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/RuleElementAST.java b/tool/src/org/antlr/v4/tool/ast/RuleElementAST.java new file mode 100644 index 000000000..451293756 --- /dev/null +++ b/tool/src/org/antlr/v4/tool/ast/RuleElementAST.java @@ -0,0 +1,5 @@ +package org.antlr.v4.tool.ast; + +/** Tag indicated AST node is a rule element like token or rule ref. */ +public interface RuleElementAST { +} diff --git a/tool/src/org/antlr/v4/tool/ast/SetAST.java b/tool/src/org/antlr/v4/tool/ast/SetAST.java new file mode 100644 index 000000000..556bc2373 --- /dev/null +++ b/tool/src/org/antlr/v4/tool/ast/SetAST.java @@ -0,0 +1,10 @@ +package org.antlr.v4.tool.ast; + +import org.antlr.runtime.Token; + +public class SetAST extends GrammarAST implements RuleElementAST { + public SetAST(int type, Token t, String text) { super(type,t,text); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } +} diff --git a/tool/src/org/antlr/v4/tool/ast/StarBlockAST.java b/tool/src/org/antlr/v4/tool/ast/StarBlockAST.java new file mode 100644 index 000000000..7e7713428 --- /dev/null +++ b/tool/src/org/antlr/v4/tool/ast/StarBlockAST.java @@ -0,0 +1,10 @@ +package org.antlr.v4.tool.ast; + +import org.antlr.runtime.Token; + +public class StarBlockAST extends GrammarAST implements RuleElementAST { + public StarBlockAST(int type, Token t) { super(type, t); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } +} diff --git a/tool/src/org/antlr/v4/tool/ast/TerminalAST.java b/tool/src/org/antlr/v4/tool/ast/TerminalAST.java index 0c382ed86..306657eb2 100644 --- a/tool/src/org/antlr/v4/tool/ast/TerminalAST.java +++ b/tool/src/org/antlr/v4/tool/ast/TerminalAST.java @@ -32,7 +32,7 @@ package org.antlr.v4.tool.ast; import org.antlr.runtime.Token; import org.antlr.runtime.tree.Tree; -public class TerminalAST extends GrammarASTWithOptions { +public class TerminalAST extends GrammarASTWithOptions implements RuleElementAST { public static final String defaultTokenOption = "node"; public TerminalAST(GrammarAST node) { @@ -45,4 +45,7 @@ public class TerminalAST extends GrammarASTWithOptions { @Override public Tree dupNode() { return new TerminalAST(this); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/TreePatternAST.java b/tool/src/org/antlr/v4/tool/ast/TreePatternAST.java index e256cab31..55c3ed292 100644 --- a/tool/src/org/antlr/v4/tool/ast/TreePatternAST.java +++ b/tool/src/org/antlr/v4/tool/ast/TreePatternAST.java @@ -32,7 +32,7 @@ package org.antlr.v4.tool.ast; import org.antlr.runtime.Token; import org.antlr.v4.runtime.atn.ATNState; -public class TreePatternAST extends GrammarAST { +public class TreePatternAST extends GrammarAST implements RuleElementAST { /** Record ATN DN, UP nodes so we can find easily later */ public ATNState downState; public ATNState upState; @@ -40,4 +40,7 @@ public class TreePatternAST extends GrammarAST { public TreePatternAST(Token t) { super(t); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } } diff --git a/tool/src/org/antlr/v4/tool/ast/UpAST.java b/tool/src/org/antlr/v4/tool/ast/UpAST.java index 286f90024..4e27d46ff 100644 --- a/tool/src/org/antlr/v4/tool/ast/UpAST.java +++ b/tool/src/org/antlr/v4/tool/ast/UpAST.java @@ -45,4 +45,7 @@ public class UpAST extends TerminalAST { public String toString() { return getText(); } + + @Override + public Object visit(GrammarASTVisitor v) { return v.visit(this); } }