2017-02-22 63 views
1

我想用Python2 Target來使用ANTLR4。據我瞭解,以下形式的語義謂詞是嵌入在語法中的目標語言的代碼。例如,我有一個這樣的規則:ANTLR4中使用Python目標缺少Lexer方法?

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

這主要是爲了確保令牌事物開始在該行的開始(否則是另一回事)。我使用了Java目標(默認),因爲它的測試工具比Python更好。到現在爲止還挺好。但是,一旦我的語法正在工作,試圖將此代碼翻譯成Python時,我遇到了一個問題。首先,我認爲在Java中,上面的代碼(我不知道太多的Java在所有)是類方法getCharPositionInLine的調用,所以自然也似乎是合理的上述翻譯成:

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

不過我最終得到的錯誤:

'MyLexer' object has no attribute 'getCharPositionInLine' 

我去檢查Lexer.py文件(MyLexer從繼承)在這兩個antlr4/runtime/Python2/antlr4/runtime/Python3/,你瞧,就沒有這樣的方法。我沒有意識到某些目標缺少功能。在此之前,我對語法分析器和詞法分析器一無所知,所以我爲自己的語法感到非常自豪,但畢竟我甚至無法使用它!有什麼辦法可以解決這個問題嗎?

回答

0

據我所知,python運行時使用column屬性而不是getCharPositionInLine。另請參閱:https://github.com/antlr/antlr4/blob/4.6/runtime/Python2/src/antlr4/Lexer.py#L237

+0

謝謝,這與我期望的getCharPositionInLine完全一樣。各個目標的運行時間之間的這些差異是否記錄在任何地方,或者我是否必須閱讀代碼並找出它? – rooms

+0

不幸的是,這樣的詳細文檔不存在。所以,閱讀代碼來解釋。 –