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

时间:2011-04-05 21:06:14

标签: 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
  {
    printf("arg1: %s, arg2: %s\n", $2, $4);
  }

我只能(如上所述)引用前两个参数,如何引用args:定义中匹配的内容?

我已经测试了语法,我可以在其上抛出任意数量的参数,它正确匹配,它只是处理那些逃避我的数据。

1 个答案:

答案 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;
  }
;