词法分析的各类用途1
一. 目的:
使我们明白词法分析的作用不仅仅在于写词法分析器,它还有很多其他用途。
二. 内容:
写一个lex程序,它读入一个文件,将该文件中的所有的单独或连续的一段空白(包括一个或多个空格、制表、换行组成的空白)都替换成一个空格。
三.要求:
输入为一个文本文件;输出为新的文本文件,该文件在原文本文件的基础上将单独或连续的空白变成一个空格。
在cygwin下用flex和gcc工具将实例调试通过,并写出测试例测试正确性。
四.源代码:
3.l:
%{
#include <stdio.h>
#define LT 1
#define LE 2
#define GT 3
#define GE 4
#define EQ 5
#define NE 6
#define WS 17
#define WHILE 18
#define DO 19
#define ID 20
#define NUMBER 21
#define RELOP 22
#define NEWLINE 23
#define ERRORCHAR 24
int yylval;
%}
delim [ \t \n]
ws {delim}+
letter [A-Za-z]
digit [0-9]
id {letter}({letter}|{digit})*
number {digit}+(\.{digit}+)?(E[+-]?{digit}+)?
%%
{ws} {return (WS);}/* 此时词法分析器没有动作,也不返回,而是继续分析。
while {return (WHILE);}
do {return (DO);}
{id} {yylval = installID (); return (ID);}
{number} {yylval = installNum (); return (NUMBER);}
"<" {yylval = LT; return (RELOP);}
"<=" {yylval = LE; return (RELOP);}
"=" {yylval = EQ; return (RELOP);}
"<>" {yylval = NE; return (RELOP);}
">" {yylval = GT; return (RELOP);}
">=" {yylval = GE; return (RELOP);}
. {yylval = ERRORCHAR; return ERRORCHAR;}
/*.匹配除换行之外的任何字符,一般可作为最后一条翻译规则。*/
%%
int installID () {
/* 把词法单元装入符号表并返回指针。*/
return ID;
}
int installNum () {
/* 类似上面的过程,但词法单元不是标识符而是数 */
return NUMBER;
}
int yywrap (){
return 1;
}
void writeout(int c){
switch(c){
case ERRORCHAR: fprintf(yyout,"%s", yytext);break;
case RELOP: fprintf(yyout, "%s", yytext);break;
case WHILE: fprintf(yyout, "%s", yytext);break;
case DO: fprintf(yyout, "%s", yytext);break;
case NUMBER: fprintf(yyout, "%s", yytext);break;
case ID: fprintf(yyout, "%s", yytext);break;
case WS: fprintf(yyout, "", yytext);break;
case NEWLINE: fprintf(yyout, "\n");break;
default:break;
}
return;
}
int main (int argc, char ** argv){
int c,j=0;
if (argc>=2){
if ((yyin = fopen(argv[1], "r")) == NULL){
printf("Can't open file %s\n", argv[1]);
return 1;
}
if (argc>=3){
yyout=fopen(argv[2], "w");
}
}
while (c = yylex()){
writeout(c);
j++;
if (j%5 == 0) writeout(NEWLINE);
}
if(argc>=2){
fclose(yyin);
if (argc>=3) fclose(yyout);
}
return 0;
}<strong>
</strong>
五.结果及分析:
处理前的t1.p:
while (a>1) a=b; if (a<1) a=c;
处理后的t2.p:
while(a>1)a=b;if(a<1)a=c;
输入t1.p,输出为t2,p,词法分析器将文件t1.p所有的单独或连续的一段空白(包括一个或多个空格、制表、换行组成的空白)都替换成一个空格,并在t2,p中输出。