У меня есть эта грамматикаКак исправить этот YACC конфликта сдвиг/
value
: INTEGER
| REAL
| LEFTBRACKET value RIGHTBRACKET
| op expression
| expression binaryop expression
;
и я получаю этот сдвиг уменьшить ошибку
47 expression: value .
53 value: LEFTBRACKET value . RIGHTBRACKET
RIGHTBRACKET shift, and go to state 123
RIGHTBRACKET [reduce using rule 47 (expression)]
$default reduce using rule 47 (expression)`
До сих пор я попытался установить% налево и% правильные приоритеты с не повезло. Я также попытался использовать новую грамматику для значения, которая не вызывает себя снова, но я получаю конфликты. Я попробовал this решение слишком
любые мысли?
Спасибо заранее
EDIT
expression
: lvalue
| value
;
lvalue
: IDENTIFIER
| lvalue LEFTSQBRACKET expression RIGHTSQBRACKET
| LEFTBRACKET lvalue RIGHTBRACKET
binaryop
: PLUS
| MINUS
| MUL
| DIVISION
| DIV
| MOD
;
мне удалось преодолеть большую часть конфликта, используя эту грамматику, но я все еще получаю конфликт я упомянул выше
binaryop
: expression PLUS expression
| expression MINUS expression
| expression MUL expression
| expression DIVISION expression
| expression DIV expression
| expression MOD expression
;
Используйте грамматику нормального выражения, вместо того чтобы пытаться изобрести свою собственную. Примеры изобилуют. – EJP
Вы все еще не используете ничего, что я признаю грамматикой стандартного выражения. Такая вещь содержит произведения для выражения, термина, фактора и первичного. Повторяю, примеров достаточно. Эта проблема была решена в 1959 году. Не изобретайте велосипед. – EJP
Почему, по-вашему, вам нужны как 'значение', так и' lvalue'? Термин «lvalue» предполагает, что вы пытаетесь имитировать C, но в C разница между значениями r и l-значениями производится на семантическом уровне, а не в синтаксисе. – ach