当前位置:   article > 正文

第一次编译原理大作业---用FLEX编写C语言的词法分析器_已有flex.exe

已有flex.exe

一开始看到这个作业的时候真的很懵圈,因为感觉每个字都认识但合起来就不知道到底是什么意思。开始的时候先去官网看了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 <stdio.h>
	#include <stdlib.h> 
	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; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

输出文档举例

int main()
{ int a=0;
 float c=10e;
}
  • 1
  • 2
  • 3
  • 4

这个输出
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/294209
推荐阅读
相关标签
  

闽ICP备14008679号