我希望能够使用flex / bison解析规则解析非空的,一个或多个元素,逗号分隔(以及可选的括号)列表。
一些例如可解析列表:等
我使用以下规则来解析列表(最终结果是解析元素'顶级列表'),但它们在解析时似乎没有给出所需的结果(我在提供有效列表时遇到语法错误)。关于如何设置它的任何建议?
cList : ELEMENT
{
...
}
| cList COMMA ELEMENT
{
...
}
;
topLevelList : LPAREN cList RPAREN
{
...
}
| cList
{
...
}
;
答案 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
;
%%