小编Mat*_*all的帖子

用于创建C/C++解析器/分析器的好工具

有什么好的工具可以快速开始解析和分析C/C++代码?

特别是,我正在寻找处理C/C++预处理器和语言的开源工具.优选地,这些工具将使用lex/yacc(或flex/bison)用于语法,并且不会太复杂.他们应该处理最新的ANSI C/C++定义.

这是我到目前为止所发现的,但没有详细查看它们(想法?):

  • CScope - 老式C分析仪.但是,似乎没有做完整的解析.被描述为寻找C函数的美化'grep'.
  • GCC - 每个人最喜欢的开源编译器.非常复杂,但似乎做到了这一切.有一个相关项目用于创建名为GEM的 GCC扩展,但自GCC 4.1(2006)以来尚未更新.
  • PUMA - PUre MAnipulator.(来自页面:"这个项目的目的是提供一个用于分析和操作C/C++源代码的类库.为此,PUMA提供了用于扫描,解析和操作C/C++源代码的类.") .这看起来很有希望,但自2001年以来一直没有更新.显然PUMA已被纳入AspectC++,但即使这个项目自2006年以来也没有更新.
  • 各种C/C++原始语法.你可以得到c-c ++ - grammars-1.2.tar.gz,但自1997年以来一直没有得到维护.谷歌的一些搜索引出了其他可以作为起点的基本lex/yacc语法.
  • 还有其他人?

我希望将此作为将C/C++源代码翻译成新玩具语言的起点.

谢谢!-Matt

(已添加2/9):只是澄清:除了C/C++代码本身之外,我还希望从预处理器中提取语义信息.我不希望"#define foo 42"消失在整数"42"中,但仍然附加到名称"foo".不幸的是,这排除了几个首先运行预处理器并且只提供C/C++解析树的解决方案.

c c++ parsing yacc lex

49
推荐指数
8
解决办法
6万
查看次数

在Python中,如何确定内核是以32位还是64位模式运行?

我在Linux,Mac OS和Windows上运行python 2.6,需要确定内核是以32位还是64位模式运行.是否有捷径可寻?

我查看了platform.machine(),但这在Windows上无法正常工作.

我也查看了platform.architecture(),这在64位Windows上运行32位python时不起作用.

注意:看起来python 2.7有一个修复程序使platform.architecture()正常工作.不幸的是,我需要使用python 2.6(至少现在).

(编辑:从与人离线谈话,听起来似乎没有一种强大的python方式来做出这种决定而不诉诸邪恶的黑客.我只是好奇人们在他们的项目中使用的邪恶黑客使用python 2.6.例如,在Windows上可能需要查看PROCESSOR_ARCHITEW6432环境变量并检查AMD64)

python

10
推荐指数
3
解决办法
5826
查看次数

与基于堆栈的系统上的闭包优化有关的问题的名称是什么?

我记得听说过与函数闭包有关的一般优化问题,指出一般来说很难仅使用基于堆栈的内存管理来优化闭包的创建.你们有没有记住这个优化问题的名称,可能是一个例子或相关页面的链接?

optimization closures functional-programming

7
推荐指数
1
解决办法
136
查看次数

什么是常见的C/C++宏来确定结构成员的大小?

在C/C++中,如何确定结构的成员变量的大小,而无需定义该结构类型的虚拟变量?这是一个如何做错的例子,但显示了意图:

typedef struct myStruct {
  int x[10];
  int y;
} myStruct_t;

const size_t sizeof_MyStruct_x = sizeof(myStruct_t.x);  // error
Run Code Online (Sandbox Code Playgroud)

作为参考,如果你首先定义一个虚拟变量,这应该是如何找到'x'的大小:

myStruct_t dummyStructVar;

const size_t sizeof_MyStruct_x = sizeof(dummyStructVar.x);
Run Code Online (Sandbox Code Playgroud)

但是,我希望避免为了获得'x'的大小而创建一个虚拟变量.我认为有一种聪明的方法可以将0重新设置为myStruct_t,以帮助找到成员变量'x'的大小,但是已经足够长,以至于我忘记了细节,似乎无法在这方面获得良好的Google搜索.你知道吗?

谢谢!

c++ sizeof

4
推荐指数
2
解决办法
4429
查看次数

在C++中,类如何在构造函数中获取const std :: string&参数,但也处理NULL?

我正在尝试使用std :: string参数创建类的方法,但它也处理NULL而不抛出异常.这是代码的示例:

class myString {
public:
    myString(const std::string& str) : _str(str) {}
    std::string _str;
};

int main() {
    myString mystr(NULL);
    printf("mystr = <%s>\n", mystr._str.c_str());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

直觉上,你认为这个程序应该打印"mystr = <>"并成功退出,但是用g ++代替它会出现这个错误:

terminate called after throwing an instance of 'std::logic_error'  
what():  basic_string::_S_construct NULL not valid
Run Code Online (Sandbox Code Playgroud)

如何更改此类以便将NULL转换为""而不是抛出logic_error异常?

(后记:正如你所怀疑的那样,"真正的"实现比这个例子复杂一点,在构造函数中有几个参数,用_str做更多有趣的事情 - 并正确地保持私有.这个例子背后的动机是我们团队中的程序员将倾向于在此上下文中使用NULL以用于历史目的,并且编译器不会捕获这一点.重新训练每个人总是使用""是相对困难的.或者,一个聪明的解决方案将很容易)

c++ string stl

4
推荐指数
3
解决办法
4814
查看次数

标签 统计

c++ ×3

c ×1

closures ×1

functional-programming ×1

lex ×1

optimization ×1

parsing ×1

python ×1

sizeof ×1

stl ×1

string ×1

yacc ×1