我开始用 Bison 编写一个简单的 LR(1) 解析器。在处理列表时,我使用了一个简单的向量实现,例如在解析表达式列表时:
tuple-expression-list: expression[first] ',' expression[second] {
foo_vector_init(&$$);
foo_vector_push_back(&$$, $first);
foo_vector_push_back(&$$, $second); }
tuple-expression-list: tuple-expression-list[list] ',' expression[expr] {
foo_vector_push_back(&$list, $expr); $$ = $list; }
这工作得很好。但随后语法发生了变化,我不得不使用 GLR 解析器。突然,编译器抱怨说$list
是常量。我发现对于 GLR 解析器:
- 当解析器拆分操作被记录并且不执行时,直到:
- 除了一个解析器外,其他人都死了
- 两个解析器合并
- 永远不应该
yyval
在一个动作中进行修改(这是前瞻)。
问题:
- 当我永远不必合并时,我确定只执行导致最终解析的操作吗?
- 首先分配
$list
给局部变量是有效的修复,还是应该深度复制向量?