如何设置Flex/Bison规则以解析逗号分隔的参数列表

8
我希望能够使用flex/bison解析非空、一个或多个元素、逗号分隔(可选用括号包围)的列表。以下是一些可解析的列表示例:
1 1,2 (1,2) (3) 3,4,5 (3,4,5,6)
我使用以下规则来解析列表(最终结果是解析元素“顶级列表”),但在解析时似乎无法得到期望的结果(输入有效列表时会出现语法错误)。请问如何设置才能得到正确的结果?
cList :   ELEMENT
           {
              ...
           }
        | cList COMMA ELEMENT
           {
              ...
           }
        ;

topLevelList :  LPAREN cList RPAREN
                 {
                     ...                 
                 }
              | cList
                 {
                     ...
                 }
          ;
3个回答

5
这听起来很简单。如果我漏掉了什么或者我的例子不起作用,请告诉我。
RvalCommaList:
          RvalCommaListLoop
    | '(' RvalCommaListLoop ')'

RvalCommaListLoop:
      Rval
    | RvalCommaListLoop ',' Rval

Rval: INT_LITERAL | WHATEVER

然而,如果你接受rval以及这个列表,你将会面临一个冲突:将一个普通的rval与一个单项列表混淆。在这种情况下,你可以使用以下方法,它要求在其周围使用'('')',或者在成为列表之前需要2个项目。

RvalCommaList2:
      Rval ',' RvalCommaListLoop
    | '(' RvalCommaListLoop ')'

0

我也想知道如何做到这一点,简要思考后,实现这一点的一种方法是使用以下形式的链表:

struct list;
struct list {
    void *item;
    struct list *next;
};

struct list *make_list(void *item, struct list *next);

并使用规则:

{ $$ = make_list( $1, $2); }

这个解决方案在设计上与以下内容非常相似: 使用bison解析元素列表

难点在于如何处理(我假设是)二进制AST中的列表。


-2
%start input
%%
input:
%empty
| integer_list
;

integer_list
: integer_loop
| '(' integer_loop ')'
;

integer_loop
: INTEGER
| integer_loop COMMA INTEGER 
;
%%

你为什么要将换行符作为一个标记? - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接