Разбор аргументов командной строки в Lex - PullRequest
1 голос
/ 15 декабря 2009

Предположим, я хочу, чтобы моя программа Lex и Yacc анализировала аргументы командной строки, например:

./a.out show memory

Я хочу, чтобы lex проанализировал строку "show memory". Как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 25 октября 2011
int main(int argc, char **argv) {
    if(argc > 1) {
    if(argv[1])
        yy_scan_string(argv[1]);
    }
    yyparse();
    return 0;
} 
2 голосов
/ 15 декабря 2009

Вам нужно будет объединить все аргументы в большую строку, вставив между ними пробелы. Затем передайте оставшийся текстовый буфер в Lex / Yacc, переопределив макрос <a href="http://www.delorie.com/gnu/docs/flex/flex_10.html" rel="nofollow noreferrer">YY_INPUT</a>, чтобы он считывал ввод из вашего текстового буфера.

Начало может быть примерно таким:

#include <stdio.h>
#include <string.h>

char *argbuf;
size_t arglen;

int main(int argc, char *argv[])
{
  int i;

  // Compute total length of all arguments, with a single space between.
  arglen = 0;
  for(i = 1; argv[i] != NULL; i++)
    arglen += 1 + strlen(argv[i]);

  // Allocate buffer space.
  argbuf = malloc(arglen);
  if(argbuf == NULL)
  {
     fprintf(stderr, "No memory for argument buffer, aborting");
     exit(1);
  }

  // Concatenate all arguments. This is inefficient, but simple.
  argbuf[0] = 0;
  for(i = 1; argv[i] != NULL; i++)
  {
    if(i > 1)
      strcat(argbuf, " ");
    strcat(argbuf, argv);
  }

  // Here we should be ready to call yyparse(), if we had implemented YY_INPUT().

  return 0;
}
0 голосов
/ 06 июня 2012

Статья в моем блоге Анализ параметров командной строки с помощью Yacc & Flex объясняет это на рабочем примере. Нет необходимости конкатенировать строку аргумента. Причина приведена в статье.

Реклама: 1005 *

Время от времени кто-то приходит и спрашивает, как разобрать параметры командной строки с Yacc & Flex. Это довольно прямо вперед, но требует некоторых знаний о сгенерированном коде, чтобы получить правый.

Здесь мы представляем исходный шаблон, который делает это. Пользователь должен только редактировать грамматику и правила сканирования. Некоторое знание C, Yacc и Предполагается гибкость.

Код лицензирован WTFPL

Шаблон написан для Berkeley Yacc и рефлекторного варианта Flex. Это может быть сделано для работы с GNU Bison и SourceForge Flex, возможно, с некоторыми изменениями.

Вы получаете шаблон, в который вы можете просто вставить свою лексическую и грамматическую спецификацию.

Пожалуйста, задавайте вопросы об использовании и адаптации самого шаблона к комментариям в блоге.

0 голосов
/ 15 декабря 2009

Что не так по старинке?

if(argc > 1 && !strcmp(argv[1],"show"))
{
    if(argc > 2)
    {
        if(!strcmp(argv[2],"memory"))
            ...
        else if(!strcmp(argv[2],"cpu"))
            ...
        else ...
    }
}

Кроме того, getopt() и друзья более уместны.

...