为了处理语法规则:
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
答案 0 :(得分:2)
type
和stype
被声明为联合的attr
成员,其类型为node*
。因此,在针对这些非终端中的任何一个的操作的上下文中,$$
将被替换为类似x.attr
的内容(这只是一个例子,不要把它太多字面意思。)同样,在第一个操作中,$8
将替换为yystack[top-8].attr
之类的内容,因为$ 8也有attr
标记,为stype
。
因此$$.type
(或者,$$.<anything>
)必须是语法错误。 attr
是一个指针,因此$$-><something>
可能是正确的,但如果没有看到node
的定义,我就无法分辨。
另外,在stype
规则中,您设置了$$ = "INT"
,但$$
的类型为node*
,而不是char*
(除非,当然,node
是char
的typedef,但这似乎是错误的。)当你稍后将值视为指向{{1的指针时,似乎最终会导致段错误。 }}
我真的不清楚你认为node
可能意味着什么。也许您需要显示更多标题。
答案 1 :(得分:1)
除了rici的回答以及更直接回答标题中的问题之外,多个属性通常通过struct
传递,因此如果您更改与type
非终端关联的值例如ctype
(%type <ctype> type
)和stype
到type
(%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; }
;
,但这通常是在解析器堆栈中传播多个属性的方法。