Как избавиться от ошибок уменьшения/уменьшения, уменьшения/сдвига?

Я продолжаю сталкиваться с проблемами уменьшения/уменьшения и сокращения/сдвига с моей грамматикой, но я не уверен, почему и как это исправить.

Вот что у меня есть

block ::=   
    block_statement
|   block_statement block
;
block_statement ::=
    type variable_declarators SEMICOLON
|   statement
;
statement ::=   sub_statement
|   IF LPAREN boolexp RPAREN statement FI
|   IF LPAREN boolexp RPAREN statement ELSE statement FI
|   WHILE LPAREN boolexp RPAREN statement ELIHW
|   FOR LPAREN assignment SEMICOLON boolexp SEMICOLON
        statement_expression RPAREN statement ROF
;
sub_statement ::=
    statement_expression SEMICOLON
|   RETURN Exp SEMICOLON
|   block
;
statement_expression ::=
    assignment
|   IDENTIFIER LPAREN argument_list RPAREN
|   IDENTIFIER PLUSPLUS
|   IDENTIFIER MINUSMINUS
;

person Paul    schedule 04.07.2015    source источник
comment
Я вижу, что это нотация CUP (не flex или bison). Вам не хватает правил для arguments_list, type, boolex, Exp, variable_declarators и присваивания. Можете ли вы сделать меньший пример, чтобы проиллюстрировать проблему? Упрощая, вы узнаете, где находятся конфликты.   -  person Brian Tompsett - 汤莱恩    schedule 05.07.2015
comment
В CUP вы можете использовать параметры -dump_states и -dump_grammar, чтобы точно определить, какие правила вызывают неоднозначность. С этими подробностями вы сможете задать более конкретный вопрос, на который мы сможем ответить.   -  person Brian Tompsett - 汤莱恩    schedule 06.07.2015


Ответы (1)


В этой грамматике block есть block_statement есть statement есть sub_statement есть block и вы можете ходить вокруг этого конкретного тутового куста сколько угодно долго, так ничего и не решив.

Поэтому, естественно, у вас возникают конфликты, поскольку ваша грамматика неоднозначна.

Возможно, вы имели в виду, что sub_statement включает какой-то блок с разделителями? (BEGIN block NIGEB?) В противном случае я бы предложил удалить block из списка sub_statement альтернатив.

person rici    schedule 05.07.2015
comment
Спасибо Ричи. Я корю себя за то, что не заметил этого. :-) - person Brian Tompsett - 汤莱恩; 07.07.2015