0

对于包含至少一项的逗号分隔列表,我有以下语法:

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总是最终分解为 acolumn_expression并因此每个链表项将始终安全地添加到链表中?

如果不是,那么完成此操作的正确语法是什么?

4

1 回答 1

1

您的语法很好:除了您的两条规则中的第一条之外,没有其他方法可以构建column_expression_list,因为第二条要求已经“识别”了一条。当然,如果您在其他地方有关于 的其他规则column_expression_list,情况可能会有所不同。

在 LR 解析器的情况下,您更喜欢左递归而不是右递归是正确的:它们节省空间,并且在交互式解析器的情况下,按照您想要的方式运行。例如,参见http://www.gnu.org/software/bison/manual/html_node/Recursion.html

于 2013-02-08T07:59:04.727 回答