实验1:用lex构造c子集词法分析器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
实验项目名称:用lex构造c子集词法分析器
学时:2学时
一.实验目的和要求
用lex构造c子集词法分析器,能实现识别c子集源程序的单词序列。二.实验环境
VC/tc dos
三.实验过程
A:lex使用方法
1在“运行“中输入:cmd进入dos环境2 进入LEX所在文件夹。
(cd 命令若LEX在f盘根目录下>f:
>cd lex
3 LEX使用步骤:(直接在屏幕显示词法分析结果,不保留的)
1、编写LEX源程序,如“1.L”,将“1.L”与FLEX.EXE 保存在同一文件夹下。
2、进入DOS环境FLEX.EXE所在文件夹,运行FLEX.EXE程序。
FLEX 1.L
3、运行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",yytext[0]+'A'-'a'); %%
main( argc, argv )
int argc;
char **argv;
{
++argv, --argc; /* skip over program name */
if ( argc > 0 )
yyin = fopen( argv[0], "r" );//yyin存放LEXYY的输入源程序
else
yyin = stdin;
++argv, --argc; /* skip over input name */
if ( argc > 0 )
yyout = fopen( argv[0], "w" );//yyout存放LEXYY的输出程序
else
yyout = stdout;
yylex();
}
int yywrap()
{
return 1;
}
B:构造c子集词法分析器
1、编写c子集的LEX源程序,如“lex.L”,将“lex.L”与FLEX.EXE保存在同一文件夹下。
2、运行FLEX.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
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
%}
digit [0-9]
number {digit}+
letter [a-zA-Z]
identifier {letter}+
newline [\n]
whitespace [ \t]+
%%
"main" printf("baoliuzi: %s\n", yytext);
"if" printf("baoliuzi: %s\n", yytext);
"else" printf("baoliuzi: %s\n", yytext);
"for" printf("baoliuzi: %s\n", yytext);
"while" printf("baoliuzi: %s\n", yytext);
"do" printf("baoliuzi: %s\n", yytext);
"int" printf("baoliuzi: %s\n", yytext);
"=" printf("yunsuanfu: %s\n", yytext);
"+" printf("yunsuanfu: %s\n", yytext);
"-" printf("yunsuanfu: %s\n", yytext);
"*" printf("yunsuanfu: %s\n", yytext);
"/" printf("yunsuanfu:%s\n", yytext);
"<" printf("yunsuanfu: %s\n", yytext);
">" printf("yunsuanfu: %s\n", yytext);
"(" printf("jiefu: %s\n", yytext);
")" printf("jiefu: %s\n", yytext);
"[" printf("jiefu: %s\n", yytext);
"]" printf("jiefu: %s\n", yytext);
"{" printf("jiefu: %s\n", yytext);
"}" printf("jiefu: %s\n", yytext);
";" printf("jiefu: %s\n", yytext);
":" printf("jiefu: %s\n", yytext);
"'" printf("jiefu: %s\n", yytext);
"\"" printf("yunsuanfu: %s\n", yytext);
"," printf("jiefu: %s\n", yytext);
"==" printf("yunsuanfu: %s\n", yytext);
">=" printf("yunsuanfu: %s\n", yytext);
"<=" printf("yunsuanfu: %s\n", yytext);
"!=" printf("yunsuanfu: %s\n", yytext);
{number} printf("int: %s length:%d\n",yytext,yyleng); //求数字的长度{identifier} printf("id: %s\n",yytext);
{whitespace} {/* skip whitespace */}
"/*" { char c ;
int done = FALSE;
do
{ while ((c=input())!='*');
while ( (c=input()) == '*');
if (c == '/') done = TRUE;
} while (!done);