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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档