编译原理实习设计——词法分析程序.doc

上传人:聆听****声音 文档编号:11289718 上传时间:2023-05-30 格式:DOC 页数:21 大小:149.04KB
下载 相关 举报
编译原理实习设计——词法分析程序.doc_第1页
第1页 / 共21页
编译原理实习设计——词法分析程序.doc_第2页
第2页 / 共21页
编译原理实习设计——词法分析程序.doc_第3页
第3页 / 共21页
编译原理实习设计——词法分析程序.doc_第4页
第4页 / 共21页
编译原理实习设计——词法分析程序.doc_第5页
第5页 / 共21页
编译原理实习设计——词法分析程序.doc_第6页
第6页 / 共21页
编译原理实习设计——词法分析程序.doc_第7页
第7页 / 共21页
编译原理实习设计——词法分析程序.doc_第8页
第8页 / 共21页
编译原理实习设计——词法分析程序.doc_第9页
第9页 / 共21页
编译原理实习设计——词法分析程序.doc_第10页
第10页 / 共21页
编译原理实习设计——词法分析程序.doc_第11页
第11页 / 共21页
编译原理实习设计——词法分析程序.doc_第12页
第12页 / 共21页
编译原理实习设计——词法分析程序.doc_第13页
第13页 / 共21页
编译原理实习设计——词法分析程序.doc_第14页
第14页 / 共21页
编译原理实习设计——词法分析程序.doc_第15页
第15页 / 共21页
编译原理实习设计——词法分析程序.doc_第16页
第16页 / 共21页
编译原理实习设计——词法分析程序.doc_第17页
第17页 / 共21页
编译原理实习设计——词法分析程序.doc_第18页
第18页 / 共21页
编译原理实习设计——词法分析程序.doc_第19页
第19页 / 共21页
编译原理实习设计——词法分析程序.doc_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

编译原理实习设计——词法分析程序.doc

《编译原理实习设计——词法分析程序.doc》由会员分享,可在线阅读,更多相关《编译原理实习设计——词法分析程序.doc(21页珍藏版)》请在冰点文库上搜索。

编译原理实习设计——词法分析程序.doc

编译原理实习设计

词法分析程序

一.实习目的

构造一个小语言的词法分析程序。

  

二.实习要求

设计一个包含简单算术表达式、赋值语句、IF语句的小语言的文法。

根据此文法,构造一个词法分析程序,输入以“#”为结束符的源程序,输出为各类单词表和单词串文件。

  源程序和输出的单词串均以文件的形式存放。

  单词的自身值均为其对应的表的指针,如标识符表的指针、常数表的指针等。

  提交实习报告和程序运行结果。

三.相关图表

1.状态转换图

空白

0

字母

非字母与数字

1

2

*

图一:

标志符和关键字的识

数字

空白

数字

非数字

2

*

0

1

图二:

整数的识别

数字

数字

*

E或D

其他

数字

E或D

+或-

数字

*

其他

数字

数字

1

1

6

数字

7

5

4

3

2

0

图三:

实数的识别

}

27

{

*

26

*

25

]

*

24

