实验1:用lex构造c子集词法分析器

上传人:平*** 文档编号:14046885 上传时间:2017-10-27 格式:DOC 页数:8 大小:325.76KB
返回 下载 相关 举报
实验1:用lex构造c子集词法分析器_第1页
第1页 / 共8页
实验1:用lex构造c子集词法分析器_第2页
第2页 / 共8页
实验1:用lex构造c子集词法分析器_第3页
第3页 / 共8页
实验1:用lex构造c子集词法分析器_第4页
第4页 / 共8页
实验1:用lex构造c子集词法分析器_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《实验1:用lex构造c子集词法分析器》由会员分享,可在线阅读,更多相关《实验1:用lex构造c子集词法分析器(8页珍藏版)》请在金锄头文库上搜索。

1、实 验 报 告实验项目名称:用 lex 构造 c 子集词法分析器学时:2 学时一实验目的和要求用 lex 构造 c 子集词法分析器,能实现识别 c 子集源程序的单词序列。二实验环境VC/tc dos 三实验过程A:lex 使用方法1 在“运行“中输入:cmd 进入 dos 环境2 进入 LEX 所在文件夹。(cd 命令若 LEX 在 f 盘根目录下f: cd lex3 LEX 使用步骤:(直接在屏幕显示词法分析结果,不保留的)1、编写 LEX 源程序,如“1.L”,将“1.L”与FLEX.EXE 保存在同一文件夹下。2、进入 DOS 环境 FLEX.EXE 所在文件夹,运行FLEX.EXE 程

2、序。 FLEX 1.L3、运行 FLEX 后,产生“LEXYY.C”程序4、用 VC 打开“LEXYY.C” 程序,编译后产生“LEXYY.EXE”程序。5、进入 DOS 环境“LEXYY.EXE”所在文件夹,编写 1.c 程序,运行“LEXYY.EXE”程序。LEXYY.EXE 1.c 的结果。1.L 源程序:实现功能 将所有小写字母转换成大写。%#include %a-z printf(%c,yytext0+A-a);%main( argc, argv )int argc;char *argv;+argv, -argc; /* skip over program name */if ( a

3、rgc 0 )yyin = fopen( argv0, r );/yyin 存放 LEXYY 的输入源程序elseyyin = stdin;+argv, -argc; /* skip over input name */if ( argc 0 )yyout = fopen( argv0, w );/yyout 存放 LEXYY 的输出程序 elseyyout = stdout;yylex();int yywrap() return 1;B:构造 c 子集词法分析器1、编写 c 子集的 LEX 源程序,如“lex.L”,将“lex.L”与 FLEX.EXE 保存在同一文件夹下。2、运行 FLEX

4、.EXE 程序。3、运行 FLEX 后,产生“LEXYY.C”程序4、用 VC 打开“LEXYY.C”程序,编译后产生“LEXYY.EXE”程序。5、编写一个 c 子集源程序 A.c (每个人的源程序不相同)main()int a;real b;a=2*32;b=3.124;运行“LEXYY.EXE”程序。LEXYY.EXE A.c 看词法分析的结果。四 实验结果将词法分析的结果抄到实验报告五:错误分析由于该词法分析程序是分析 c 子集,case 等关键字不能识别,字符型不能识别,部分运算符号和界符不能识别。编写 c 源程序需注意 c 子集范围。Lex1.L 源程序:%#include #if

5、ndef FALSE#define FALSE 0#endif#ifndef TRUE#define TRUE 1#endif%digit 0-9number digit+letter a-zA-Zidentifier letter+newline nwhitespace t+%main printf(baoliuzi: %sn, yytext);if printf(baoliuzi: %sn, yytext);else printf(baoliuzi: %sn, yytext);for printf(baoliuzi: %sn, yytext);while printf(baoliuzi:

