2017-02-22 3 views
1

ANTLR4를 Python2 Target과 함께 사용하려고합니다. 필자가 이해 하듯이 다음 형식의 의미 론적 조건자는 문법에 포함 된 대상 언어의 코드입니다. 예를 들어, 나는 하나의 규칙이 있습니다Python 대상이있는 ANTLR4에서 누락 된 Lexer 메소드가 있습니까?

'S' {getCharPositionInLine() == 1}? 'OMETHING' 

이 기본적으로 토큰 뭔가가 행의 시작에서 시작되도록하는 것입니다 (그렇지 않으면 다른 것입니다). 테스트 대상이 파이썬보다 낫기 때문에 Java 대상 (기본값)을 사용했습니다. 여태까지는 그런대로 잘됐다. 그러나 일단 문법이 작동하면이 코드를 파이썬으로 번역하려고 할 때 문제가 발생합니다. 내가 궁극적으로 그러나

'S' {self.getCharPositionInLine() == 1}? 'OMETHING' 

: 첫째 그래서 자연스럽게 위를 번역하는 합리적인 것, 자바에서 위의 코드 (I 전혀 많은 자바를 모르는) 클래스 방법 getCharPositionInLine의 호출이라고 가정 오류를 얻을 :

'MyLexer' object has no attribute 'getCharPositionInLine' 

을 내가 가서 antlr4/runtime/Python2/antlr4/runtime/Python3/ 모두 (MyLexer로부터 상속)을 Lexer.py 파일을 확인, 보라 보라, 그런 방법이 없습니다. 특정 대상에 기능이 누락되었음을 알지 못했습니다. 이것 이전에 파서와 렉서에 대해 알지 못 했으므로 문법을 매우 자랑스럽게 생각했지만 결국이 책을 사용할 수 없었을 것입니다! 이 문제를 해결할 수있는 방법이 있습니까?

답변

0

파이썬 런타임은 getCharPositionInLine 대신 column 속성을 사용합니다. 참고 : https://github.com/antlr/antlr4/blob/4.6/runtime/Python2/src/antlr4/Lexer.py#L237

+0

감사합니다. 이것은 getCharPositionInLine을 예상 한대로 정확하게 작동합니다. 다양한 타겟의 런타임 사이에 이러한 차이점이 문서화되어 있습니까? 아니면 코드를 읽고 파악해야합니까? – rooms

+0

불행히도 이러한 세부 설명서는 존재하지 않습니다. 따라서 설명을위한 코드를 읽으십시오. –