2013-06-12 45 views
2

這有什麼錯我的代碼? - 它編譯正確的「而」結構 - 它編譯正確結腸separeted陳述 - 但如果報告語法錯誤結腸separeted語句是在一個「而」結構。它是:多語句在一條線上

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

你是想故意試圖限制語句列表,以不超過兩種說法?這對我來說似乎很奇怪。

此外,您的while聲明不明確,因爲stmt_list可能是(不含{})。因此,以下是合法的,但可以解析兩種方式:

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(除非你有一些hack在行尾插入冒號)。

+0

不,我不想限制語句列表兩個項目。我已經按照建議嘗試了,我在這裏複製粘貼:\t | WHILE'('expr')'stmt \t \t \t \t \t \t \t {$$ = opr(WHILE,2,$ 3,$ 5); } \t | '{' stmt_list \t '}' \t \t \t \t \t \t \t \t \t {$$ = $ 2; } \t |錯誤\t { \t \t的yyerror((字符*)yytext中); \t \t $$ = NULL; \t \t errorflag = 1; \t \t} \t; stmt_list: \t \t語句\t \t \t \t \t \t \t \t \t \t \t {$$ = $ 1; } \t | stmt_list ':' 語句\t \t \t \t \t \t \t \t {$$ = OPR( ':',2,$ 1,$ 3); } \t; – user2469202

+0

>但結果是一樣的:冒號導致錯誤 – user2469202

+0

@ user2469202:是的,我沒有想到的修復程序stmt_list將解決語法錯誤問題。查看我答案的最後一段。 – rici