Порядок установки в конвертере bnf

У меня проблема с приоритетом правил в конвертере bnf. Здесь я копирую некоторые правила

CParams. CallParams ::= [CallParam] ;
separator CallParam "," ;
VarCParam. CallParam ::= Ident ;
ExpCParam. CallParam ::= Exp ;
BExpCParam. CallParam ::= BExp ;
[...]
EVar. Exp3 ::= Ident ;
[...]
BVar. BExp2 ::= Ident ;

Пишу пример программы:

void p(int a) {
    a = a+7;
    print a;
}
main() {
    int i;
    p(i);
}

В результате я ожидаю, что p(i) будет переведено в CParams [VarCParam (Ident "i")], но оно будет преобразовано в CParams [BExpCParam (BVar (Ident "i"))].

Не подскажете, как изменить правила, чтобы исправить эту ошибку?


person Heniek    schedule 02.04.2013    source источник


Ответы (1)


В вашей грамматике есть конфликт: возможны оба дерева. happy просто выберите один из способов, но, вероятно, во время компиляции напечатал что-то вроде этого:

reduce/reduce conflicts: 2

Чтобы исправить это, вы должны удалить одно из этих правил:

VarCParam. CallParam ::= Ident ;
BExpCParam. CallParam ::= BExp ;
BVar. BExp2 ::= Ident ;
person Grégoire    schedule 21.11.2013