由于某种原因,Antlr未生成访问方法

由于某种原因,Antlr未生成访问方法,antlr,antlr4,Antlr,Antlr4,在Java中,以下语法不会生成带有“visitExpr”的访问者,我不知道为什么。。。我添加了valueExpression,它确实生成了visitValueExpression,但这并不容易从所有数学表达式中得到表达式 grammar Txml; program: statement (NEWLINE statement)* NEWLINE? EOF; statement: require # Condition | entry # CreateEntry

在Java中,以下语法不会生成带有“visitExpr”的访问者,我不知道为什么。。。我添加了valueExpression,它确实生成了visitValueExpression,但这并不容易从所有数学表达式中得到表达式

grammar Txml;

program: statement (NEWLINE statement)* NEWLINE? EOF;

statement: require    # Condition
    | entry           # CreateEntry
    | assignment      # Assign
    ;

require: REQUIRE valueExpression;

valueExpression: expr;
expr: lhs=expr ('*' | '/') rhs=expr          # MulDiv
    | lhs=expr ('+' | '-') rhs=expr          # AddSub
    | lhs=expr '%' rhs=expr                  # Mod
    | lhs=expr '^' rhs=expr                  # Pow
    | '(' expr ')'                           # Parens
    | NUMBER                                 # NumberLiteral
    | IDENT '(' args ')'                     # FunctionCall
    | IDENT                                  # Identifier
    | STRING_LITERAL                         # StringLiteral
    ;

functionArgument: expr;
args: (functionArgument (',' functionArgument)*)?;

// Reserved words
REQUIRE: 'require';

// Whitespace and line break
NEWLINE : [\r\n];
WS: [ \t] + -> skip;

// Entities
NUMBER: ('0' .. '9') + ('.' ('0' .. '9') +)?;
IDENT: [a-zA-Z]+[0-9a-zA-Z]*;
STRING_LITERAL : '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"';
另外,我不太明白如何访问基本访问者中的“通用”节点-如何从特定上下文中获取RuleNode

[…]不会产生具有“visitExpr”的访问者,我不知道为什么

当解析器规则
r
时,不会生成
visitR(…)
。仅生成备选方案的
visit…()
方法

因此,如果没有alt标签:

r
 : a 
 | b
 ;

// Only 1 method:
//  - visitR(...)
r
 : a #altA
 | b #altB
 ;

// Two methods:
//  - visitAltA(...)
//  - visitAltB(...)
使用alt标签:

r
 : a 
 | b
 ;

// Only 1 method:
//  - visitR(...)
r
 : a #altA
 | b #altB
 ;

// Two methods:
//  - visitAltA(...)
//  - visitAltB(...)
另外,我不太明白如何访问基本访问者中的“通用”节点-如何从特定上下文中获取RuleNode

您可以重写
AbstractParseTreeVisitor#visitChildren(…)
方法来侦听任何规则。快速演示:

公共类主{
公共静态void main(字符串[]args)引发异常{
String source=“需要a+b”;
TxmlLexer lexer=新的TxmlLexer(CharStreams.fromString(source));
TxmlParser=newTxmlparser(newCommonTokenStream(lexer));
ParseTree root=parser.program();
新建TestTXmlVisitor().visit(root);
}
}
类TestTXmlVisitor扩展了TxmlBaseVisitor{
@凌驾
公共对象访问子对象(规则节点){
System.out.println(“已访问:“+node.getClass().getSimpleName()+”->“+node.getText());
返回super.visitChildren(节点);
}
}
将打印:

visited: ProgramContext -> requirea+b<EOF>
visited: ConditionContext -> requirea+b
visited: RequireContext -> requirea+b
visited: ValueExpressionContext -> a+b
visited: AddSubContext -> a+b
visited: IdentifierContext -> a
visited: IdentifierContext -> b
已访问:ProgramContext->requirea+b
已访问:条件上下文->需求A+b
访问:RequireText->requirea+b
已访问:ValueExpressionContext->a+b
已访问:添加子上下文->a+b
已访问:IdentifierContext->a
已访问:IdentifierContext->b
[…]不会产生具有“visitExpr”的访问者,我不知道为什么

当解析器规则
r
时,不会生成
visitR(…)
。仅生成备选方案的
visit…()
方法

因此,如果没有alt标签:

r
 : a 
 | b
 ;

// Only 1 method:
//  - visitR(...)
r
 : a #altA
 | b #altB
 ;

// Two methods:
//  - visitAltA(...)
//  - visitAltB(...)
使用alt标签:

r
 : a 
 | b
 ;

// Only 1 method:
//  - visitR(...)
r
 : a #altA
 | b #altB
 ;

// Two methods:
//  - visitAltA(...)
//  - visitAltB(...)
另外,我不太明白如何访问基本访问者中的“通用”节点-如何从特定上下文中获取RuleNode

您可以重写
AbstractParseTreeVisitor#visitChildren(…)
方法来侦听任何规则。快速演示:

公共类主{
公共静态void main(字符串[]args)引发异常{
String source=“需要a+b”;
TxmlLexer lexer=新的TxmlLexer(CharStreams.fromString(source));
TxmlParser=newTxmlparser(newCommonTokenStream(lexer));
ParseTree root=parser.program();
新建TestTXmlVisitor().visit(root);
}
}
类TestTXmlVisitor扩展了TxmlBaseVisitor{
@凌驾
公共对象访问子对象(规则节点){
System.out.println(“已访问:“+node.getClass().getSimpleName()+”->“+node.getText());
返回super.visitChildren(节点);
}
}
将打印:

visited: ProgramContext -> requirea+b<EOF>
visited: ConditionContext -> requirea+b
visited: RequireContext -> requirea+b
visited: ValueExpressionContext -> a+b
visited: AddSubContext -> a+b
visited: IdentifierContext -> a
visited: IdentifierContext -> b
已访问:ProgramContext->requirea+b
已访问:条件上下文->需求A+b
访问:RequireText->requirea+b
已访问:ValueExpressionContext->a+b
已访问:添加子上下文->a+b
已访问:IdentifierContext->a
已访问:IdentifierContext->b