我试图用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冲突。这样也许能帮你暂时解决问题。