微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Antlr 由于某种原因没有产生访问方法

如何解决Antlr 由于某种原因没有产生访问方法

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

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?​​p>

解决方法

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

labelling 解析器规则 r 时,不会生成 visitR(...)。只会生成替代品的 visit...() 方法。

所以没有替代标签:

r
 : a 
 | b
 ;

// Only 1 method:
//  - visitR(...)

带有 alt 标签:

r
 : a #altA
 | b #altB
 ;

// Two methods:
//  - visitAltA(...)
//  - visitAltB(...)

此外,我不太明白如何访问基本访问者中的“通用”节点 - 如何从特定上下文中获取 RuleNode?​​p>

您可以覆盖 AbstractParseTreeVisitor<T>#visitChildren(...) 方法来侦听任何规则。快速演示:

public class Main {

  public static void main(String[] args) throws Exception {

    String source = "require a + b";
    TxmlLexer lexer = new TxmlLexer(CharStreams.fromString(source));
    TxmlParser parser = new TxmlParser(new CommonTokenStream(lexer));
    ParseTree root = parser.program();
    new TestTXmlVisitor().visit(root);
  }
}

class TestTXmlVisitor extends TxmlBaseVisitor<Object> {

  @Override
  public Object visitChildren(RuleNode node) {
    System.out.println("visited: " + node.getClass().getSimpleName() + " -> " + node.getText());
    return super.visitChildren(node);
  }
}

将打印:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。