对于包含至少一个项目的逗号分隔列表,我有以下语法:
column_expression_list:
column_expression {
$$ = LinkedList_New();
LinkedListItem *item = LinkedListItem_New($1);
LinkedList_add($$, item);
}
|
column_expression_list T_COMMA column_expression {
LinkedListItem *item = LinkedListItem_New($3);
LinkedList_add($1, item);
}
;
column_expression_list
总是最终分解为column_expression
,因此每个链接列表项都会安全地添加到链接列表中吗?
如果没有,为什么要用正确的语法来完成这个?
答案 0 :(得分:1)
你的语法很好:没有其他方法来构建column_expression_list
而不是你的两个规则中的第一个,因为第二个要求已经被“识别”。当然,如果你在其他地方有column_expression_list
的其他规则,情况可能会有所不同。
在LR解析器的情况下,你更喜欢左递归而不是右递归:它们可以节省空间,并且在交互式解析器的情况下,它可以按照你想要的方式运行。例如,请参阅http://www.gnu.org/software/bison/manual/html_node/Recursion.html。