词法分析的各类用途1

来源:互联网 发布:网页调用淘宝客户端 编辑:程序博客网 时间:2024/06/11 19:41

                       词法分析的各类用途1

一. 目的:

    使我们明白词法分析的作用不仅仅在于写词法分析器,它还有很多其他用途。

二. 内容:

        写一个lex程序,它读入一个文件,将该文件中的所有的单独或连续的一段空白(包括一个或多个空格、制表、换行组成的空白)都替换成一个空格。

三.要求:

     输入为一个文本文件;输出为新的文本文件,该文件在原文本文件的基础上将单独或连续的空白变成一个空格。

        在cygwin下用flex和gcc工具将实例调试通过,并写出测试例测试正确性。

四.源代码:

        3.l:

%{#include <stdio.h> #define LT1#defineLE2#define GT3#defineGE4#defineEQ5#define NE6#define WS  17#define WHILE18#defineDO19#define ID          20#define NUMBER      21#define RELOP       22#define NEWLINE     23#define ERRORCHAR   24int 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中输出。



0 0
原创粉丝点击