Ошибка в золотом парсере? LALR - PullRequest
0 голосов
/ 03 августа 2009

Вот кусок моего БНФ грамматика.

//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 ]

2 голосов
/ 05 августа 2009

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

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

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

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

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

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

0 голосов
/ 03 августа 2009

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

<ter-stmnt>     ::= <bool-val> '?' <rval> ':' <rval>
<bool-val>      ::= <rval>
<rval>  ::= '!'
...