【问题标题】:Missing Lexer Methods in ANTLR4 with Python Target?在带有 Python 目标的 ANTLR4 中缺少 Lexer 方法?
【发布时间】:2017-02-22 17:40:53
【问题描述】:

我正在尝试将 ANTLR4 与 Python2 目标一起使用。据我了解,以下形式的语义谓词是嵌入语法中的目标语言的代码。例如,我有一个这样的规则:

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

这基本上是为了确保令牌 SOMETHING 从行首开始(否则它是其他东西)。我使用了 Java 目标(默认),因为它的测试工具比 Python 中的要好。到现在为止还挺好。但是,一旦我的语法正常工作,在尝试将此代码转换为 Python 时,我遇到了一个问题。首先我假设上面Java中的代码(我对Java的了解不多)是类方法getCharPositionInLine的调用,所以自然将上面的内容翻译成:

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

但是我最终得到了错误:

'MyLexer' object has no attribute 'getCharPositionInLine'

然后我去检查antlr4/runtime/Python2/antlr4/runtime/Python3/ 中的Lexer.py 文件(MyLexer 继承自),你瞧,没有这样的方法。我没有意识到某些目标缺少功能。在此之前对解析器和词法分析器一无所知,我为自己的语法感到非常自豪,但毕竟我什至可能无法使用它!有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: python antlr4


    【解决方案1】:

    据我了解,python 运行时使用column 属性而不是getCharPositionInLine。另见:https://github.com/antlr/antlr4/blob/4.6/runtime/Python2/src/antlr4/Lexer.py#L237

    【讨论】:

    • 谢谢,这完全符合我对 getCharPositionInLine 的预期。各种目标的运行时之间的这些差异是否记录在任何地方,还是我必须阅读代码并弄清楚?
    • 不幸的是,这样的详细文档不存在。所以,请阅读代码进行解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多