词法分析器的构造 南邮编译原理实验一报告文档格式.docx

上传人:b****1 文档编号:14583356 上传时间:2022-10-23 格式:DOCX 页数:14 大小:89.17KB
下载 相关 举报
词法分析器的构造 南邮编译原理实验一报告文档格式.docx_第1页
第1页 / 共14页
词法分析器的构造 南邮编译原理实验一报告文档格式.docx_第2页
第2页 / 共14页
词法分析器的构造 南邮编译原理实验一报告文档格式.docx_第3页
第3页 / 共14页
词法分析器的构造 南邮编译原理实验一报告文档格式.docx_第4页
第4页 / 共14页
词法分析器的构造 南邮编译原理实验一报告文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

词法分析器的构造 南邮编译原理实验一报告文档格式.docx

《词法分析器的构造 南邮编译原理实验一报告文档格式.docx》由会员分享,可在线阅读,更多相关《词法分析器的构造 南邮编译原理实验一报告文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

词法分析器的构造 南邮编译原理实验一报告文档格式.docx

1)、允许用户自己输入源程序并保存为文件;

2)、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等);

3)、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。

定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:

识别保留字:

if、int、for、while、do、return、break、continue等,其他的都识别为标识符;

常数为无符号整形数;

运算符包括:

+、-、*、/、=、>

、<

、>

=、<

=、!

=等;

分隔符包括:

、;

、{、}、(、)等;

4)、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。

文本内容为待分析的类C语言程序。

二、实验环境(实验设备)

硬件:

计算机

软件:

VisualC++6.0

二、实验原理及内容

1、实验内容:

设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作。

例如下面为一段C语言源程序:

main(){

int 

a,b;

a=10;

b=a+20;

}

要求输出如下:

(2,’main’)

(5,’(’)

(5,’)’)

(5,’)’)

(5,’{’)

(1,’int’)

(2,’a’)

(5,’,’)

(2,’b’)

(5,’;

’)

(4,’=’)

(3,’10’)

(4,’+’)

(3,’20’)

(5,’}’)

2、实验原理状态转换图

3、实验代码:

实验代码:

#include<

string.h>

iostream.h>

fstream>

#include<

stdlib.h>

stdio.h>

ctype.h>

structChar{//创建一个结构用于存贮关键字

chara[15];

};

typedefstructCharCH;

//定义关键字

CHkeyWord[67]={"

auto"

"

break"

case"

cout"

cin"

char"

const"

continue"

default"

"

do"

double"

else"

enum"

endl"

extern"

float"

for"

goto"

if"

main"

include"

int"

long"

register"

return"

short"

signed"

sizeof"

static"

string"

struct"

switch"

typedef"

union"

unsigned"

void"

stdio"

while"

catch"

calss"

ctype"

stdlib"

fstream"

export"

iostream"

false"

friend"

inline"

mutable"

namespace"

new"

operator"

private"

protected"

public"

static_cast"

template"

this"

throw"

true"

try"

typename"

using"

virtual"

asm"

//检测是否为数字,是返回true,否则返回false

boolIsDigit(charA){

if(A>

='

0'

&

&

A<

9'

returntrue;

else

returnfalse;

}

//检测是否为字符,是则返回true,否则返回false

boolIsLetter(charch){

if((ch>

A'

ch<

Z'

)||(ch>

a'

z'

))

returnfalse;

//检测是否为分隔符,是则返回true,否则返回false

boolIsSeparator(charch){

if(ch=='

('

||ch=='

)'

||ch=='

{'

}'

;

'

'

.'

||

ch=='

:

\'

\"

['

]'

#'

_'

//检测是否为关键字,是则返回true,否则返回false

boolIsKeyWord(char*a){

inti=0;

for(i;

i<

67;

i++)

if(strcmp(a,keyWord[i].a)==0){

returntrue;

}

//预处理去掉注释、换行、空格等

voidScanner(chars[],chara[]){

inti=0,j=0,k=strlen(s);

for(i;

k;

i++){

if(s[i]=='

/'

s[i+1]=='

){

do{

i++;

}while(s[i]!

='

\n'

);

i--;

elseif(s[i]=='

s[i+1]=='

*'

||s[i-1]!

continue;

\t'

||s[i]=='

?

a[j++]='

'

else

a[j++]=s[i];

}

cout<

<

"

\n系统经过预处理后的输出(去掉注释和换行):

endl;

a<

\n\n"

系统经过预处理后的输出(去掉注释、换行、空格等):

for(i=0;

i<

strlen(a);

i++){

if(a[i]=='

else

cout<

a[i];

endl<

voidHandle(chars[]){//词法分析

charch;

for(intj=0;

j<

strlen(s);

j++){

charword[20]={'

\0'

inti=0;

ch=s[j];

if(ch=='

elseif(IsLetter(ch)){

word[i++]=ch;

ch=s[++j];

}while(IsLetter(ch)||IsDigit(ch)||ch=='

j--;

word[i]='

if(IsKeyWord(word))

cout<

(1,'

word<

)"

else

(2,'

elseif(IsDigit(ch)){

}while(IsDigit(ch));

(3,'

elseif(IsSeparator(ch)){

word[0]=ch;

(5,'

else{

if(word[0]=='

+'

||word[0]=='

-'

>

word[0]=='

|'

if(s[j+1]==word[0]||s[j+1]=='

word[1]=s[++j];

cout<

(4,'

}

else

}

elseif(word[0]=='

!

%'

^'

if(s[j+1]=='

else

elseif(word[0]=='

\\'

n'

||s[j+1]=='

t'

||

s[j+1]=='

||s[j+1]=='

(无法识别字符,'

\n"

intmain(){

inti;

charb=32,ch;

FILE*fp;

do{

i=0;

chars[10000];

chara[10000]={'

fp=fopen("

code.txt"

rb+"

if(fp==NULL){

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1