Parsing 在yacc/bison中传递多个属性
为了处理语法规则:Parsing 在yacc/bison中传递多个属性,parsing,attributes,bison,yacc,Parsing,Attributes,Bison,Yacc,为了处理语法规则: type : ARRAY '[' integer_constant RANGE integer_constant ']' OF stype { $$ = $8 } | stype { $$ = $1 } ; 我需要向上传递type属性(正如我现在所做的),但我还需要向上传递数组的范围,以便检查数组边界。 为了实现以下目标,我尝试了各种方法来使用struct: type
type : ARRAY '[' integer_constant RANGE integer_constant ']' OF stype { $$ = $8 }
| stype { $$ = $1 }
;
我需要向上传递type属性(正如我现在所做的),但我还需要向上传递数组的范围,以便检查数组边界。
为了实现以下目标,我尝试了各种方法来使用struct:
type : ARRAY '[' integer_constant RANGE integer_constant ']' OF stype { $$.type = $8; $$.range[0] = $3; $$.range[1] = $5; }
| stype { $$.type = $1 }
;
但是每件事都会导致错误,我很难找到正确的方法来处理这个问题
谁能给我指出正确的方向吗?
提前谢谢
parse.y:
类型
和stype
被声明为联合体的attr
成员,该联合体的类型为节点*
。因此,在这些非终端的操作上下文中,$$
将被类似于x.attr
的内容所取代(这只是一个示例,不要太直截了当)。类似地,在第一个操作中,$8
将被替换为类似于yystack[top-8].attr的内容,因为$8还有标签attr
,是一个stype
因此,$$。type
(或者实际上,$$。
)必须是语法错误attr
是一个指针,因此它可能是$$->
正确的,但是如果没有看到节点的定义,我就无法判断
另外,在stype
规则中,您设置了,例如,$$=“INT”
,但是$$
类型是节点*
,而不是字符*
(当然,除非节点
是字符
的typedef,但这似乎是错误的。)似乎最终会导致segfault,稍后将该值视为指向节点的指针时
我真的不清楚你认为的$$范围可能是什么意思。也许您需要显示更多的标题。除了rici的答案和更直接地回答标题中的问题外,多个属性通常通过结构传递,因此如果您将与类型
非终端相关的值更改为例如ctype
(%type类型
)和stype
到type
(%type stype
)(我认为这是您的意图),然后将以下内容添加到您的%union
struct { int is_array, low, high; char * type; } ctype;
然后,您可以将类型的定义更改为
type
: ARRAY '[' integer_constant RANGE integer_constant ']' OF stype
{ $$.is_array = 1; $$.low = $3; $$.high = $5; $$.type = $8; }
| stype
{ $$.is_array = 0; $$.low = $$.high = -1; $$.type = $1; }
;
当然,为了正确处理新的ctype
,还需要进行更多的更改,但这通常是将多个属性向上传播到解析器堆栈的方法