使用Bison解析var args样式的命令
我是Flex/Bison的新手,我正在尝试解析以下格式的字符串:使用Bison解析var args样式的命令,bison,flex-lexer,Bison,Flex Lexer,我是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
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);
}
我只能(如上)引用前2个参数,如何引用args:
定义中匹配的参数
我已经测试了语法,我可以向它抛出任意数量的参数,它匹配正确,只是得到了我不知道的数据句柄。在这种情况下,
ARG
s的列表可能需要由
程序员。例如(虚拟代码):
%union{args\u data*ad;}
%类型args
%%
args:
ARG
{
args_data*ad=alloc_args_data();
附加参数(ad$1);
$$=ad;
}
|
args逗号ARG
{
附加参数($1,$3);
$$ = $1;
}
;
Ahh有趣,所以将它们累积在一边,然后在var\u命令中使用它
definition?我会试一试的。
%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;
}
;