将 pygments 词法分析器与 antl python 目标一起使用
Posted
技术标签:
【中文标题】将 pygments 词法分析器与 antl python 目标一起使用【英文标题】:Use pygments lexer with antl python target 【发布时间】:2011-09-05 07:31:02 【问题描述】:Terence Parr 自己谈到 antlr3:“不幸的是,使用 ANTLR 构建分词器似乎仍然比使用传统的类 lex 方法更难”。 pygments 拥有几乎所有你能想到的语言的词法分析器:http://pygments.org/languages/
有没有人尝试将 pygments 词法分析器与 antlr python 目标一起使用? antlr2 有一个将 flex 与 cpp 目标一起使用的示例,不幸的是,antlr3 没有这样的示例。 我可以手写一个 antlr 解析器可以导入的 Grammarname.tokens 文件吗? 当我使用 antlr 词法分析器时,有一堆匿名令牌,我可以删除它们吗? 或者,可以修改 pygments 以接受 antlr .tokens 文件作为其令牌。 pygments令牌流只需要实现antlr令牌流接口即可。
【问题讨论】:
【参考方案1】:纳文写道:
有没有人尝试将 pygments 词法分析器与 antlr python 目标一起使用?
我对此表示怀疑。至少,我从未见过有人在 SO 上或在 ANTLR 邮件列表(我现在监控了很长一段时间)上提到这一点。
纳文写道:
我可以手写一个 antlr 解析器可以导入的 Grammarname.tokens 文件吗?
没有。解析器需要一个Lexer
对象的实例,该对象存在于(Python)运行时中。 .tokens
文件不应手动编辑。
纳文写道:
当我使用 antlr 词法分析器时,有一堆匿名标记,我可以删除它们吗?
不太清楚你的意思,但删除任何生成的代码对我来说似乎是个坏主意。如果您指的是.tokens
文件,正如我之前提到的:它不应该手动编辑。
我真的不会费心尝试将一些外部词法分析器语法或完整的词法分析器“粘合”到 ANTLR 中。我很确定这会让你有更多的时间来实现,而不是自己编写 ANTLR 词法分析器语法。毕竟:在大多数情况下,定义词法分析器规则是语言中最简单的部分。
【讨论】:
感谢您的回答。定义词法分析器规则应该很容易,不幸的是,对于 antlr 和某些语言来说并非如此。即使对于词法分析器,您也确实需要更多的魔法,而 pygments 已经解决了我认为的问题。此外,.tokens 文件只是一个简单的字典,我不知道为什么我不能戳它来适应不同的词法分析器。无论如何,我会自己试一试。 Naveen,更改.tokens
文件不会以任何有用的方式影响您的词法分析器。哪些语言如此难以标记化?【参考方案2】:
这个其他 q/a 非常有帮助:ANTLR Parser with manual lexer 还阅读了 stax 和 jflex sn-ps: http://www.antlr.org/wiki/display/ANTLR3/Interfacing+StAX+to+ANTLR http://www.antlr.org/pipermail/antlr-interest/2007-October/023957.html
如果您从生成的解析器文件导入令牌类型,则令牌文件不是问题。不幸的是,我首先尝试解析 .tokens 文件并忘记将令牌类型转换为整数,这导致了长时间的错误追逐......
但是,我终于想通了:我想通了:http://github.com/tinku99/antlr-pygments
【讨论】:
以上是关于将 pygments 词法分析器与 antl python 目标一起使用的主要内容,如果未能解决你的问题,请参考以下文章