Flex / Bison:以逗号分隔的链表?

时间:2013-02-06 12:29:34

标签: c linked-list bison flex-lexer

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

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,因此每个链接列表项都会安全地添加到链接列表中吗?

如果没有,为什么要用正确的语法来完成这个?

1 个答案:

答案 0 :(得分:1)

你的语法很好:没有其他方法来构建column_expression_list而不是你的两个规则中的第一个,因为第二个要求已经被“识别”。当然,如果你在其他地方有column_expression_list的其他规则,情况可能会有所不同。

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