如何编写YACC语法来构建标记树等?

如何编写YACC语法来构建标记树等?,c,grammar,bison,yacc,C,Grammar,Bison,Yacc,我读过关于YACC的书,也看过一些简单玩具程序的例子。但我从未见过一个实际的例子来演示如何构建令牌树等等,使用谷歌搜索也不容易找到一个例子。有人能举一个例子说明如何使用YACC生成树吗?C或C++是很好的。 简单的答案是,你只需在语义动作中建立树,用这样的规则: expr: expr '+' expr { $0 = make_op_node(OP_ADD, $1, $3); } 这将得到以下实现功能的支持: Node* make_op_node(enum OP opcode, Node* l

我读过关于YACC的书,也看过一些简单玩具程序的例子。但我从未见过一个实际的例子来演示如何构建令牌树等等,使用谷歌搜索也不容易找到一个例子。有人能举一个例子说明如何使用YACC生成树吗?C或C++是很好的。

简单的答案是,你只需在语义动作中建立树,用这样的规则:

expr: expr '+' expr  { $0 = make_op_node(OP_ADD, $1, $3); }
这将得到以下实现功能的支持:

Node* make_op_node(enum OP opcode, Node* left, Node* right) {
  Node* rv = malloc(sizeof *rv);
  rv->opcode = opcode;
  rv->left = left;
  rv->right = right;
  return rv;
}

节点
结构很可能是一个有区别的
联合
,因为可能的操作码必须包括常量和标识符引用等内容。

简单的答案是,您只需在语义操作中构建树,规则如下:

expr: expr '+' expr  { $0 = make_op_node(OP_ADD, $1, $3); }
这将得到以下实现功能的支持:

Node* make_op_node(enum OP opcode, Node* left, Node* right) {
  Node* rv = malloc(sizeof *rv);
  rv->opcode = opcode;
  rv->left = left;
  rv->right = right;
  return rv;
}
节点
结构很可能是一个有区别的
联合
,因为可能的操作码必须包括常量和标识符引用等内容