加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:33:43 所属栏目:百科 来源:网络整理
导读:我想部分解析C声明和/或函数定义的列表. 也就是说,我想将其拆分为子串,每个子串包含一个声明或函数定义. 然后将每个声明(单独)传递给另一个模块(它包含一个完整的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.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读