порядок выполнения грамматики бизонов - PullRequest
0 голосов
/ 18 января 2020

У меня есть такая грамматика:

A : a B {int i = 0; printf("%d",i);};

B: and b B {i++; printf("%d",i);}
 | %empty 
 ;

введите a и b и b и b

output: 1230

мой вопрос: как изменить порядок исполнения иметь 0123

1 Ответ

2 голосов
/ 18 января 2020

Используйте левую рекурсию вместо правой рекурсии.

Бизон выполняет действия точно так, как вы говорите. Каждое нетерминальное действие выполняется точно, как только нетерминальное завершено.

Если вы используете праворекурсивное правило:

B: "and" b B

, тогда внешние B действие, которое печатает значение semanti c b, выполняется после внутреннего действия B, которое печатает значения semanti c следующих b s.

A Гораздо более естественный способ написать эту грамматику, которая имеет дополнительное преимущество в создании правильной ассоциативности:

A: a
 | A "and" b

Более того, действия в этой грамматике будут выполняться слева направо, потому что внутренняя * 1017 Действие * выполняется, как только оно завершено, то есть до того, как связанный b был даже замечен.

...