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_nameget_lexer_for_filenameget_lexer_for_mimetypeguess_lexerguess_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)

python语法高亮使用Pygments程序

为啥 pygments 突出显示有背景颜色?

未定义的方法`highlight' Python+Pygments

pygments 的 C 包装器

Python ImportError:没有名为 pygments 的模块