Tôi đang viết một ngữ pháp trong YACC (thực sự là Bison), và tôi đang gặp vấn đề về ca/giảm. Nó kết quả từ bao gồm các toán tử tăng và tăng hậu tố. Dưới đây là một phiên bản cắt giảm của ngữ pháp:Làm cách nào để sửa YACC shift/giảm xung đột từ toán tử tăng sau?
%token NUMBER ID INC DEC
%left '+' '-'
%left '*' '/'
%right PREINC
%left POSTINC
%%
expr: NUMBER
| ID
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| INC expr %prec PREINC
| DEC expr %prec PREINC
| expr INC %prec POSTINC
| expr DEC %prec POSTINC
| '(' expr ')'
;
%%
Bison nói với tôi có 12 ca/giảm xung đột, nhưng nếu tôi nhận xét ra các dòng cho increment postfix và sụt lần, nó hoạt động tốt. Có ai biết cách khắc phục xung đột này không? Tại thời điểm này, tôi đang xem xét việc chuyển sang trình tạo phân tích cú pháp LL (k), điều này làm cho nó dễ dàng hơn nhiều, nhưng các ngữ pháp LALR luôn có vẻ tự nhiên hơn nhiều khi viết. Tôi cũng đang xem xét GLR, nhưng tôi không biết về bất kỳ trình tạo phân tích cú pháp C/C++ GLR nào tốt.
Tôi sẽ đánh giá cao nếu các cử tri ít nhất sẽ đưa ra lý do ... – Zifre