编译原理实习设计词法分析程序.docx
《编译原理实习设计词法分析程序.docx》由会员分享,可在线阅读,更多相关《编译原理实习设计词法分析程序.docx(31页珍藏版)》请在冰点文库上搜索。
编译原理实习设计词法分析程序
编译原理实习设计
词法分析程序
一.实习目的
构造一个小语言的词法分析程序。
二.实习要求
设计一个包含简单算术表达式、赋值语句、IF语句的小语言的文法。
根据此文法,构造一个词法分析程序,输入以“#”为结束符的源程序,输出为各类单词表和单词串文件。
源程序和输出的单词串均以文件的形式存放。
单词的自身值均为其对应的表的指针,如标识符表的指针、常数表的指针等。
提交实习报告和程序运行结果。
三.相关图表
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;
}
if(c=='>')
{
string[0]=c;
c=Get_ch(++j);
if(c=='=')
{
string[1]=c;
Output("$DaEQ",string);
}
elseif(c=='>')
{
string[1]=c;
Output("$zuoyi",string);
}
else
{
Output("$dayu",string);
j--;
}
string[0]=string[1]=NULL;
}
if(c=='%')
{
string[0]=c;
c=Get_ch(++j);
if(c=='=')
{
string[1]=c;
Output("$MoEQU",string);
}
else
{
Output("$GESHICONTROL",string);
j--;
}
string[0]=string[1]=NULL;
}
if(c=='\'')
{
Output("$Syin","\'");
}
if(c=='!
')
{
string[0]=c;
c=Get_ch(++j);