Мульти-оператор в строке
Что не так с моим кодом? - он правильно компилирует структуру 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; }
;
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 (если у вас нет хака для вставки двоеточий в конце строки).