在Lex中解析命令行参数

时间:2009-12-15 11:15:49

标签: c yacc lex flex-lexer

假设我希望我的Lex和Yacc程序解析命令行参数,如:

./a.out show memory

我希望lex解析字符串“show memory”。我该如何做到这一点?

4 个答案:

答案 0 :(得分:2)

您需要通过在它们之间插入空格将所有参数连接成一个大字符串。然后通过重新定义YY_INPUT宏将剩余的文本缓冲区提供给Lex / Yacc,以便从文本缓冲区读取输入。

开始可能是这样的:

#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;
}

答案 1 :(得分:2)

int main(int argc, char **argv) {
    if(argc > 1) {
    if(argv[1])
        yy_scan_string(argv[1]);
    }
    yyparse();
    return 0;
} 

答案 2 :(得分:0)

用老式的方式做错了什么?:

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

此外,getopt()和朋友更合适。

答案 3 :(得分:0)

我的博客文章Parsing command line parameters with Yacc & Flex通过一个工作示例解释了这一点。无需连接参数字符串。原因在文章中给出。

模糊是:

  

每隔一段时间,有人会出现并询问如何解析   命令行参数与Yacc&amp;柔性。这是相当直接的   转发,但需要了解生成的代码才能获得   右。

     

这里我们提供一个执行此操作的源模板。用户只需要   编辑语法和扫描规则。关于C,Yacc和C的一些知识   假设是Flex。

     

代码是WTFPL许可的

     

该模板是为Berkeley Yacc和反射变体而编写的   柔性。它可以与GNU Bison和SourceForge Flex一起使用,   可能会有一些变化。

你得到的是一个模板,你可以在其中插入词汇和语法规范。

请询问有关使用和调整模板本身的问题以及博客评论。