我正在尝试在Antlr 4中实现XPath 3解析器。在XPath规范中给出的EBNF中,它使用-
来指示应该排除某些内容,如果我理解正确,那么在Antlr中,我可以使用谓词来实现相同的行为。
我很难从EBNF实现CommentContents
,因为我不太确定如何构造谓词。这就是我目前所拥有的:
/** [2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
*
* //any Unicode character, excluding the surrogate blocks, FFFE, and FFFF
*/
Char : 'u0001'..'uD7FF' | 'uE000'..'uFFFD' | 'u10000'..'u10FFFF' ;
/** [108] CommentContents ::= (Char+ - (Char* ('(:' | ':)') Char*)) */
CommentContents : Char+ { $Char+.text.indexOf("(:") + $Char+.text.indexOf(":)") == 0 } ;
有人能确认我对CommentContents
的谓词是否正确,以便它与EBNF的意图相匹配吗?
您需要{…}吗?不是{…}。另外$Char+.text也不起作用。我建议制作一个Java函数来进行测试,返回布尔值,然后直接调用它。