使用Bison构建语法树时的$引用问题及C-语言编译器函数声明语法规则咨询
Bison构建语法树时的$引用问题及C-语言编译器函数声明语法规则咨询
看起来你正在着手搭建C-语言的完整编译器,找资料碰壁确实挺头疼的!先针对你贴出的这段函数声明的Bison语法规则片段,我来帮你梳理下相关问题:
首先,把你给出的语法片段整理成可读的代码块:
fun_declaracao: tipo_especificador ID APR { // Start of semantic action after parsing the return type (tipo_especificador), // the function name (ID), and the opening parenthesis (APR). // Initialize function type as "erro&
关于你遇到的核心问题,我给你一些实际的建议:
- 资料获取方面:其实不用到处找零散资料,Bison自带的官方示例里就有小型C语言编译器的完整框架,包含了从词法分析到语法树构建、语义检查的完整流程,完全可以作为C-编译器的参考模板,直接查看Bison的本地示例或官方文档案例就能找到。
- 语法规则与$引用的使用:你这段规则只写到了左括号(APR),完整的函数声明应该包含参数列表和右括号。在Bison的语义动作里,
$n对应语法规则中第n个符号的语义值,比如这里$1对应tipo_especificador(返回类型)的语义值,$2对应ID(函数名)的字符串,你可以利用这些引用来构建函数声明的语法树节点。比如初始化函数类型时,就可以基于$1的类型信息来设置,后续补充参数列表后,还能通过对应位置的$引用收集参数的类型和名称信息。 - 语法规则补充建议:你可以把函数声明的规则补全,比如:
fun_declaracao: tipo_especificador ID APR parametros FPR corpo_funcao { // 这里可以用$1(返回类型)、$2(函数名)、$4(参数列表)、$6(函数体)构建完整的函数节点 $$ = criar_no_funcao($1, $2, $4, $6); }
其中parametros是你需要定义的参数列表规则,corpo_funcao是函数体规则,criar_no_funcao是你自己实现的创建语法树节点的函数。
另外,如果你是刚入门编译器开发,建议先从简单的语法规则入手,比如先实现变量声明、表达式解析,再逐步扩展到函数声明和函数体,每一步都做小范围测试,这样更容易定位问题。
备注:内容来源于stack exchange,提问作者mafesm
相关产品推荐
相关产品推荐