[

*

23

*

22

*

21

;

*

20

*

*

|

19

18

非|

17

|

*

*

16

&

15

非&

14

&

*

=

13

*

12

非=

11

=

*

10

#

*

9

*

8

非=

7

%

*

6

^

*

5

*

4

非=

3

*

2

“双引

*

1

‘单引

空白

0

图四:

界符和算符的识别

(1)

2.单词符号对照表

单词符号

助记符

内码值

标志符

整数

浮点数

关键字

!

!

=

^

%

%=

=

==

&&

&

|

||

;

[

]

{

}

+

++

+=

――

-=

*

*=

/

/=

$ID

$Int

$FLOAT

$KeyWord

$Syin

$Yinhao

$Not

$NotQU

$Weiyu

$GESHICONTROL

$mo-EQ

$EQU

$EQ

$and

$Wyu

$Whuo

$Or

$douhao

$fenhao

$Lpar

$Rpar

$Lmid

$Rmid

$Lbig

$Rbig

$Plus

$Plus-Plus

$Plus-EQ

$dec

$dec-dec

$dec-EQ

$Mul

$Mul-EQ

$Div

$Div-EQ

字符串值

数值

数值

字符串值

!

!

=

^

%

%=

=

==

&&

&

|

||

;

[

]

{

}

+

++

+=

――

-=

*

*=

/

/=

四.源程序和结果

1.分析器程序

#include

#include

#include

#defineMax120

FILE*fprogram;

FILE*foutput;

intWordEnd;

charBuffer[Max*2];

charch;

intIsLetter(charch)

{

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

{

return

(1);

}

else

{

return(0);

}

}

intIsDigit(charch)

{

if(ch>='0'&&ch<='9')

{

return

(1);

}

else

{

return(0);

}

}

char*Par(charpar,char*str)

{

switch(par)

{

case'(':

str="$Lpar";

break;

case')':

str="$Rpar";

break;

case'[':

str="$Lmid";

break;

case']':

str="$Rmid";

break;

case'{':

str="$Lbig";

break;

case'}':

str="$Rbig";

break;

default:

break;

}

returnstr;

}

voidWriteBuffer()

{

chartmpch='';

inti=0;

longpos;

WordEnd=0;

for(intt=0;t

{

Buffer[t]=NULL;

}

while(i

{

ch=fgetc(fprogram);

if(ch!

=EOF)

{

if(ch=='\n'||ch=='\t'||ch=='')

{

ch='';

}

if(!

(tmpch==''&&ch==''))

{

if(ch=='/')

{

ch=fgetc(fprogram);

if(ch!

=EOF)

{

if(ch=='*')

{

charflo;

while

(1)

{

ch=fgetc(fprogram);

if(ch!

=EOF)

{

if(ch=='*')

{

flo=ch;

ch=fgetc(fprogram);

if(ch==EOF)

{

break;

}

if(ch=='/')

{

ch=fgetc(fprogram);

break;

}

}

}

else

{

break;

}

}

}

else

{

pos=ftell(fprogram);

fseek(fprogram,pos-2,0);

if((ch=fgetc(fprogram))==EOF)

{

break;

}

}

}

else

{

break;

}

}

Buffer[i]=ch;

i++;

}

tmpch=ch;

}

else

{

break;

}

}

if(IsDigit(ch)||IsLetter(ch)||ch=='.'||ch=='E'||ch=='e'||ch=='-')

{

while

(1)

{

ch=fgetc(fprogram);

if(ch!

=EOF)

{

if(IsDigit(ch)||IsLetter(ch)||ch=='.'||ch=='E'||ch=='e'||ch=='-')

{

Buffer[i]=ch;

i++;

WordEnd=1;

}

else

{

if(ch==''||ch=='\t'||ch=='\n'||ch=='\r')

{

break;

}

else

{

pos=ftell(fprogram);

fseek(fprogram,pos-1,0);

break;

}

}

}

else

{

break;

}

}

}

if(ch=='='||ch=='+'||ch=='-'||ch=='*'||

ch=='&'||ch=='^'||ch=='%'||ch=='<'||ch=='>')

{

while

(1)

{

ch=fgetc(fprogram);

if(ch!

=EOF)

{

if(ch=='='||ch=='+'||ch=='-'||ch=='*'||

ch=='&'||ch=='^'||ch=='%'||ch=='<'||ch=='>')

{

Buffer[i]=ch;

i++;

WordEnd=1;

}

else

{

if(ch==''||ch=='\t'||ch=='\n'||ch=='\r')

{

break;

}

else

{

pos=ftell(fprogram);

fseek(fprogram,pos-1,0);

break;

}

}

}

else

{

break;

}

}

}

if(ch=='\\')

{

while

(1)

{

ch=fgetc(fprogram);

if(ch!

=EOF)

{

if(ch=='n'||ch=='t'||ch=='\\'||ch=='v'||ch=='b'||

ch=='f'||ch=='r')

{

Buffer[i]=ch;

i++;

WordEnd=1;

}

else

{

if(ch==''||ch=='\t'||ch=='\n'||ch=='\r')

{

break;

}

else

{

pos=ftell(fprogram);

fseek(fprogram,pos-1,0);

break;

}

}

}

else

{

break;

}

}

}

}

charGet_ch(intj)

{

returnBuffer[j];

}

voidOutput(charid[],charstring[])

{

fprintf(foutput,"%s%s\n",id,string);

}

intIsKeyword(charstring[])

{

char*KeyWords[]={"auto","double","int","struct","break",

"else","long","switch","case","enum","register","typedef",

"char","extern","return","union","const","float","short",

"unsigned","continue","for","signed","void","default","goto",

"sizeof","volatile","do","if","while","static","main"};

for(inti=0;i<33;i++)

{

if(strcmp(string,KeyWords[i])==0)

{

return1;

}

}

return0;

}

voidProccess()

{

inti,j=0;

charc;

charstring[Max];

for(intq=0;q

{

string[q]=NULL;

}

WordEnd==1?

i=Max*2:

i=Max;

while(j

{

intk=0;

c=Get_ch(j);

if(c=='#')

{

j++;

while

(1)

{

c=Get_ch(j);

if(IsLetter(c))

{

string[k++]=c;

}

elseif(c=='<'||c=='"')

{

Output("$ID",string);

for(intp=0;p

{

string[p]=NULL;

}

k=0;

while

(1)

{

c=Get_ch(++j);

if(c=='>'||c=='"')

{

Output("$ID",string);

for(intp=0;p

{

string[p]=NULL;

}

break;

}

elseif(c=='.'||IsLetter(c)||IsDigit(c))

{

string[k++]=c;

}

}

break;

}

j++;

}

c=Get_ch(++j);

}

if(IsLetter(c)||c=='_')

{

k=0;

string[k++]=c;

j++;

while

(1)

{

c=Get_ch(j);

if(IsLetter(c)||c=='_'||IsDigit(c))

{

string[k++]=c;

}

else

{

if(IsKeyword(string))

{

Output("$keyword",string);

}

else

{

Output("$ID",string);

}

for(inti=0;i

{

string[i]=NULL;

}

break;

}

j++;

}

}

if(IsDigit(c))

{

k=0;

string[k++]=c;

j++;

while

(1)

{

c=Get_ch(j);

if(IsDigit(c)||c=='-'||c=='e'||c=='E'||c=='.')

{

string[k++]=c;

}

else

{

Output("$Digit",string);

for(inti=0;i

{

string[i]=NULL;

}

break;

}

j++;

}

}

if(c==';')

{

Output("$feihao",";");

}

if(c=='('||c=='['||c=='{'||c==')'||c==']'||c=='}')

{

char*str;

str=newchar[5];

string[0]=c;

Output(Par(c,str),string);

string[0]=NULL;

delete[]str;

}

if(c=='\"')

{

Output("$Yinhao","\"");

}

if(c=='*')

{

string[0]=c;

c=Get_ch(++j);

if(c=='*')

{

string[1]=c;

Output("$Power",string);

}

elseif(c=='=')

{

string[1]=c;

Output("$Mul-EQ",string);

}

else

{

Output("$Mul",string);

j--;

}

string[0]=string[1]=NULL;

}

if(c=='+')

{

string[0]=c;

c=Get_ch(++j);

if(c=='+')

{

string[1]=c;

Output("$Plus-Plus",string);

}

elseif(c=='=')

{

string[1]=c;

Output("$Plus-EQ",string);

}

else

{

Output("$Plus",string);

j--;

}

string[0]=string[1]=NULL;

}

if(c=='-')

{

string[0]=c;

c=Get_ch(++j);

if(c=='-')

{

string[1]=c;

Output("$Dec-Dec",string);

}

elseif(c=='=')

{

string[1]=c;

Output("$Dec-EQ",string);

}

else

{

Output("$Dec",string);

j--;

}

string[0]=string[1]=NULL;

}

if(c=='/')

{

string[0]=c;

c=Get_ch(++j);

if(c=='=')

{

string[1]=c;

Output("$Div-EQ",string);

}

else

{

Output("$Div",string);

j--;

}

string[0]=string[1]=NULL;

}

if(c=='|')

{

string[0]=c;

c=Get_ch(++j);

if(c=='|')

{

string[1]=c;

Output("$Or",string);

}

elseif(c=='=')

{

string[1]=c;

Output("$Or-EQ",string);

}

else

{

Output("$Whuo",string);

j--;

}

string[0]=string[1]=NULL;

}

if(c=='&')

{

string[0]=c;

c=Get_ch(++j);

if(c=='&')

{

string[1]=c;

Output("$And",string);

}

elseif(c=='=')

{

string[1]=c;

Output("$And-EQ",string);

}

else

{

Output("$WAnd",string);

j--;

}

string[0]=string[1]=NULL;

}

if(c=='^')

{

string[0]=c;

c=Get_ch(++j);

if(c=='=')

{

string[1]=c;

Output("$Yihuo-EQ",string);

}

else

{

Output("$Yihuo",string);

j--;

}

string[0]=string[1]=NULL;

}

if(c=='<')

{

string[0]=c;

c=Get_ch(++j);

if(c=='=')

{

string[1]=c;

Output("$xiaoEQ",string);

}

elseif(c=='<')

{

string[1]=c;

Output("$Youyi",string);

}

else

{

Output("$xiaoyu",string);

j--;

}

string[0]=string[1]=NULL;

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2