如何制作与分隔符内外的字符串匹配的 ANTLR 语法?

How to make an ANTLR grammar that matches strings both inside and outside a delimiter?

提问人:Tiiba 提问时间:6/5/2023 最后编辑:Tiiba 更新时间:6/5/2023 访问量:31

问:

ANTLR4 的这种语法应该将文档分解为两种类型的子字符串:wiki 和 nowiki。

grammar NoWikiText;

nowiki: '<nowiki>' ~'</nowiki>'* '</nowiki>';
wiki: ~'<nowiki>'+;
document: (wiki | nowiki)*;

输入如下:

<nowiki>2</nowiki>4<nowiki></nowiki>

我得到了两个 nowiki 匹配项。但是应该与 wiki 匹配的文本“4”被忽略了。为什么?

编辑:

这似乎有效:

grammar NoWikiText;

P1: '<nowiki>';
P2: '</nowiki>';
NP: .;

nowiki: P1 NP* P2;
wiki: NP+;
document: (wiki | nowiki)*;
解析 ANTLR ANTLR4

评论


答:

1赞 Bart Kiers 6/5/2023 #1

在您发布的语法中,只会创建 2 个标记:和 .否定 char 的工作方式与您预期的不同: means: “匹配除 ” 以外的任何标记(以便匹配标记)。因此,对于您的输入,和不被识别为有效令牌。<nowiki></nowiki>~'</nowiki>'</nowiki><nowiki><nowiki>2</nowiki>4<nowiki></nowiki>24