【问题标题】:Bison parse global variables and functionsBison 解析全局变量和函数
【发布时间】:2018-09-15 11:57:25
【问题描述】:

我正在构建一个编译器是为了好玩,我目前陷入了当多个全局变量或函数定义在单个文件 f.e. 中时如何解析的问题

int a;
int b;

int main(){
    int c;
}

我的野牛文件(简化)如下所示:

ROOT : GLOB { printf("%s\n", "ACCEPTED" }
     ;

VAR_DEC // Assume this matches correctly

FUNC_DEF // Assume this matches correctly

GLOB_STMNT : VAR_DEC {  }
           | FUNC_DEF {  }
           ; 

GLOB_LIST : GLOB_LIST GLOB_STMNT {  }
          | GLOB_STMNT {  }
          ;

GLOB : GLOB_LIST {  }
     ;

我的问题是,它总是只会减少 firstvar 声明,然后打印接受。关于如何改进最后 3 条规则以减少所有 3 条全局语句的任何想法?

【问题讨论】:

  • 为什么不为所有的规则做广告打印声明?它可以显示正在发生的事情。您还可以显示它发生的脚本吗?我们可能还想查看词法分析器定义。
  • @PaulOgilvie 我确实有打印语句,根据它们,一切都得到了正确的词法分析,语法几乎也相应地得到了​​解释。真的只是那一点造成了麻烦。
  • @PaulOgilvie 对不起,我必须道歉,你说得对,我在不同的规则中有一个错误。我忘了检查分号lol
  • 为什么你认为它只是减少了第一个声明?它将按顺序解析(并减少)所有GLOB_STMNT(不打印任何内容),然后(仅)减少ROOT并打印您的消息。

标签: c parsing compiler-construction grammar bison


【解决方案1】:

“yacc 解析器使用的算法鼓励所谓的左递归语法规则。以下形式的规则匹配此算法:

    seq : item 
        | seq item 
        ;

第一条规则仅针对第一项减少;对于第二个和所有后续项目,第二个规则会减少。”

所以你应该把你的规则写成:

GLOB_LIST : GLOB_STMNT {  }
          | GLOB_LIST GLOB_STMNT {  }
          ;

【讨论】:

  • 这仍然不起作用,它只会减少使用给定规则中的第一条规则
  • 好吧,我的错,我在解析 var_decs 时遇到了一些错误,哈哈,所以它起作用了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多