我试图用YACC解析多维数组。这是我的左值定义:

    lvalue: ID { EM_debug("got lvalue identifier " + to_String($1));
            $$.My_VAR = A_SimpleVar($$.pos, $1);
            $$.size = 0;
            $$.name = $1;
        }
    | lvalue L_SQUARE_BRACKET exp R_SQUARE_BRACKET { EM_debug("got lvalue[exp]");
            $$.My_VAR = A_SubscriptVar($$.pos, $1.My_VAR, $3.My_AST);
            $$.size = $3.My_AST;
            $$.name = $1.name;
        }
    ;

对于(简化的)输入ia[2]它打印got lvalue identifier ia并在遇到左括号时给出解析错误。我不明白为什么这样不行。它应该看到左括号在它的展望和移动。它不应该像这样立即减少。我怎样才能防止它移动呢?

最佳答案

不要使用YACC来区分lval和rval。因为lval几乎总是rval,它在语法中创建reduce/reduce冲突,这使得它不具有确定性。
使用语义分析阶段检查lval的正确性,而不是将其合并到YACC语法中。
不过,为了便于参考,GNU Bison通过按文件中首先定义的规则减少来处理reduce/reduce冲突。这样也许能帮你暂时解决问题。

10-04 21:54