Antlr 将pygments lexer与antl python目标一起使用

Antlr 将pygments lexer与antl python目标一起使用,antlr,pygments,Antlr,Pygments,Terence Parr自己也谈到了antlr3:“不幸的是,与传统的类似lex的方法相比,使用ANTLR构建标记器似乎更困难。”。其中,as pygments几乎可以为您想到的任何语言提供lexer: 有人尝试过将pygments lexer与antlr python目标一起使用吗? antlr2有一个将flex与cpp目标一起使用的例子,不幸的是,antlr3没有这样的例子。 我是否可以手工编写一个grammarname.tokens文件,供antlr解析器导入? 当我使用antlr lex

Terence Parr自己也谈到了antlr3:“不幸的是,与传统的类似lex的方法相比,使用ANTLR构建标记器似乎更困难。”。其中,as pygments几乎可以为您想到的任何语言提供lexer:

有人尝试过将pygments lexer与antlr python目标一起使用吗? antlr2有一个将flex与cpp目标一起使用的例子,不幸的是,antlr3没有这样的例子。
我是否可以手工编写一个grammarname.tokens文件,供antlr解析器导入? 当我使用antlr lexer时,有一堆匿名令牌,我可以删除它们吗? 或者,可以修改pygments,以接受antlr.tokens文件作为其标记。pygments令牌流只需要实现antlr令牌流接口

纳文写道:

有人尝试过将pygments lexer与antlr python目标一起使用吗

我对此表示怀疑。至少,我从来没有看到有人在这里提到过这一点,或者在ANTLR邮件列表上提到过这一点(我已经监控了很长一段时间)

纳文写道:

我是否可以手工编写一个grammarname.tokens文件,供antlr解析器导入

不需要。解析器需要一个
Lexer
对象的实例,它出现在(Python)运行时中。
.tokens
文件不应手动编辑

纳文写道:

当我使用antlr lexer时,有一堆匿名令牌,我可以删除它们吗

我不太清楚你的意思,但是删除任何生成的代码对我来说都是个坏主意。如果您引用的是
.tokens
文件,正如我前面提到的:它不应该手动编辑


我真的不会费心尝试将一些外部词法语法或完整的词法“粘合”到ANTLR中。我敢肯定,这将使您有更多的时间来实现,而不仅仅是自己编写ANTLR lexer语法。毕竟:在大多数情况下,定义lexer规则是语言中最简单的部分。

另一个问题非常有用: 还要通读stax和jflex代码段:

如果从生成的解析器文件导入令牌类型,则令牌文件不是问题。不幸的是,我第一次尝试解析.tokens文件,但忘记了将令牌类型转换为整数,这导致了长时间的错误追踪


但是,我终于明白了:我明白了:

谢谢你的回答。定义lexer规则应该很容易,不幸的是,对于antlr和一些语言来说并非如此。你真的需要更多的魔法,即使是对于lexers,我认为pygments已经解决了这个问题。此外,.tokens文件只是一个简单的字典,我不知道为什么我不能用它来适应不同的lexer。无论如何,我会亲自尝试一下。Naveen,更改
.tokens
文件不会以任何有用的方式影响您的lexer。哪些语言如此难以标记?