%type <node> Block这个语句在干什么
时间: 2023-06-25 08:06:51 浏览: 28
这条语句是在声明一个新的类型 `<node>`,该类型是指向 `Block` 结构体的指针。这通常是在编写编译器时使用的,用于表示抽象语法树(AST)的节点类型。在 Bison 中,`%type` 是用于指定文法规则的语法分析栈上的符号类型的指令。在这个例子中,`<node>` 表示 `Block` 的语法分析栈上的符号类型。这样做是为了在语法分析时创建 AST 的节点,在后续的语义分析和代码生成阶段使用。
相关问题
%type <node> DEFLIST这是什么
这段代码是在使用 Bison 工具生成语法分析器时使用的,用于指定某个非终结符号的类型。其中,`DEFLIST` 是一个非终结符号,`<node>` 则是用来指定该非终结符号的类型为语法树节点。
在 Bison 的语法规则中,可以使用非终结符号来描述源代码中的语法结构。在使用非终结符号时,需要指定该非终结符号的类型。类型可以是任何数据类型,比如整数、字符串、结构体等等。在 Bison 中,可以使用 `%type` 命令来指定非终结符号的类型,并且可以使用 `<类型>` 的方式来访问该类型。
在这段代码中,`<node>` 用于指定 `DEFLIST` 非终结符号的类型为语法树节点。这意味着在语法分析器中,每次分析到 `DEFLIST` 非终结符号时,都会生成一个表示该节点的语法树节点,并将其存储在 Bison 自动生成的语法分析器中。
例如,假设有以下的 Bison 语法规则:
```
deflist : def
| deflist def
;
def : TYPE ID '=' expr ';'
;
```
在这个语法规则中,`deflist` 和 `def` 都是非终结符号。而 `def` 表示一个变量定义,包含类型、标识符和表达式等信息。在使用 `%type` 命令时,可以指定 `def` 非终结符号的类型为语法树节点,以便在语法分析器中进行使用。
例如,在语法分析器中,如果需要访问一个 `deflist` 节点的子节点,可以使用以下代码:
```c
ast_node* node = create_deflist_node();
for (int i = 1; i <= $1.number; i++) {
ast_node* def_node = $i.node;
add_child_node(node, def_node);
}
```
在上述代码中,`$1` 表示规则中的第一个表达式,即 `deflist` 的子节点个数。由于 `deflist` 的类型为语法树节点,因此可以通过访问 `$i.node` 来获取其第 i 个子节点的语法树节点,并通过 `add_child_node` 函数将其添加到 `deflist` 节点的子节点中。
%token <str> INT VOID CONST IF ELSE WHILE BREAK CONTINUE RETURN ID OCTAL_CONST HEX_CONST DEC_CONST %right <str> ASSIGN %left <str> OR %left <str> AND %left <str> EQNEQ %left <str> CMP %left <str> ADDSUB %left <str> MULDIVSUR %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
这是一个语法定义文件,用于描述编程语言的语法结构。具体来说:
- %token:用于定义词法单元(token),例如 INT、VOID、ID 等。
- %type:用于定义语法规则的返回值类型,例如 Number、CompUnit、Decl、FuncDef 等。
- %left 和 %right:用于定义运算符的结合性和优先级。
- 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:用于描述一元表达式。
- FuncRParams:用于描述函数实参。
- UNARYOP:用于描述一元运算符。
- CommaExpBlock:用于描述逗号表达式块。
- MulExp:用于描述乘法表达式。
- RelExp:用于描述关系表达式。
- EqExp:用于描述相等表达式。
- LAndExp:用于描述逻辑与表达式。
这样的语法定义文件可以被编译器使用,用于从词法单元中识别出语法结构,进而生成相应的中间代码和目标代码。