提问人:136 提问时间:9/1/2023 更新时间:9/4/2023 访问量:75
我无法触发 ANTLR 规则
I can't trigger ANTLR rule
问:
我正在尝试构建一个 PCRE 引擎,我正在使用这个 ANTLR 语法。以下是它的一些规则:
octal_char
: ( Backslash (D0 | D1 | D2 | D3) octal_digit octal_digit
| Backslash octal_digit octal_digit
)
;
octal_digit
: D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7
;
digit
: D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 // just '0','1','2','3',...,'9'
;
当我尝试使用这样的字符串触发规则时,它根本不起作用,我不明白为什么。octal_char
\075
字符串的解析树示例:\075
parse
alternation
expr
element
atom
shared_atom \0
element
atom
literal
shared_literal
digit 7
element
atom
literal
shared_literal
digit 5
<EOF>
答:
1赞
Scott Stanchfield
9/2/2023
#1
规则位于规则中的规则之前。shared_atom
literal
atom
由于对语言的意图一无所知,我无法判断这是否是错误的,但这就是捕获 .\0
根据预期的语义,您可能需要对这些规则引用重新排序、修改 lookahead 和/或使用语法谓词来解决此问题。
交换两个规则引用的顺序将使八进制值匹配,但可能会导致其他应该匹配的内容被捕获并可能失败。shared_atom
literal
2赞
Bart Kiers
9/4/2023
#2
在规则中,向上移动。因此,而不是:atom
backreference
atom
: ...
| backreference
| ...
;
做:
atom
: backreference
| ...
;
仅供参考:请注意,您使用的语法基于 2012 年 1 月 10 日 http://www.pcre.org/pcre.txt 的文档。当前的修订版是从 2021 年 6 月 14 日开始的,因此您正在使用的 ANTLR 语法中尚未考虑相当多的更改。
编辑
我刚刚更新了语法并制作了一个 PR:https://github.com/antlr/grammars-v4/pull/3690(可以在此处找到具有更好测试用例的原始存储库:https://github.com/bkiers/pcre-parser)
评论