我是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; }
答案 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