工学编译原理词法分析语法分析语义分析C语言Word文档下载推荐.docx
《工学编译原理词法分析语法分析语义分析C语言Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《工学编译原理词法分析语法分析语义分析C语言Word文档下载推荐.docx(44页珍藏版)》请在冰豆网上搜索。
boolis_letter(charc){
returnc>
='
a'
&
&
c<
z'
||c>
A'
Z'
;
}
boolis_digtial(charc){
0'
9'
}
boolis_dot(charc)
{
returnc=='
'
||c=='
'
voididentifier()//标示符的判断
m=0;
while(ch>
ch<
||ch>
)
token[m++]=ch;
ch=s[++p];
token[m]='
\0'
ch=s[--p];
syn=10;
for(n=0;
n<
6;
n++)
if(strcmp(token,r[n])==0)
syn=n+1;
break;
voiddigit(boolpositive)//数字的判断
len=sum=0;
ch=s[p];
sum=sum*10+ch-'
if(ch=='
.'
dsum=sum;
pos=0.1;
dsum=dsum+(ch-'
)*pos;
pos=pos*0.1;
e'
index[len++]=ch;
-'
||ch=='
+'
if(!
(ch>
))
syn=-1;
else
if(syn==-1||(ch>
)||ch=='
//对数字开头的标识符进行判错。
)ch=s[++p];
//找到下一次要判断的开头
syn=12;
positive)dsum*=-1.0;
if(ch>
syn=11;
positive)sum*=-1;
boolcheck_behind_digit()
inti=p+1;
while(s[i]!
if(s[i]>
s[i]<
)returntrue;
elseif(s[i]!
'
s[i]!
\t'
\n'
)returnfalse;
i++;
returnfalse;
boolcheck_pre_prog()
inti=p-1;
while(i>
=0)
if(s[i]!
||s[i]>
elsereturntrue;
i--;
returntrue;
voidpot()
while
(1)
row++;
(ch=='
voidscaner()
memset(token,0,sizeof(token));
pot();
//cout<
<
p<
ch<
endl;
if(is_letter(ch))
identifier();
elseif(is_digtial(ch))
digit(true);
len=0,token[len++]=ch;
if(s[p+1]=='
syn=22;
token[len++]=s[p+1];
p++;
elsesyn=20;
elseif(ch=='
>
syn=24;
elsesyn=23;
syn=25;
elsesyn=18;
!
elsesyn=-1;
if(check_behind_digit()&
check_pre_prog())
++p;
syn=13;
token[0]=ch;
digit(false);
*'
)syn=15,strcpy(token,"
*"
);
/'
)syn=16,strcpy(token,"
/"
)syn=26,strcpy(token,"
"
('
)syn=27,strcpy(token,"
("
)'
)syn=28,strcpy(token,"
)"
#'
)syn=0,strcpy(token,"
#"
token<
sum<
syn<
intmain()
inti,j;
p=0;
row=1;
cout<
请选择输入方式,按0表示键盘输入,按1表示文件输入"
scanf("
%d"
&
i);
if(i)freopen("
1.txt"
r"
stdin);
elseprintf("
\nPleaseinputthestring:
\n"
do{
%c"
ch);
s[++p]=ch;
}while(ch!
s[0]='
s<
printf("
种别码单词符号\n"
scaner();
switch(syn)
case11:
(%-3d,%d)\n"
syn,sum);
case12:
\n(%d,%lf"
syn,dsum);
if(len)
for(i=0;
i<
len;
i++)printf("
index[i]);
len=0;
)\n"
//实数输出
case-1:
(第%d行,error!
row);
default:
(%-3d,%s)\n"
syn,token);
}while(syn!
=0);
//printf("
词法分析成功~请按任意键结束\n"
return0;
/*
function
a=9;
x=2*4;
b=a+x;
endfunc
#
x=a+b*c;
a=(a+b)/c;
x=(x+y)*(a+b)+c+d*(a+c)+(a+f)+(d-g);
b=(a*c+4)*9;
*/
语法分析
#include<
cmath>
intsyn,p,sum,kk,m,n,row,error;
doubledsum,pos;
charindex[800],len;
chartok