Python 中的 C++ 简单分词器
Simple tokenizer for C++ in Python
努力寻找一个 Python 脚本库来标记化(寻找特定标记,如函数定义名称、变量名称、关键字等)。
我已经设法找到关键字、空格等。使用 this but I found it quite a challenge for function/class definition names etc. I was hoping of using a pre-existent script; I explored Pygments with no success. Its lexer 之类的东西对我想要的东西来说似乎很棒,但不知道如何在 Python 中使用它并获得 positions 每个找到的标记。
例如,我正在考虑做类似的事情:
int fac(int n)
{
return (n>1) ? n∗fac(n−1) : 1;
}
从上面的源代码中我想得到:
function_name: 'fac' at position (x, y)
variable_name: 'n' at position (x, y+8)
已编辑:
任何建议将不胜感激,因为我在这里对 C++ 中的标记化和解析一无所知?
您正在努力寻找一个 python 库来做您想做的事,因为从根本上说,您想做的事是不可能做到的。
I have managed to find keywords, whitespaces etc. using something like this but I found it quite a challenge for function/class definition names etc
你的意思是这样的:
foo = 3
def foo():pass
什么是foo
?分词器 should/can 告诉你的只是 foo 是一个标识符。它的 context 告诉你它是变量还是函数声明。您需要一个解析器来处理上下文无关语法。从数学上讲,上下文无关文法的 space 对于标准词法分析器来说太大了。
尝试解析器:here's one in python
通常我会尝试在这里为您提供 link 以区分主题,但这太宽泛了,无法提供一个好的 link 给。如果您有兴趣,可以从任何标准编译器文本开始。在 SE 的其他地方,我们看到这个问题弹出为 theoretical question and, in some form, as a famous question about html。
一旦您意识到分词器(通常)(主要)构建在正则表达式上,您的任务不会愉快结束的原因就会变得更加明显。
既然您了解了术语,我想您会发现 this SO article useful, which recommends gcc-ml。我不知道它有多新,但它是您要查找的程序类型。
Eli Bendersky 是个聪明人,有时在 SO 上很活跃。他有一篇关于这个问题的博客 post,我会直接向您推荐:Parsing C++ in Python with Clang。
因为事情消失了,这里是要点:
Eli Bendersky 在 Python 中编写了一个 C 语言(不是 C++)解析器,称为 pycparser
。人们一直在问他是否要添加对 C++ 的支持。他不是。他建议人们使用 libclang 的 Python 绑定来访问 "a C API that the Clang team vows to keep relatively stable, allowing the user to examine parsed code at the level of an abstract syntax tree (AST)".
您可以在 PyPI 上单独找到绑定 here. 请注意,尽管您必须安装 clang,因此您可能只想将 PYTHON_PATH 直接指向安装位置。
努力寻找一个 Python 脚本库来标记化(寻找特定标记,如函数定义名称、变量名称、关键字等)。
我已经设法找到关键字、空格等。使用 this but I found it quite a challenge for function/class definition names etc. I was hoping of using a pre-existent script; I explored Pygments with no success. Its lexer 之类的东西对我想要的东西来说似乎很棒,但不知道如何在 Python 中使用它并获得 positions 每个找到的标记。
例如,我正在考虑做类似的事情:
int fac(int n)
{
return (n>1) ? n∗fac(n−1) : 1;
}
从上面的源代码中我想得到:
function_name: 'fac' at position (x, y) variable_name: 'n' at position (x, y+8)
已编辑: 任何建议将不胜感激,因为我在这里对 C++ 中的标记化和解析一无所知?
您正在努力寻找一个 python 库来做您想做的事,因为从根本上说,您想做的事是不可能做到的。
I have managed to find keywords, whitespaces etc. using something like this but I found it quite a challenge for function/class definition names etc
你的意思是这样的:
foo = 3
def foo():pass
什么是foo
?分词器 should/can 告诉你的只是 foo 是一个标识符。它的 context 告诉你它是变量还是函数声明。您需要一个解析器来处理上下文无关语法。从数学上讲,上下文无关文法的 space 对于标准词法分析器来说太大了。
尝试解析器:here's one in python
通常我会尝试在这里为您提供 link 以区分主题,但这太宽泛了,无法提供一个好的 link 给。如果您有兴趣,可以从任何标准编译器文本开始。在 SE 的其他地方,我们看到这个问题弹出为 theoretical question and, in some form, as a famous question about html。
一旦您意识到分词器(通常)(主要)构建在正则表达式上,您的任务不会愉快结束的原因就会变得更加明显。
既然您了解了术语,我想您会发现 this SO article useful, which recommends gcc-ml。我不知道它有多新,但它是您要查找的程序类型。
Eli Bendersky 是个聪明人,有时在 SO 上很活跃。他有一篇关于这个问题的博客 post,我会直接向您推荐:Parsing C++ in Python with Clang。
因为事情消失了,这里是要点:
Eli Bendersky 在 Python 中编写了一个 C 语言(不是 C++)解析器,称为 pycparser
。人们一直在问他是否要添加对 C++ 的支持。他不是。他建议人们使用 libclang 的 Python 绑定来访问 "a C API that the Clang team vows to keep relatively stable, allowing the user to examine parsed code at the level of an abstract syntax tree (AST)".
您可以在 PyPI 上单独找到绑定 here. 请注意,尽管您必须安装 clang,因此您可能只想将 PYTHON_PATH 直接指向安装位置。