Давайте представим, я хочу, чтобы иметь возможность анализировать значения, как это (каждая строка представляет собой отдельный пример):Уменьшить/уменьшить конфликт в грамматике
x
(x)
((((x))))
x = x
(((x))) = x
(x) = ((x))
Я написал эту грамматику YACC:
%%
Line: Binding | Expr
Binding: Pattern '=' Expr
Expr: Id | '(' Expr ')'
Pattern: Id | '(' Pattern ')'
Id: 'x'
Но я получаю свёртка/свёртка конфликт:
$ bison example.y
example.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
Любой намек на то, как ее решить? Я использую GNU bison 3.0.2
Спасибо, теперь понятно. В реальных грамматических шаблонах и выражениях схожи, но не идентичны (они генерируют разные узлы в AST). Включение анализатора GLR в бизоне действительно решает проблему (я думаю, что производительность будет не так хороша, но мне все равно, если это упростит грамматику). – tokland