Мульти-оператор в строке

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

Другие вопросы по тегам