Ошибка в золотом парсере? 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> ::= '!'