在没有完整C解析器的情况下检测C声明的开始和结束

我想部分解析C声明和/或函数定义的列表.

也就是说,我想将其拆分为子串,每个子串包含一个声明或函数定义.

然后将每个声明(单独)传递给另一个模块(它包含一个完整的C解析器,但我无法直接调用.)

显然我可以通过在我的程序中包含另一个完整的C解析器来做到这一点,但我希望避免这种情况.

到目前为止,我遇到的棘手案件涉及“}’是否终止声明/定义的问题.例如在

int main(int ac, char **av) {return 0;}

……’}’是终结者,而在…中

typedef struct foo {int bar;} *pfoo;

它不是.可能还有像这样的病态代码片段:

struct {int bar;} *getFooPtr(...) { /* code... */ }

笔记

>请假设在我的功能看到之前C代码已经完全预处理. (实际上它没有,但我们有一个解决方法.)
>我的解析器可能会在Lua中用LPeg实现

最佳答案 要在您的答案中扩展状态机来处理函数定义,请添加以下步骤:

>将fun / var state设置为’unknown’
>检查当前位置的角色
>如果是;;我们已经找到了声明的结尾,而不是函数定义(尽管可能是函数声明).
>如果是“或”,跳转到匹配的引号,必要时跳过转义序列.
>如果是(,[或{,跳转到匹配),]或}(必要时以递归方式跳过嵌套括号和字符串)
>如果fun / var state是’function’而我们刚刚跳过{..},我们已经找到了声明的结尾,并且它是一个函数定义
>如果fun / var状态为’unknown’而我们只是跳过(..),将fun / var状态设置为’function’.
>如果当前char是=或,,将fun / var state设置为’not-function`.
>前进到下一个输入字符,然后返回到2.

当然,这只适用于预处理后的代码 – 如果你有宏做了各种奇怪的事情还没有扩展,所有的赌注都是关闭的.

点赞