第一次编译原理大作业---用FLEX编写C语言的词法分析器

一开始看到这个作业的时候真的很懵圈,因为感觉每个字都认识但合起来就不知道到底是什么意思。开始的时候先去官网看了flex的介绍,官网上推荐和visual studio一起用,然后又去下载了vs。搞了半天没搞懂结果发现FLEX用起来其实超级简单。
方法一:直接长按鼠标左键将*.l文件(用LEX文法编写的程序)拖进flex.exe。
方法二:将你的flex.exe所在的路径添加到系统的环境变量中,在cmd窗口中通过输入 flex *.l来编译*.l中的文法。
通过FLEX编译后会生成一个lex.yy.c文件可以直接用C语言编写工具打开编译运行。
*.l文件内容如下,可以实现如下功能
1.识别关键字,标识符,有符号数字(整数,小数,指数),类型
2.可以输出每个单词所在的行数
3.可以识别%d、%f等和地址符
4.可以输出报错处理。例如float=10e是错误的语法,当文本文档出现例子中的语句时程序报错。

%{
	#include 
	#include  
	int count = 0;
                int line = 1;
                int tot=0;
                char s[10000][90],ans;
%} 
 
delim [" " \t] 
whitespace {delim}+ 
change [\n]+
OPT \+|-|\*|\/|\+=|>=|<=|#|=
type [iI][nN][tT]|[dD][oO][uU][bB][lL][eE]|[cC][hH][aA][rR]|[vV][oO][Ii][dD]
integer [-\+]?[0-9]+
keyword [mM][aA][iI][nN]|[iI][fF]|[eE][lL][sS][eE]|[rR][eE][tT][uU][rR][nN]|[sS][qQ][rR][tT]|[aA][bB][sS]|[pP][rR][iI][nN][tT][fF]|[sS][cC][aA][nN][fF]|[fF][oO][rR]|[wW][Hh][iI][lL][eE]|[dD][oO]|[fF][lL][oO][aA][tT]
bracket [,;.\(\)\{\}"]
decimal [-\+]?[0-9]+\.[0-9]+
index ({decimal}|{integer})e({integer}|{decimal})
Dindex ({decimal}|{integer})10({integer}|{decimal})
float ({index}|{Dindex})
identfy [A-Za-z][_-]?([A-Za-z]|[0-9])*
zhushi (\/)(\*).*(\*)(\/)
tdf \%[dfsc]
tdi &[A-Za-z]
typeidentify ({tdf}|{tdi})
floaterror (({decimal}|{integer})e)|([-\+]?[0-9]+\.)
%% 
{type} {++tot;sprintf(s[tot],"line%d:(type, %s)\n",line,yytext);}
{keyword} {++tot;sprintf(s[tot],"line%d:(keyword, %s)\n",line,yytext);}
{OPT} {++tot;sprintf(s[tot],"line%d:(OPT, %s)\n",line,yytext); }
{integer} {++tot;sprintf(s[tot],"line%d:(integer, %s)\n",line,yytext);}
{bracket} {++tot;sprintf(s[tot],"line%d:(bracket, %s)\n",line,yytext);}
{decimal} {++tot;sprintf(s[tot],"line%d:(decimal, %s)\n",line,yytext);}
{float} {++tot;sprintf(s[tot],"line%d:(float, %s)\n",line,yytext);}
{identfy} {++tot;sprintf(s[tot],"line%d:(identify, %s)\n",line,yytext);} 
{typeidentify} {++tot;sprintf(s[tot],"line%d:(typeidentify, %s)\n",line,yytext);}
{zhushi} { /*Do nothing*/ }
{whitespace} { /*Do nothing*/ }
{change} {line++;}
{floaterror} {++tot;sprintf(s[tot],"Error at Line %d: Illegal floating point number \"%s\".\n",line,yytext);}
%% 
void main() 
{
	char flag='0';
                yyin=fopen("1.txt","r"); 
    	yylex(); /* start the analysis*/ 
               for (line = 1;line <= tot; ++line)
              {
                 if (s[line][0] == 'E' && s[line][1] == 'r')
                {
                  flag = '1';
                  break;
                 }
                 }
               if (flag == '1')
                    printf("%s", s[line]);
              else
                 for (line = 1;line <= tot; ++line)
                      printf("%s", s[line]);
	fclose(yyin);
	system("PAUSE");/*暂停停,  使DOS窗口停住*/
} 
 int yywrap() 
 { 
 	return 1; 
}

输出文档举例

int main()
{ int a=0;
 float c=10e;
}

这个输出
第一次编译原理大作业---用FLEX编写C语言的词法分析器_第1张图片

你可能感兴趣的:(词法分析,FLEX,报错处理,C)