Flex分析器 - 意外令牌附近的bash语法错误'('

时间:2014-08-02 12:14:54

标签: c flex-lexer

我是FLEX的新手,我正在尝试编写一个简单的FLEX lex文件,但由于某种原因,我在标题中收到了错误。

完整的错误是:

bash syntax error near unexpected token '('

我正在运行的命令是:

flex sample.lex 

OR

flex sample.l 

我在哪里错了?

%{

union{
    int val;
    char name [30];
    char str [80];
}yylval;

#include <stdio.h>
%}

%%
. ECHO;
%%

int main(int argc, char **argv)
{
    if (argc != 2) {
        printf("no input file>\n");
        exit (1);
    }

  printf("token    lexeme    attribute\n");
  printf("--------------------------\n");
  yyin=fopen(argv[1], "r");
  if(yyin!=0)
  {    printf("file opened");
        fclose(yyin);}

  exit (0);
}
int yywrap () { return 1; }

1 个答案:

答案 0 :(得分:3)

您是在文件上运行Flex,然后是GCC吗?我能够编译这个。首先,运行

  

flex test.l

这应该生成一个文件名&#34; lex.yy.c&#34;,这是由Flex生成的C代码。此文件包含扫描输入的代码和.l文件中的C代码。然后运行

  

gcc lex.yy.c

应该生成一个可执行文件&#34; a.out&#34;。正在运行

  

./ a.out test.txt

生成了您正在打印的输出,包括&#34;文件已打开&#34;。正如所指出的,main没有返回类型,但我想我的编译器能够解决它。

然而,即使你可以编译它,看起来你误解了Flex的一些方面。

union{
    int val;
    char name [30];
    char str [80];
}yylval;

是一个普通的C联盟。当语义值可以有多个类型时,使用Bison的%union声明,并且它们不是同一个。 %union不应该在.l文件中。

此外,您需要调用yylex()来实际开始扫描输入。

现在,我建议转到Flex手册并做一些初学者示例:http://westes.github.io/flex/manual/Simple-Examples.html。如果您一起使用Flex和Bison,您还应该阅读一些Bison示例:http://www.gnu.org/software/bison/manual/html_node/Examples.html#Examples