Python 中带有 Pygments 的分词器
Posted
技术标签:
【中文标题】Python 中带有 Pygments 的分词器【英文标题】:Tokenizer with Pygments in Python 【发布时间】:2016-04-22 18:46:17 【问题描述】:想要在 Python 中为源文件(例如 Java 或 C++)创建分词器。遇到Pygments,尤其是这些lexers。我在documentation 和网上找不到有关如何使用词法分析器的示例。
想知道是否可以在 Python 中实际使用 Pygments,以便获取给定源文件的标记及其位置。
我正在为这里的基础知识而苦苦挣扎,所以如果有人可以提供一小部分详细说明上述内容的代码,我将不胜感激。
【问题讨论】:
【参考方案1】:如果您查看 Pygment 的 highlight
函数的源代码,基本上它所做的就是通过 get_tokens
方法将源文本传递到词法分析器实例中,该方法返回一个标记列表。然后将这些标记传递给格式化程序。由于您想要令牌列表,没有格式化程序,您只需要执行第一部分。
所以要使用 C++ 词法分析器(其中src
是一个包含您的 C++ 源代码的字符串):
from pygments.lexers.c_cpp import CppLexer
lexer = CppLexer()
tokens = lexer.get_tokens(src)
当然,您可以使用lookup 或guess 词法分析器,而不是使用get_lexer_by_name
、get_lexer_for_filename
、get_lexer_for_mimetype
、guess_lexer
或guess_lexer_for_filename
之一直接导入所需的词法分析器。例如:
from pygments.lexers import get_lexer_by_name
Lexer = get_lexer_by_name('c++')
lexer = Lexer() # Don't forget to create an instance
tokens = lexer.get_tokens(src)
返回的令牌列表是否会为您提供您想要的东西是另一回事。你得试试看。
【讨论】:
【参考方案2】:如果要标记 Python 代码,您可能想要使用 tokenize
模块:https://docs.python.org/2/library/tokenize.html。否则 PyParsing 会创建易于理解的词法分析器......
【讨论】:
我想在 Python 中标记 c++ 源代码(所以你提到的tokenize
模块对我不好),我希望 Pygments 不仅提供突出显示,而且还可以提供标记化能力(获取令牌及其位置)。那么,我认为 Pygments 可以用于此是错误的吗?
解析,甚至标记化,c++ 是出了名的困难。我建议使用 CastXML (github.com/CastXML/CastXML) 来生成 Python 程序可以使用的 xml。如果您的用例非常琐碎,那么也许 Pygments 可以帮助您...
我的用例确实微不足道(或者至少我相信它是微不足道的);即我只想标记可变定义、函数定义、关键字等。你知道我如何使用 Pygments 或任何其他工具来做到这一点吗? (我只关注 Pygments,因为我看到它可以轻松处理我正在寻找的 c++ 源代码)
对不起,我已经很久没有使用 Pygments 了,但是源代码可读性很好。以上是关于Python 中带有 Pygments 的分词器的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中使用 Pygments(PHP 中的 Python)