苦苦寻找一个用于标记化的脚本的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 ++中进行标记化和解析?
答案 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。我不知道它是最新的,但它是你正在寻找的程序类型。