赞
踩
一开始看到这个作业的时候真的很懵圈,因为感觉每个字都认识但合起来就不知道到底是什么意思。开始的时候先去官网看了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; }
输出文档举例
int main()
{ int a=0;
float c=10e;
}
这个输出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。