2014-04-16 3 views
0

Antlr 4에서 XPath 3 파서를 구현하려고합니다. XPath 사양에 제공된 EBNF에서 올바르게 이해되면 무언가를 제외해야 함을 나타 내기 위해 -을 사용합니다. Antlr 대신 동일한 동작을 달성하기 위해 술어를 사용할 수 있습니다.XPath 용 Lexer 술어 3 comments

나는 술어를 구성하는 방법을 확실히 모르겠으므로 EBNF에서 CommentContents을 구현하는 데 어려움을 겪고 있습니다. 내가 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 } ; 

사람은 확인할 수 : 이것은 내가 지금까지 가지고 무엇인가?

답변

0

{...}이 (가) 필요합니까? {...} 아닙니다. 또한 $ Char + .text는 작동하지 않습니다. 부울을 반환하고 테스트를 수행하는 Java 함수를 작성한 후 호출하는 것이 좋습니다.

+0

좋아, 나는 여기 조금 벙어리가 될 수 있습니다! $ Char +를 현재 Lexer 토큰에 대한 참조로 사용할 수 없기 때문에 의사 결정을위한 현재 컨텍스트를 갖기 위해 Java 함수의 인수로 사용해야하는 것은 무엇입니까? – adamretter

+0

이 경우 함수에 getText() ($ getText? 기억할 수 있음)를 전달한 다음 문자열의 접두사를 검사하게하면됩니다. –