2

如果我遍历 C++ 源文件并简单地查找变量类型,然后是正确的 C++ 变量名,是否会出现导致缺少变量或错误变量的情况,这需要适当的解析器来克服?

一个简单的测试用例正确地抓住了所有原语,但如果有很多我没有考虑过的无关用例,我宁愿不要投入太多时间。到目前为止,我只是在寻找关键字,获取下一个单词并检查名称的有效性。除了检查变量名的有效性之外,我没有使用正则表达式,并且我知道正则表达式不足以进行解析。

我的程序是用 Java 编写的。我做了这个程序的 Java 目标版本,并使用了 JavaParser,它工作得很好。我认为 ANTLR 或类似的东西对于仅在源中查找原始变量来说太过分了。

4

3 回答 3

3

您是否尝试在一行上声明多个变量?

int i, *j, k[2];

函数参数声明呢?

int func(int i, int j);

typedef 呢?

typedef int Integer;
Integer i;

在没有合适的解析器(而且相当复杂)的情况下解析 C++ 是很困难的。

于 2013-01-10T18:06:59.883 回答
2

函数参数,在同一行声明的多个变量,不同行的类型和变量名等怎么样?

于 2013-01-10T18:06:29.590 回答
2

基本的 C++ 声明语法不是简单的从左到右的<type> <identifier>语法。

如果这是 C++ 的语法,那么,例如,声明一个整数数组将使用类型int[]后跟标识符来完成:

int[] foo

声明一个函数意味着编写一个函数类型,例如int()后跟一个标识符:

int() foo;

取而代之的是,继承自 C 的 C++ 语法是一种称为“声明模仿使用”的风格

<type_identifier> <expression>;

声明中的表达式看起来像是您可以使用声明的实体的一种方式,并且这种用法将产生指定的类型。

例子:

int i;      // now the expression i has the type int
int (ii);   // now the expression (ii) has the type int, and so ii has the same type
int j();    // now the expression j() has type int, and therefore j has a function type
int k[3];   // now the expression k[3] has type int, and therefore k has an array type
int (*l)(); // the expression (*l)() has type int, and therefore (*l) has a function type, therefore l has a pointer-to-function type.

依此类推,涉及数组索引运算符、函数调用运算符、parens、解引用运算符、按位与运算符的任意复杂性,可能还有一些我不记得了。此外, const 和 volatile 可以在不同的地方加入。

更糟糕的是,声明语法可能会与初始化程序的语法发生奇怪的交互。例如,“最令人烦恼的解析”是一种情况,即初始化程序中的括号与声明函数类型所涉及的括号混淆。parens 是类型表达式的一部分还是初始化程序的一部分取决于其中使用的名称碰巧是什么:

struct bar {};
int baz() { return 1; }

int foo(bar());  // declaration of function (most vexing parse)
int foo2(baz()); // declaration of variable (initialized with baz())

当然还有其他人提到的问题;typedefs/类型别名、宏、嵌套声明、多重声明等。

于 2013-01-10T22:15:26.603 回答