1

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

词法将读取一个词位的文本文件,并给每个词位一个标记,并将该标记写入另一个文件。该代码能够使用 yylex() 函数打开文件并从中读取。

问题是代码没有在指定文件中写入令牌。我还发现,该代码无法识别数字并为标识符的每个字母赋予一个 IDENTIFIER 令牌我尝试了许多方法来克服这些问题,并且我使用 ac 语言网站编写了正确的 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);
}
4

1 回答 1

1

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

于 2014-05-12T12:35:03.167 回答