我想部分解析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.
当然,这只适用于预处理后的代码 – 如果你有宏做了各种奇怪的事情还没有扩展,所有的赌注都是关闭的.