我是Flex / Bison的新手,我正在尝试解析以下格式的字符串:
COMMAND ARG1, ARG2, ARGn (, ARGn+1, ARGn+2 ...);
这样args 1,2和n是必需的,但是n + 1,n + 2,...是可选的,没有限制。
我如何在Flex / Bison中执行此操作?
当我将语法定义为:
args:
ARG
|
ARG COMMA args
;
var_command:
COMMAND ARG COMMA ARG COMMA args SEMICOLON
{
printf("arg1: %s, arg2: %s\n", $2, $4);
}
我只能(如上所述)引用前两个参数,如何引用args:
定义中匹配的内容?
我已经测试了语法,我可以在其上抛出任意数量的参数,它正确匹配,它只是处理那些逃避我的数据。
答案 0 :(得分:2)
在这种情况下,可能需要明确创建ARG
列表
程序员。
例如(虚构代码):
%union { args_data *ad; }
%type <ad> args
%%
args:
ARG
{
args_data *ad = alloc_args_data();
append_arg(ad, $1);
$$ = ad;
}
|
args COMMA ARG
{
append_arg($1, $3);
$$ = $1;
}
;