Ошибка в золотом парсере? LALR

Вот часть моего BNF грамматика.

//this works
<ter-stmnt>     ::= <rval> '?' <rval> ':' <rval>
//this gets an error
<ter-stmnt>     ::= <bool-val> '?' <rval> ':' <rval>
<bool-val>      ::= <rval>

Это кажется безумным, разве второе не должно быть точно таким же, как первое? я предпочитаю второй bc при чтении, я вижу, что я ожидаю значение bool в отличие от общего rval, который может означать что угодно.

Я использую Gold Parser 3.4.4

2 ответа

Ошибка, которую вы получаете:

Уменьшить-уменьшить конфликт
'?' может следовать более чем одному выполненному правилу. Ошибка Reduce-Reduce возникает, когда грамматика допускает одновременное сокращение двух или более правил для одного и того же токена. Грамматика неоднозначна. Пожалуйста, смотрите документацию для получения дополнительной информации.

Он говорит, что после того, как он оценил некоторые токены, он не может решить, читать ли он просто <bool-val> или читать <rval>,

Чтобы иметь больше смысла, ваша грамматика должна сказать, что <bool-val> есть, а потом сказать, что <rval> это <bool-val> или другие вещи.

Вот еще один пример ошибки уменьшения / уменьшения и вот документация GOLD. Золото будет пытаться скрыть (то есть выдать предупреждение вместо ошибки) о сдвиге / уменьшении, но рассматривает уменьшение / уменьшение как ошибку.

Я не совсем понимаю это; Я новичок в разборе. Может быть, вы правы насчет этого неожиданного поведения? Тем не менее, список рассылки GOLD, кажется, в данный момент недоступен, возможно, потому, что он модерируется, а Девин не работает в течение нескольких месяцев.

Какая у вас ошибка? Можете ли вы включить весь файл грамматики? Я не получаю никакой ошибки, если я объявляю правила как...

<ter-stmnt>     ::= <bool-val> '?' <rval> ':' <rval>
<bool-val>      ::= <rval>
<rval>  ::= '!'
Другие вопросы по тегам