Используя правила грамматики, определенные ниже, я пытаюсь разобрать простую команду оболочки, скажем, как cd testFolder
.
Это мои правила, определенные в parser.y:
%union{
char *str;
}
%type <str> WORD
%%
command_list:/*empty*/
|command_list command_line{
printf("myShell > ");
}
;
arg_list:/*empty*/
| arg_list WORD{
printf("Args: %s\n", $2);
free($2);
}
;
cmd_and_args:
WORD arg_list {
printf("CMD: %s\n", $1);
free($1);
}
;
command_line:
cmd_and_args NEWLINE {printf("NULL\n");
}
| NEWLINE {
printf("NULL\n");
}
%%
Итак, я хотел, чтобы вывод был:
CMD: cd
Args: testFolder
NULL
, но я получаю:
Args: testFolder
CMD: cd
NULL
Для такой команды, как vim -O test.c test1.c
, я получаю:
Args: -O
Args: test.c
Args: test1.c
CMD: vim
NULL
Аргументы в порядке, но команда заканчивается последней.Как мне получить их в правильном порядке?