我正在尝试构建一个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>
shared_atom
规则位于 literal
规则中的 atom
规则之前。
对语言的意图一无所知,我无法判断这是否是一个错误,但这就是捕获
\0
的原因。
根据预期的语义,您可能需要重新排序这些规则引用、修改前瞻和/或使用语法谓词来解决此问题。
交换两个规则引用的顺序将使八进制匹配,但可能会导致
shared_atom
应该匹配的其他内容被 literal
捕获并可能失败。