Неоднозначность в грамматике ANSI C YACC - PullRequest
2 голосов
/ 24 апреля 2019

Я смотрю грамматику ANSI C YACC. И есть кое-что, чего я не понимаю. http://www.lysator.liu.se/c/ANSI-C-grammar-y.html#expression

assignment_expression
    : conditional_expression
    | unary_expression assignment_operator assignment_expression
    ;

constant_expression
    : conditional_expression
    ;

Вот правила для выражения присваивания и константного выражения. Мой вопрос заключается в том, как они оба могут использовать conditional_expression, чтобы уменьшить? Если токен уменьшен до условного выражения, после того, как токен уменьшен, как YACC-парсер узнает, как уменьшить токен дальше между assignment_expression и constant_expression? Я думаю, что мне не хватает чего-то огромного, но я не могу найти это сам. Спасибо

Ответы [ 2 ]

4 голосов
/ 24 апреля 2019

Нет никакой двусмысленности, потому что нет контекста, в котором могут появляться как assignment_expression, так и constant_expression.

Нет ничего плохого в том, чтобы иметь правила вида

a: z;
b: z;
c: z;

, если a, b и c, все появляются в разных контекстах. Если у вас есть следующее

t: a | b | c;

тогда есть проблема. Но ничего подобного для conditional_expression.

нет
2 голосов
/ 24 апреля 2019

Грамматика EBNF может иметь несколько действительных правил / состояний одновременно. Это означает, что в этом случае, если она находит условное выражение, она может одновременно сопоставлять assignment_expression и constant_expression. Чтобы получить уникальный ответ, правила, использующие эти два правила, должны быть достаточно конкретными, чтобы сопоставить заданную входную последовательность только с одной последовательностью правил, или вы можете использовать приоритеты для выбора одной последовательности правил из нескольких возможных последовательностей.

...