Предикат Lexer для комментариев XPath 3
Я пытаюсь реализовать парсер XPath 3 в Antlr 4. В EBNF, указанном в спецификации XPath, он использует -
чтобы указать, что что-то должно быть исключено, если я правильно понимаю, тогда в Antlr я могу вместо этого использовать предикат для достижения того же поведения.
Я борюсь с реализацией CommentContents
от EBNF, так как я не совсем уверен, как построить предикат. Это то, что я до сих пор:
/** [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
правильно, чтобы это соответствовало намерению ЕБНФ?
1 ответ
Решение
Тебе нужно {...}? не {...} Также $Char+.text не будет работать. Я предлагаю сделать функцию Java, которая выполняет тест, возвращая логическое значение, а затем просто вызывать его.