Разбор команд в стиле var-args с помощью Bison - PullRequest
0 голосов
/ 06 апреля 2011

Я довольно новичок в Flex / Bison и пытаюсь разобрать строку в формате:

COMMAND ARG1, ARG2, ARGn (, ARGn+1, ARGn+2 ...);

так, что требуются аргументы 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:?

Я проверил грамматику и могу выдать любое количество аргументов, она соответствует правильно, она просто получает дескриптор этих данных, которые мне не хватает.

1 Ответ

2 голосов
/ 06 апреля 2011

В этом случае, вероятно, программист должен явно создать список ARG s.
Например (вымышленный код):

%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;
  }
;
...