我的代码出了什么问题? - 它正确编译'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; }
;
答案 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(除非你有一些黑客在行末端插入冒号)。