一行中的多语句

时间:2013-06-12 16:41:08

标签: bison yacc

我的代码出了什么问题? - 它正确编译'while'结构 - 它正确编译冒号的separeted语句 - 但如果冒号separeted语句处于'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; }
    ;

1 个答案:

答案 0 :(得分: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(除非你有一些黑客在行末端插入冒号)。