2017-02-22 5 views
1

私はPython2 TargetでANTLR4を使用しようとしています。私が理解しているように、次の形式の意味論的述語は、文法に埋め込まれたターゲット言語のコードです。例えば、私はそのようなルールがあります。Pythonターゲットを使用したANTLR4のLexerメソッドがありませんか?

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

をこれは基本的に(それ以外の場合は何か他のものである)トークンSOMETHINGは、行の先頭から始まるようにすることです。私はJavaのターゲット(デフォルト)を使用しました。なぜなら、そのテスト機能はPythonよりも優れているからです。ここまでは順調ですね。しかし、いったん私の文法が働いたら、このコードをPythonに翻訳しようとすると、私は問題に遭遇します。 I最終的にしかし

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

:まず、私は自然にに上記を翻訳するのが妥当と思われる、Javaで上記のコードは、(私は全くくらいのJavaを知らない)クラスメソッドgetCharPositionInLineの呼び出しであることを前提としていエラーが表示されます。

'MyLexer' object has no attribute 'getCharPositionInLine' 

をそして私が行くとantlr4/runtime/Python2/antlr4/runtime/Python3/の両方で(MyLexerから継承する)Lexer.pyファイルをチェックし、驚くなかれ、そのような方法はありません。私は特定のターゲットが機能を欠いていたことに気付かなかった。この前にパーサーやレクサーについては知らなかったので、私は文法を非常に誇りに思っていましたが、この後も私はそれを使うことさえできないかもしれません!私はこれを回避できる方法はありますか?

答えて

0

私はPythonのランタイムがgetCharPositionInLineの代わりにcolumnプロパティを使用することを理解しています。参考:https://github.com/antlr/antlr4/blob/4.6/runtime/Python2/src/antlr4/Lexer.py#L237

+0

ありがとうございます、これは私がgetCharPositionInLineを期待したのとまったく同じです。いろいろなターゲットのランタイム間の違いがどこに文書化されているのでしょうか、それともコードを読んで理解しなければならないのでしょうか? – rooms

+0

残念ながら、そのような詳細なドキュメントは存在しません。だから、説明のためのコードを読んでください。 –

関連する問題