Exp : AddExp {$$=$1;}; bison代码报错$$ of 'Exp' has no declared type是为什么
时间: 2023-09-06 14:09:48 浏览: 132
这个错误通常是因为 bison 没有正确的识别出 Exp 类型。可能原因是在 bison 文件中,没有定义 Exp 类型的语法规则或者在 bison 文件中没有包含定义 Exp 类型的头文件。解决方法是检查 bison 文件和相关头文件中是否正确地定义了 Exp 类型,并检查是否正确地使用了它。如果问题仍然存在,可以考虑提供更多的代码和错误信息以便更好地帮助解决问题。
相关问题
Exp : AddExp {$$=$1;}; Cond : LOrExp {$$=$1;};是什么意思
这是一段类似于语法定义的代码,通常用于编译器的语法分析部分。其中,"Exp"代表表达式,"Cond"代表条件语句,"$1"代表规则中的第一个子规则的计算结果。具体来说,这段代码定义了一个名为"AddExp"的规则,它的计算结果是第一个子规则的计算结果;还定义了一个名为"Cond"的规则,它的计算结果是第一个子规则的计算结果。这里的子规则指的是在定义"Exp"和"Cond"规则时所引用的其他规则。例如,"LOrExp"可能是另一个规则的名称。
%type<node> Number CompUnit Decl FuncDef ConstDecl VarDecl ConstDef ConstDefBlock ConstExpBlock ConstInitVal ConstExp ConstInitFlag ConstValBlock VarDef VarDefFlag InitVal Exp InitValFlag InitValBlock FuncFParams Block FuncFParam FuncFParamBlock ExpBlockFlag ExpBlock BlockItemBlock BlockItem Stmt LVal ExpFlag StmtFlag Cond AddExp LOrExp PrimaryExp UnaryExp FuncFParamsFlag FuncRParams UNARYOP CommaExpBlock MulExp RelExp EqExp LAndExp
这段代码是用来声明 Yacc 语法规则中每个非终结符的类型。在这个声明中,我们使用了 %type 关键字,后面跟着一个类型标记和一个非终结符的名称。
类型标记可以是任何在 Yacc 语法规则中定义过的类型,例如 int、char、struct 等。在这个例子中,我们使用了类型标记 node,这个 node 类型应该在 %union 声明中定义过了。
对于每个非终结符,我们都需要指定它的类型。这样,在语法规则中使用 $$ 变量时,Yacc 就知道如何将不同类型的节点合并成一个 AST。例如,在以下语法规则中:
```
expression:
INTEGER { $$ = newASTNode(NUMBER, $1); }
...
```
我们使用了 newASTNode 函数来创建一个 AST 节点,其中的类型为 NUMBER,值为 $1。根据我们在 %type 中声明的类型,Yacc 就知道如何将这个节点合并到 AST 中。
在使用 %type 声明时,我们可以使用 <...> 语法来指定类型标记。这个类型标记会被传递给 Yacc 中的代码段,以便在生成 AST 时使用。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)