Грамматический конфликт - Разрежьте Уменьшите конфликт Разрежьте золото
В приведенном ниже коде я получаю сведения о сокращении и уменьшении конфликтов. Я испробовал почти все идеи, которые я придумал, чтобы решить их, вот сообщение о проблеме, это преобразование парсера BNF->Gold. Любые идеи, направленные на его решение.
<Constructor> ::= <Type> '{' <SetCons_RecordCons_ArrayCons_Optional> '}'
<SetCons_RecordCons_ArrayCons_Optional> ::= <>
| <SetCons>
| <RecordCons>
| <ArrayCons>
!| <Type> '{' <SetCons> '}'
!| <Type> '(' <RecordCons> '}'
!| <Type> '(' <ArrayCons> ')'
!SetCons = SetElt {"," SetElt} Inclui o SetElt
<SetCons> ::= <Expr>
| <Expr> '..' <Expr>
| <Expr> ',' <SetCons>
| <Expr> '..' <Expr> ',' <SetCons>
!SetElt = Expr [".." Expr]
!<SetElt> ::= <Expr>
!| <Expr> '..' <Expr>
!RecordCons = RecordElt {"," RecordElt} inclui o recordElt
<RecordCons> ::= <Expr>
| <Expr> <RecordCons>
| <Expr> ',' <RecordCons>
| Id ':=' <Expr> ',' <RecordCons>
!RecordElt = [Id ":="] Expr
!<RecordElt> ::= <Expr>
! | Id ':=' <Expr>
!ArrayCons = Expr {"," Expr} ["," ".."]
<ArrayCons> ::= <Expr> ',' <ArrayCons>
| <Expr> ',' '..'
| <Expr>
Вот отчет:
2. Reduce-Reduce conflict for the symbol '}'
Productions in Conflict
When the parser encounters '}', more than one production can be completed (reduced):
<SetCons> ::= <Expr> •
<RecordCons> ::= <Expr> •
<ArrayCons> ::= <Expr> •
Reduce Production #1
The production below can be followed by '}' :
<SetCons> ::= <Expr> •
Because... '}' directly follows <SetCons_RecordCons_ArrayCons_Optional>.
<Constructor> ::= <Type> '{' • <SetCons_RecordCons_ArrayCons_Optional> '}'
Reduce Production #2
The production below can be followed by '}' :
<RecordCons> ::= <Expr> •
Because... '}' directly follows <SetCons_RecordCons_ArrayCons_Optional>.
<Constructor> ::= <Type> '{' • <SetCons_RecordCons_ArrayCons_Optional> '}'
Reduce Production #3
The production below can be followed by '}' :
<ArrayCons> ::= <Expr> •
Because... '}' directly follows <SetCons_RecordCons_ArrayCons_Optional>.
<Constructor> ::= <Type> '{' • <SetCons_RecordCons_ArrayCons_Optional> '}'
1 ответ
Решение
Диагноз Gold Parser, кажется, довольно подробный, и он, безусловно, содержит всю необходимую информацию.
Но проще говоря, любой из SetCons
, RecordCons
или же ArrayCons
может быть Expr
, Таким образом, возможно, что ввод будет простым:
<Type> { <Expr> }
в этом случае парсер не может знать, какой из этих трех нетерминалов он должен уменьшить Expr
к.