2

我的代码有什么问题?- 它正确编译'while'结构 - 它正确编译冒号分隔的语句 - 但如果冒号分隔的语句在'while'结构中,则报告语法错误。这里是:

0x363> while (a>b) { a=3 }
0x36e > a=3 : b=2
0x376 > while (a>b) { a=3 : b=2 }
syntax error

我想我的 stmt_list 是错误的 - 但正确的解决方案是什么?

注意:我不使用任何特殊的终端字符,例如 ';'

stmt:
    .....
    | WHILE '(' expr ')' stmt_list  { $$ = opr(WHILE, 2, $3, $5); }
    .....


stmt_list:
    stmt                { $$ = $1; }
    | stmt ':' stmt         { $$ = opr(':', 2, $1, $3); }
    | '{' stmt_list '}'     { $$ = $2; }
    ;
4

1 回答 1

1

您是否故意试图将语句列表限制为不超过两个语句?这对我来说似乎很奇怪。

此外,您的while陈述是模棱两可的,因为 stmt_list 可能是a=3 : b=2(没有{})。因此,以下是合法的,但可以通过两种方式解析:

while (a>b) while (c>d) a=b : c=d

我本来期望的是:

stmt:
   ...
   | while '(' expr ')' stmt  /* NOT stmt_list */
   ...
   | '{' stmt_list '}'
   ;

stmt_list:
   stmt
   | stmt_list ':' stmt
   ;

但是,这些都不能解释你的语法错误来自哪里。我怀疑答案与您如何将语句组合到程序中有关,因为您的示例表明程序不是 stmt_list (除非您有一些技巧可以在行尾插入冒号)。

于 2013-06-12T19:04:35.700 回答