gpt4 book ai didi

antlr - "skip"更改解析器行为

转载 作者:行者123 更新时间:2023-12-04 23:24:29 31 4
gpt4 key购买 nike

添加 skip规则不符合我的期望。这是由逗号和空格分隔的一对标记的语法。我制作了一个版本,其中逗号标记为 skip ,还有一个不是:

grammar Commas;

COMMA: ', ';
COMMASKIP: ', ' -> skip;
DATA: ~[, \n]+;

withoutSkip: data COMMA data '\n';
withSkip: data COMMASKIP data '\n';
data: DATA;

在没有 skip 的情况下测试规则按预期工作:
$ echo 'a, b' | grun Commas withoutSkip -tree
(withoutSkip (data a) , (data b) \n)

skip给我一个错误:
$ echo 'a, b' | grun Commas withSkip -tree
line 1:1 mismatched input ', ' expecting COMMASKIP
(withSkip (data a) , b \n)

如果我注释掉 COMMAwithoutSkip规则我明白了:
$ echo 'a, b' | grun Commas withSkip -tree
line 1:3 missing ', ' at 'b'
(withSkip (data a) <missing ', '> (data b) \n)

我试图获得只包含没有逗号的数据标记的输出,如下所示:
(withSkip (data a) (data b) \n)

我究竟做错了什么?

最佳答案

skip导致词法分析器丢弃 token 。因此,skip ped 词法分析器规则不能用于解析器规则。

另一件事,如果两个或更多规则匹配相同的输入,首先定义的规则将从语法中稍后定义的规则中“胜出”,无论解析器是否尝试匹配语法中稍后定义的规则,第一条规则总是“赢”。在您的情况下,规则 COMMASKIP永远不会创建,因为 COMMA匹配相同的输入。

尝试这样的事情:

语法逗号;

COMMA : ',' -> skip;
SPACE : (' '|'\n') -> skip;
DATA : ~[, \n]+;

data : DATA+;

编辑

So how do I specify where the comma goes without including it in the parse tree? Your code would match a, , b.



你没有,所以如果逗号很重要(即 a,,b )是无效的,它不能从词法分析器中跳过。

I think in antlr3 you're supposed to use an exclamation point.



在 ANTLR 4 中,您无法从解析中创建 AST。在新版本中,所有终端/规则都在一个解析树中。您可以使用自定义访问者和/或监听器迭代此树。可以在此问答中找到有关如何执行此操作的演示: Once grammar is complete, what's the best way to walk an ANTLR v4 tree?

在您的情况下,语法如下所示:
grammar X;

COMMA : ',';
SPACE : (' '|'\n') -> skip;
DATA : ~[, \n]+;

data : DATA (COMMA DATA)*;

然后创建一个这样的监听器:
public class MyListener extends XBaseListener {

@Override
public void enterData(XParser.DataContext ctx) {

List dataList = ctx.DATA(); // not sure what type of list it returns...
// do something with `dataList`
}
}

如您所见, COMMA没有被移除,而是在里面 enterData(...)您只需使用 DATA token 。

关于antlr - "skip"更改解析器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15129658/

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