2016-11-14 9 views
0

У меня есть эта грамматикаКак исправить этот 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 
    ; 
+0

Используйте грамматику нормального выражения, вместо того чтобы пытаться изобрести свою собственную. Примеры изобилуют. – EJP

+0

Вы все еще не используете ничего, что я признаю грамматикой стандартного выражения. Такая вещь содержит произведения для выражения, термина, фактора и первичного. Повторяю, примеров достаточно. Эта проблема была решена в 1959 году. Не изобретайте велосипед. – EJP

+0

Почему, по-вашему, вам нужны как 'значение', так и' lvalue'? Термин «lvalue» предполагает, что вы пытаетесь имитировать C, но в C разница между значениями r и l-значениями производится на семантическом уровне, а не в синтаксисе. – ach

ответ

2

Почему у вас есть как value, так и expression? Не видя остальной грамматики, я не решаюсь угадать использование expression, что приводит к конфликту, но я предполагаю, что это связано с ненужным производством единицы.

С другой стороны, вы не сможете устранить прецеденты, если вы запустите все терминалы оператора в binaryop (если все двоичные операторы не имеют одинакового приоритета). Поэтому я предлагаю вам найти грамматику стандартного выражения (например, в пособии бизона или википедии) и использовать ее в качестве базы.

+0

Я обновил код с большим количеством грамматики – mnmbs

+0

Я все еще думаю, что у вас избыток нетерминалов, но основная проблема, которая довольно хорошо показана в выводе bison, заключается в том, что ' (...) 'неоднозначно; когда синтаксический анализатор видит близкий парик, он не имеет представления о том, какой нетерминал должен уменьшить прилагаемое выражение. – rici

+0

Как я могу решить конфликт с круглой скобкой? Даже когда я пытался немного изменить грамматику, чтобы исправить конфликты с операторами, я все равно получаю конфликт каждый раз, когда я использую что-то вроде LEFTBRACKET ... RIGHTBRACKET – mnmbs