使用Bison解析var args样式的命令

使用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

我是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);
  }
我只能(如上)引用前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;
  }
;