词法分析的各类用途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
- 词法分析的各类用途1
- 词法分析的各类用途2
- C++ 的词法分析
- C++ 的词法分析
- c++ 的词法分析
- js的词法分析
- Android基础教程-各类文件、 目录的用途
- 词法分析(1)---词法分析的有关概念以及转换图
- 词法分析(1)---词法分析的有关概念以及转换图
- 日志分析的用途
- static的用途分析
- C++ 的词法分析[转]
- 一个词法分析的题目
- JFlex 的词法分析说明
- 转:C++ 的词法分析
- 简单的词法分析程序
- MySQL的词法分析漫谈
- 再谈javascript的词法分析
- (ios开发)导出tableView数据至excel
- 谷歌电子市场学习笔记第五天
- NTP 服务器的安装与设定
- c语言之数组长度计算
- 【Git入门之9】解决冲突
- 词法分析的各类用途1
- java web笔记
- 开始的迷惑
- Algorithms, Princeton, Coursera课程整理与回顾
- jboss7安装启动后无法访问localhost:8080页面
- Mac下安装MySQL(给初学者的~)
- iOS开发过程中的常见错误
- iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)
- Xcode7.2简单解析之PList文件解析