Python中C ++的简单标记化器

时间:2016-04-22 19:56:33

标签: python tokenize

苦苦寻找一个用于标记化的脚本的Python库(找到特定的标记,如函数定义名称,变量名称,关键字等)。

我设法使用像this之类的东西找到了关键字,空白等,但我发现对函数/类定义名称来说是一个很大的挑战。我希望使用一个先前存在的脚本;我探究Pygments没有成功。它的lexer看起来很棒,但我不知道如何在Python中使用它,并且还为每个找到的令牌获得位置

例如我正在做类似的事情:

int fac(int n)
{
    return (n>1) ? n∗fac(n−1) : 1;
}

从上面的源代码中我想得到:

  

function_name:位于(x,y)的'fac'   variable_name:位置(x,y + 8)的'n'

EDITED: 任何建议都会受到赞赏,因为我在黑暗中关于在C ++中进行标记化和解析?

2 个答案:

答案 0 :(得分:3)

Eli Bendersky是一个聪明人,有时在这里活跃于此。他有一篇关于这个问题的博客文章,我将直接推荐给你:Parsing C++ in Python with Clang

因为事情消失了,这就是外卖:

Eli Bendersky在Python中编写了一种名为pycparser的C语言( C ++)解析器。人们一直在问他是否要添加对C ++的支持。他不是。他建议人们使用libclang的Python绑定来访问Clang团队发誓保持相对稳定的C API,允许用户在抽象语法树(AST)级别检查解析的代码"

您可以在PyPI here.上单独找到绑定。请注意,您必须安装clang,因此您可能只想将PYTHON_PATH直接指向安装位置。

答案 1 :(得分:2)

你很难找到一个python库来做你想做的事,因为你想要的是根本不可能做到的。

  

我已经设法使用类似的东西找到关键字,空格等,但我发现它对函数/类定义名称等是一个很大的挑战

你的意思是这样的:

foo = 3
def foo():pass

什么是foo?所有的tokenizer都应该/可以告诉你foo是一个标识符。它是 context 告诉你它是变量还是函数声明。您需要一个解析器来处理无上下文语法。在数学上,上下文无关语法的空间对于标准词法分析器来说太大了。

尝试使用解析器:here's one in python

通常情况下,我会尝试为您提供链接,以区分主题,但这样做太广泛,无法提供单一的良好链接。如果您有兴趣,请从任何标准编译器文本开始。在SE的其他地方,我们会将此问题弹出为theoretical question,并以某种形式as a famous question about html

一旦你意识到(通常)在正则表达式上(很大程度上)构建了标记化器,为什么你的任务不会快乐地结束就更加明显了。

既然你知道这个术语,我想你会找到this SO article useful,它推荐gcc-ml。我不知道它是最新的,但它是你正在寻找的程序类型。