Предикат 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, которая выполняет тест, возвращая логическое значение, а затем просто вызывать его.

Другие вопросы по тегам