我无法触发 ANTLR 规则

I can't trigger ANTLR rule

提问人:136 提问时间:9/1/2023 更新时间:9/4/2023 访问量:75

问:

我正在尝试构建一个 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>
正则表达式 解析 ANTLR ANTLR4 PCRE

评论


答:

1赞 Scott Stanchfield 9/2/2023 #1

规则位于规则中的规则之前。shared_atomliteralatom

由于对语言的意图一无所知,我无法判断这是否是错误的,但这就是捕获 .\0

根据预期的语义,您可能需要对这些规则引用重新排序、修改 lookahead 和/或使用语法谓词来解决此问题。

交换两个规则引用的顺序将使八进制值匹配,但可能会导致其他应该匹配的内容被捕获并可能失败。shared_atomliteral

2赞 Bart Kiers 9/4/2023 #2

在规则中,向上移动。因此,而不是:atombackreference

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)