1

为了处理语法规则:

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

我需要传递类型属性(就像我现在所做的那样),但我还需要传递数组的范围以检查数组边界。我已经尝试了各种使用结构的方法来实现以下目标:

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

4

2 回答 2

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是 的 typedef char,但这似乎是错误的。)当您稍后将该值视为指向 a 的指针node

我真的不清楚你的想法$$.range可能意味着什么。也许您需要显示更多标题。

于 2013-04-16T20:04:27.977 回答
1

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

当然,必须进行更多更改才能正确处理 new ctype,但这通常是在解析器堆栈中传播多个属性的方式。

于 2013-04-16T23:58:56.987 回答