Грамматический конфликт - Разрежьте Уменьшите конфликт Разрежьте золото

В приведенном ниже коде я получаю сведения о сокращении и уменьшении конфликтов. Я испробовал почти все идеи, которые я придумал, чтобы решить их, вот сообщение о проблеме, это преобразование парсера 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 к.

Другие вопросы по тегам