如何设置flex / bison规则来解析逗号分隔的参数列表

时间:2011-06-04 02:29:47

标签: parsing bison yacc lex flex-lexer

我希望能够使用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 个答案:

答案 0 :(得分:3)

这听起来很简单。告诉我,如果我错过了什么或者我的例子不起作用

RvalCommaList:
          RvalCommaListLoop
    | '(' RvalCommaListLoop ')'

RvalCommaListLoop:
      Rval
    | RvalCommaListLoop ',' Rval

Rval: INT_LITERAL | WHATEVER

但是,如果您接受rvals以及此列表,则会产生冲突,使常规rval与单个项目列表混淆。在这种情况下,您可以使用下面的内容,要么在它们周围需要'('')',要么在列表之前需要2个项目

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

答案 1 :(得分:0)

我也想知道如何做到这一点,简单地思考一下,实现这一目标的一种方法是使用表单的链表,

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

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

并使用规则:

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

此解决方案在设计上非常类似于: Using bison to parse list of elements

硬比特是弄清楚如何处理(我推测)二进制AST的方案中的列表。

答案 2 :(得分:-1)

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

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

integer_loop
: INTEGER
| integer_loop COMMA INTEGER 
;
%%