Как заставить ELSE ассоциироваться с самым дальним IF в yacc? - PullRequest
1 голос
/ 02 августа 2011

Теперь я знаю, как заставить ELSE связываться с ближайшими IF:

%nonassoc IFX
%nonassoc ELSE

| IF stmt %prec IFX
| IF stmt ELSE stmt

Но как мне заставить ELSE связываться с самыми дальними IF?

Я пыталсяпереключить порядок двух %nonassoc выше, но после этого, если кажется, что не удается распознать какое-либо действительное утверждение в формате th IF stmt ELSE stmt.

Почему?

Как это сделатьэто правильно?

1 Ответ

1 голос
/ 21 августа 2011

(не проверено) Вам нужно заставить bison генерировать синтаксический анализатор, который уменьшает операторы if, если существует неоднозначность между несколькими if с.Согласно http://www.delorie.com/gnu/docs/bison/bison_85.html этого можно достичь, если правило IF stmt имеет более высокий приоритет, чем токен ELSE.Так что

%nonassoc ELSE
%nonassoc IFX

| IF stmt %prec IFX
| IF stmt ELSE stmt

должны сделать свое дело.

...