Я пытаюсь изучить основы , но я быстро застрял.Решение конфликтов разбора в крошечной грамматике Lemon
Вот маленькая грамматика:
%right PLUS_PLUS.
%left DOT.
program ::= expr.
member_expr ::= expr DOT IDENTIFIER.
lhs_expr ::= member_expr.
expr ::= lhs_expr.
expr ::= PLUS_PLUS lhs_expr.
Это вызывает 1 разбор конфликта:
State 3:
(3) expr ::= lhs_expr *
(4) expr ::= PLUS_PLUS lhs_expr *
DOT reduce 3 expr ::= lhs_expr
DOT reduce 4 ** Parsing conflict **
{default} reduce 4 expr ::= PLUS_PLUS lhs_expr
В то время как, если я перепишем последнее правило следующим образом:
expr ::= PLUS_PLUS expr DOT IDENTIFIER.
Затем он вызывает конфликтов нет. Но я не думаю, что это правильный путь.
Буду признателен, если кто-нибудь сможет объяснить, что именно, и почему.
Предлагаю вам подумать об этом без дополнительных имен для вещей. Всюду, где у вас есть 'lhs_expr', вы можете просто написать' expr DOT IDENTIFIER', чтобы четко видеть, что действительно задают. Если все в терминах «expr», вы можете видеть конфликт более четко. –
Вещь, 'lhs_expr' может быть чем-то иным, чем' expr DOT IDENTIFIER'. Эта конкретная грамматика не содержит других правил для нее, потому что я хотел, чтобы она была очень минимальной, но она также может быть, например, 'IDENTIFIER' или' expr LBRACKET expr RBRACKET' и т. Д. И я хочу написать правило 'PLUS_PLUS lhs_expr' только один раз и покрыть все возможные левые выражения, предварительно предваряемые. –