gpt4 book ai didi

java - 如何知道在访问期间ANTLR解析器当前处于哪个替代规则

转载 作者:行者123 更新时间:2023-12-05 04:41:07 25 4
gpt4 key购买 nike

如果我们查看 bash 源代码,特别是 yacc 语法,我们可以看到所有重定向都是这样定义的:

redirection
: GREATER WORD
| LESS WORD
| NUMBER GREATER WORD
| NUMBER LESS WORD
| REDIR_WORD GREATER WORD
| REDIR_WORD LESS WORD
| GREATER_GREATER WORD
| NUMBER GREATER_GREATER WORD
| REDIR_WORD GREATER_GREATER WORD
| GREATER_BAR WORD
| NUMBER GREATER_BAR WORD
| REDIR_WORD GREATER_BAR WORD
| LESS_GREATER WORD
| NUMBER LESS_GREATER WORD
| REDIR_WORD LESS_GREATER WORD
| LESS_LESS WORD
| NUMBER LESS_LESS WORD
| REDIR_WORD LESS_LESS WORD
| LESS_LESS_MINUS WORD
| NUMBER LESS_LESS_MINUS WORD
| REDIR_WORD LESS_LESS_MINUS WORD
| LESS_LESS_LESS WORD
| NUMBER LESS_LESS_LESS WORD
| REDIR_WORD LESS_LESS_LESS WORD
| LESS_AND NUMBER
| NUMBER LESS_AND NUMBER
| REDIR_WORD LESS_AND NUMBER
| GREATER_AND NUMBER
| NUMBER GREATER_AND NUMBER
| REDIR_WORD GREATER_AND NUMBER
| LESS_AND WORD
| NUMBER LESS_AND WORD
| REDIR_WORD LESS_AND WORD
| GREATER_AND WORD
| NUMBER GREATER_AND WORD
| REDIR_WORD GREATER_AND WORD
| GREATER_AND DASH
| NUMBER GREATER_AND DASH
| REDIR_WORD GREATER_AND DASH
| LESS_AND DASH
| NUMBER LESS_AND DASH
| REDIR_WORD LESS_AND DASH
| AND_GREATER WORD
| AND_GREATER_GREATER WORD
;

在我的访问者中,当 visitRedirection 被调用时,感觉几乎不可能轻易知道访问者当前处于哪个备选方案。我可以使用 # 和标签标记每个备选方案但是仅仅为一个产生式规则增加43个访问方法似乎有点过分了。

通常我会通过 ctx.GREATER() != null 做一些 null 检查来知道是否选择了第一个备选方案,但在这个例子中几乎总是有 2 个相互冲突的选择,例如:

GREATER WORD
NUMBER GREATER WORD

所以我应该做 ctx.NUMBER() != null && ctx.GREATER() != null 来匹配第二个选择和 ctx.NUMBER() == null && ctx .GREATER() != null 匹配第一个 ?

是否有更简单或更清晰的方法来了解访问者当前处于哪个特定备选方案?

最佳答案

重组您的语法以减少备选方案。其中许多具有共同的前导或尾随部分,例如:

redirection
: GREATER WORD
| LESS WORD
| NUMBER (GREATER | LESS) WORD
| REDIR_WORD (GREATER | LESS | LESS_LESS_MINUS) WORD
| ...

这样你在每个 alt 中都有一个唯一的第一个标记,然后你可以将它分配给一个局部变量:

redirection
: op = GREATER WORD
| op = LESS WORD
| op = NUMBER subOp= (GREATER | LESS) WORD
| op = REDIR_WORD subOp =(GREATER | LESS | LESS_LESS_MINUS) WORD
| ...

有了它,您可以轻松地检查您在听众/访问者中的 alt:

public exitRedirection(RedirectionContext ctx) {
switch (ctx.op.getType()) {
case YourParser.GREATER_WORD: {
break;
}

case YourParser.REDIR_WORD: {
switch (ctx.supOp.getType()) {
case YourParser.LESS_LESS_MINUS: {
break;
}
}
break;
}
}

关于java - 如何知道在访问期间ANTLR解析器当前处于哪个替代规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70148460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com