在yacc / bison中传递多个属性

时间:2013-04-16 18:22:21

标签: parsing attributes bison yacc

为了处理语法规则:

type            : ARRAY '[' integer_constant RANGE integer_constant ']' OF stype { $$ = $8 }
                | stype { $$ = $1 }
                ;

我需要传递type属性(正如我现在所做)但我还需要传递数组的范围以检查数组边界。 我已经尝试了各种方法来使用结构来实现类似的东西:

type            : ARRAY '[' integer_constant RANGE integer_constant ']' OF stype { $$.type = $8; $$.range[0] = $3; $$.range[1] = $5; }
                | stype { $$.type = $1 }
                ;

但是一切都会导致错误和段错误,我很难找到正确的方法来处理这个问题

有人能指出我正确的方向吗? 提前谢谢。

parse.y:http://pastebin.com/XUUqG35s

2 个答案:

答案 0 :(得分:2)

typestype被声明为联合的attr成员,其类型为node*。因此,在针对这些非终端中的任何一个的操作的上下文中,$$将被替换为类似x.attr的内容(这只是一个例子,不要把它太多字面意思。)同样,在第一个操作中,$8将替换为yystack[top-8].attr之类的内容,因为$ 8也有attr标记,为stype

因此$$.type(或者,$$.<anything>)必须是语法错误。 attr是一个指针,因此$$-><something>可能是正确的,但如果没有看到node的定义,我就无法分辨。

另外,在stype规则中,您设置了$$ = "INT",但$$的类型为node*,而不是char*(除非,当然,nodechar的typedef,但这似乎是错误的。)当你稍后将值视为指向{{1的指针时,似乎最终会导致段错误。 }}

我真的不清楚你认为node可能意味着什么。也许您需要显示更多标题。

答案 1 :(得分:1)

除了rici的回答以及更直接回答标题中的问题之外,多个属性通常通过struct传递,因此如果您更改与type非终端关联的值例如ctype%type <ctype> type)和stypetype%type <type> stype)(我认为是您的意图),然后将以下内容添加到您的{ {1}}

%union

然后您可以将struct { int is_array, low, high; char * type; } ctype; 非终端的定义更改为

type

当然,必须进行更多更改才能正确处理新的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; } ; ,但这通常是在解析器堆栈中传播多个属性的方法。