6、%sn, yytext);do printf(baoliuzi: %sn, yytext);int printf(baoliuzi: %sn, yytext);= printf(yunsuanfu: %sn, yytext);+ printf(yunsuanfu: %sn, yytext);- printf(yunsuanfu: %sn, yytext);* printf(yunsuanfu: %sn, yytext);/ printf(yunsuanfu:%sn, yytext); printf(yunsuanfu: %sn, yytext);( printf(jiefu: %sn, yyt

7、ext);) printf(jiefu: %sn, yytext); printf(jiefu: %sn, yytext); printf(jiefu: %sn, yytext); printf(jiefu: %sn, yytext); printf(jiefu: %sn, yytext); printf(jiefu: %sn, yytext);: printf(jiefu: %sn, yytext); printf(jiefu: %sn, yytext); printf(yunsuanfu: %sn, yytext);, printf(jiefu: %sn, yytext);= printf

8、(yunsuanfu: %sn, yytext);= printf(yunsuanfu: %sn, yytext); 0 )yyin = fopen( argv0, r );/yyin 存放 LEXYY 的输入源程序elseyyin = stdin;+argv, -argc; /* skip over input name */if ( argc 0 )yyout = fopen( argv0, w );/yyout 存放 LEXYY 的输出程序elseyyout = stdout;yylex();int yywrap() return 1;思考题:1 该源程序中只给出了标识符符定义为字母,如

9、何将规则改为识别字母数字的?2 参照整型变量的定义,怎样将实型变量定义出来?3 完善定义部分。附录:若需要将词法分析器结果作为文件保留起来的,则需要修改程序LEX 使用步骤:(需要将词法分析器结果保留起来的)1、编写 LEX 源程序,如“Cffx.l”,将“Cffx.l”与 FLEX.EXE 保存在同一文件夹下。2、进入 DOS 环境 FLEX.EXE 所在文件夹,运行 FLEX.EXE 程序。 FLEX cffx.l3、运行 FLEX 后,产生“LEXYY.C”程序4、用 VC 打开“LEXYY.C”程序,编译后产生“LEXYY.EXE”程序。5、编写 C 子集语言源程序,保存为 A.TES

10、T,并与“LEXYY.EXE”保存在同一文件夹下。6、进入 DOS 环境 “LEXYY.EXE”所在文件夹,运行“LEXYY.EXE”程序。LEXYY.EXE A.TEST B.TXT7、打开“B.TXT”,看词法分析的结果。Cffx.l 源程序:%#include #ifndef FALSE#define FALSE 0#endif#ifndef TRUE#define TRUE 1#endif%digit 0-9number digit+letter a-zA-Zidentifier letter+newline nwhitespace t+%if fprintf(yyout,%s %sn

11、, yytext,yytext);else fprintf(yyout,%s %sn, yytext,yytext);for fprintf(yyout,%s %sn, yytext,yytext);while fprintf(yyout,%s %sn, yytext,yytext);do fprintf(yyout,%s %sn, yytext,yytext);int fprintf(yyout,%s %sn, yytext,yytext);= fprintf(yyout,%s %sn, yytext,yytext);+ fprintf(yyout,%s %sn, yytext,yytext

12、);- fprintf(yyout,%s %sn, yytext,yytext);* fprintf(yyout,%s %sn, yytext,yytext);/ fprintf(yyout,%s %sn, yytext,yytext); fprintf(yyout,%s %sn, yytext,yytext);( fprintf(yyout,%s %sn, yytext,yytext);) fprintf(yyout,%s %sn, yytext,yytext); fprintf(yyout,%s %sn, yytext,yytext); fprintf(yyout,%s %sn, yyte

13、xt,yytext); fprintf(yyout,%s %sn, yytext,yytext); fprintf(yyout,%s %sn, yytext,yytext); fprintf(yyout,%s %sn, yytext,yytext);: fprintf(yyout,%s %sn, yytext,yytext); fprintf(yyout,%s %sn, yytext,yytext); fprintf(yyout,%s %sn, yytext,yytext);, fprintf(yyout,%s %sn, yytext,yytext);= fprintf(yyout,%s %sn, yytext,yytext);= fprintf(yyout,%s %sn, yytext,yytext); 0 )yyin = fopen( argv0, r );/yyin 存放 LEXYY 的输入源程序elseyyin = stdin;+argv, -argc; /* skip over input name */if ( argc 0 )yyout = fopen( argv0, w );/yyout 存放 LEXYY 的输出程序elseyyout = stdout;yylex();int yywrap() re

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号