You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用C编写自定义语言编译器前端:如何检查函数体内变量是否已声明?

函数体变量声明检查的解决方案

栈式名字表的作用

栈式名字表正是解决这类作用域嵌套问题的标准方案,完全适配你当前的需求——它能清晰区分全局作用域、函数参数作用域、函数体局部作用域的变量。

具体实现流程

  • 全局初始化:维护一个名字表栈,初始时将全局名字表压入栈中,处理全局变量时直接操作栈顶的全局表(沿用你原有的<Assign>规则逻辑)。
  • 函数定义处理:
    1. 解析到函数参数列表时,创建一个新的局部名字表,压入栈顶。
    2. 逐个将函数参数插入这个新的局部表,标记为参数类型。
    3. 进入函数体后,所有变量声明和引用操作都针对栈顶的局部表进行。
  • 变量检查逻辑:
    1. 遇到变量引用时,从栈顶的名字表开始向下遍历(先查局部,再查全局)。
    2. 找到匹配的名字则判定为已声明;遍历至栈底仍无匹配,抛出未声明错误。
    3. 遇到变量声明(即<Assign>中带<VariableDeclarator>的情况),直接将变量插入当前栈顶的名字表即可。
  • 函数体处理完毕:将栈顶的局部名字表弹出,回到上层作用域(全局或外层函数)。

适配现有EBNF规则

你的<Assign>规则无需修改,只需在解析上下文上做区分:

当处于函数体内部时,<Assign>对应的变量声明/检查操作都指向栈顶的局部名字表;全局环境下则操作全局名字表。

额外注意点

  • 每个名字表条目需记录变量的作用域层级,避免局部变量覆盖全局变量时的误判。
  • 若后续支持嵌套函数,只需遵循相同的“压入新表→处理→弹出”逻辑,内层函数可自动访问外层作用域的变量(通过栈遍历实现)。

内容的提问来源于stack exchange,提问作者NeTORT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:16:08