我是lex的初学者。我的程序是读取文件并识别数据类型。 我通过在Windows命令行中编写“gcc -c lex.yy.c”来获取此错误: -
code1.l:在函数'yylex'中:
code1.l:8:2:错误:预期';'在'{'令牌
之前我的输入文件是:
#include <stdio.h>
int main()
{
int a;
float b;
long int c;
long long int d;
return 0;
}
我的lex代码是
%{
#include <stdio.h>
#include <stdlib.h>
%}
%%
"int"
{
printf("%s ->Intger data type\n", yytext);
}
"float"
{
printf("%s ->Floating point data type\n", yytext);
}
"double"
{
printf("%s ->double data type\n", yytext);
}
"char"
{
printf("%s ->character data type\n", yytext);
}
"void"
{
printf("%s ->void data type\n", yytext);
}
"bool"
{
printf("%s ->boolean data type\n", yytext);
}
"long"([ ])([ ])* "int"
{
printf("%s ->long int data type\n", yytext);
}
"long"([ ])([ ])* "long"([ ])([ ])* "int"
{
printf("%s ->long long int data type\n", yytext);
}
([a-z])*
{
printf("%s ->Not a data type\n", yytext);
}
([0-9])*
{
printf("%s ->Not a data type\n", yytext);
}
%%
int yywrap()
{
return 1;
}
int main()
{
FILE *fp = fopen("sampleIO.txt","r");
yyin=fp;
yylex();
return 0;
}
我找不到错误。任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
在lex/flex
中,模式必须从一行的开头开始,如flex manual中所述:
flex输入的rules部分包含一系列表单规则:
pattern action
模式必须是未缩进的,并且动作必须在同一行上开始。
此外,
任何缩进的文本......都会逐字复制到输出中。
因此,从gcc错误消息中指示的第8行开始,您的缩进模式直接传递到lex.yy.c
文件,因为它们无效C而无法编译。
此外,模式不能有不带引号的空格。因此,即使使用正确的缩进,模式:
"long"([ ])([ ])* "int"
需要写
"long"([ ])([ ])*"int"
使用额外的空间,它看起来像模式("long"([ ])([ ])*
)和动作("int"
)一样弯曲。没有必要在方括号周围放括号;这只会掩盖模式。 flex包括*
正则表达式运算符(0次或更多次重复)和+
运算符(1次或多次重复),因此该模式可以写为:
"long"[ ]+"int"
更清楚,但实际上并不正确;单词long
和int
可以用制表符或换行符分隔(或者,就像它发生的那样,注释,但我们还没有进入那个)。所以一个更好但仍然不完美的模式可能是:
"long"[[:space:]]+"int"
答案 1 :(得分:0)
为你修好了。它现在编译好了。 更新我的源空白正确性。
%{
#include <stdio.h>
#include <stdlib.h>
%}
%option noyywrap
%%
"int" { printf("%s ->Intger data type\n", yytext); }
"float" { printf("%s ->Floating point data type\n", yytext); }
"double" { printf("%s ->double data type\n", yytext); }
"char" { printf("%s ->character data type\n", yytext); }
"void" { printf("%s ->void data type\n", yytext); }
"bool" { printf("%s ->boolean data type\n", yytext); }
"long"[[:space:]]+"int" { printf("%s ->long int data type\n", yytext); }
"long"[[:space:]]+"long"[[:space:]]+"int" { printf("%s ->long long int data type\n", yytext); }
. { printf("%s ->Not a data type\n", yytext); } // I would omit printf here..
%%
int main()
{
FILE *fp = fopen("sampleIO.txt","r");
yyin=fp;
yylex();
return 0;
}