带有flex的词法分析器

时间:2014-05-12 01:35:21

标签: flex-lexer lexical

我正在尝试使用flex为小语言构建词法分析器。

lexical将读取lexemes的文本文件,并为每个lexeme提供一个标记,并将该标记写入另一个文件中。代码能够打开文件并使用yylex()函数从中读取。

问题是代码没有在指定文件中写入令牌。我还发现,代码无法识别数字,并为标识符的每个字母提供IDENTIFIER令牌,我尝试了许多方法来克服这些问题,并使用c语言网站编写正确的C代码。

一个小小的提示是我不想使用.y解析器读取词汇并将其传递给词法我希望我的词汇自己读取令牌并生成令牌。

所以任何人都可以帮我解决问题是什么?

%{
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#define KEY_INT 259
#define KEY_VOID 258
#define KEY_INT 259
#define KEY_FLOAT 260
#define KEY_IF 261
#define KEY_ELSE 262
#define KEY_WHILE 263
#define KEY_FOR 264
#define KEY_RETURN 265
#define KEY_BREAK 266
#define AND_OP 267
#define OR_OP 268
#define SMALL_EQ_OP 269
#define GREAT_EQ_OP 270
#define EQ_OP 271
#define SMALL_OP 272
#define GREAT_OP 273
#define NOT_EQ_OP 274
#define ASSIGN_OP 275
#define OPN__BRACKET 276
#define CLS__BRACKET 277
#define SEMICOLON_SYMBOL 278
#define COMMA_SYMBOL 279
#define DOT_SYMBOL 280
#define ADD_OP 281
#define SUB_OP 282
#define ASTERISK_SYMBOL 283
#define SLASH_SYMBOL 284
#define INT_NUM 287
#define FLOAT_NUM 288
#define IDENTIFIER 289
int yylval;
FILE *yyin,*yyout;
int c;
%}
Letters     [a-zA-Z]
Digits      [0-9]
Sympols     [@#$%&*-+!"':;/?(),~`|^_=×{}<>]
%%
[/*][{Letters}|{Digits}|{Sympols}|\n|\t ]*[*/]      {}  
[-+]?[{Digits}]+            {yylval = atoi(yytext); return INT_NUM ;}
[-+]?[{Digits}]+.[{Digits}]+        {yylval = atoi(yytext);return FLOAT_NUM ;}
{Letters}[{Letters}|{Digits}|_]*    {return IDENTIFIER ;}
[\t\n ]+    {}
"void"      {return KEY_VOID ;}
"float"     {return KEY_FLOAT ;}
"if"        {printf( "KEY_IF\n") ;}
"else"      {return KEY_ELSE ;}
"while"     {return KEY_WHILE ;}
"for"       {return KEY_FOR ;}
"return"    {return KEY_RETURN ;}
"break"     {return KEY_BREAK ;}
"&&"        {return AND_OP ;}
"||"        {return OR_OP ;}
"<="        {return SMALL_EQ_OP ;}
">="        {return GREAT_EQ_OP ;}
"=="        {return EQ_OP ; }
"<"     {return SMALL_OP ;}
">"     {return GREAT_OP ;}
"!="        {return NOT_EQ_OP ;}
"="     {return ASSIGN_OP ;}
"("     {return OPN__BRACKET ;}
")"     {return CLS__BRACKET ;}
";"     {return SEMICOLON_SYMBOL ;}
","     {return COMMA_SYMBOL ;}
"."     {return DOT_SYMBOL ;}
"+"     {return ADD_OP ;}
"-"     {return SUB_OP ;}
"*"     {return ASTERISK_SYMBOL ;}
"/"     {return SLASH_SYMBOL ;}
.       {yyerror() ;}
%%
int yyerror (void)
{
printf("Invalid input\n");
exit(1);
}
int yywrap()
{
return 1;
}
main()
{
if((yyin=fopen("C:\\ProCompFlex\\GnuWin32\\bin\\input.txt","r"))==NULL)
{
printf("input.txt Not found !\n Press any key to exit ");
getch();
return;
}
c=yylex();
while(c!=NULL)
{
yyout=fopen("C:\\ProCompFlex\\GnuWin32\\bin\\token.txt","w");
fprintf(yyout,c," ",yylex(),"\n");
getchar();
}
fclose(yyout);
}

1 个答案:

答案 0 :(得分:1)

您需要将所有关键字规则放在IDENTIFIER规则之前。