简易四则运算编译器(自己的创作 C语言)
来源:互联网 发布:土木工程三维建模软件 编辑:程序博客网 时间:2024/05/19 16:35
源程序
#include<stdio.h>
#include<math.h>
typedef struct word{
double v;
int c;
}word;
word B[10];
double result[10];
int s2=0;
void in(int c)
{ if(B[c].c==1)
{result[s2]=B[c].v;
s2++;}
else if(B[c].c<6){
result[s2]=B[c].c;
s2++;
}
}
void compute()
{ int s;
double m1,m2;
s2--;m2=result[s2];
s2--;s=(int)result[s2];
s2--;m1=result[s2];
switch(s){
case 2:result[s2]=m1+m2;s2++;break;
case 3:result[s2]=m1-m2;s2++;break;
case 4:result[s2]=m1*m2;s2++;break;
case 5:result[s2]=m1/m2;s2++;break;
}
}
int cifafenxi(int &s);
main()
{ int i,j,k,m,n;
int a,b,c,s,ci,s1;
int F[20],G[20];
typedef struct shi{
int x;
int y;
char z;
}shi;
shi D[11];
int C[16][14]={{0,5,0,0,0,0,4,0,0,1,2,3,0,0},
{0,0,7,8,0,0,0,0,40,0,0,0,6,0},
{0,0,22,22,10,11,0,22,22,0,0,0,0,9},
{0,0,24,24,24,24,0,24,24,0,0,0,0,0},
{0,5,0,0,0,0,4,0,0,12,2,3,0,0},
{0,0,26,26,26,26,0,26,26,0,0,0,0,0},
{0,5,0,0,0,0,4,0,0,0,13,3,0,0},
{0,27,0,0,0,0,27,0,0,0,0,0,0,0},
{0,28,0,0,0,0,28,0,0,0,0,0,0,0},
{0,5,0,0,0,0,4,0,0,0,0,14,0,0},
{0,29,0,0,0,0,29,0,0,0,0,0,0,0},
{0,30,0,0,0,0,30,0,0,0,0,0,0,0},
{0,0,7,8,0,0,0,15,0,0,0,0,6,0},
{0,0,21,21,10,11,0,21,21,0,0,0,0,9},
{0,0,23,23,23,23,0,23,23,0,0,0,0,0},
{0,0,25,25,25,25,0,25,25,0,0,0,0,0}};
j=1;m=9;
for(i=0;i<5;i++)
{ for(k=0;k<2;k++)
{ D[j].x=m;
j++;}
m++;};
for(i=1;i<=10;i++)
D[i].y=1;
D[1].y=D[3].y=D[5].y=3;
D[3].z=D[4].z='T';
D[1].z=D[2].z='E';
D[5].z=D[6].z='F';
D[7].z=D[8].z='A';
D[9].z=D[10].z='M';
ci=cifafenxi(s1);
if(!ci){printf("词法错误。/n");return(0);}
B[s1].c=8;
a=b=c=0;
F[0]=0;G[0]=8;
printf("状态栈");printf("/t");
printf("符号栈");printf("/t");
printf("余留串");printf("/t");
printf("动作");printf("/t");
printf("下一状态/n");
for(i=0;i<=a;i++)
printf("%d",F[i]);
printf("/t");printf("#");
for(i=1;i<=b;i++)
printf("%d",G[i]);
printf("/t");
for(i=c;B[i].c!=8;i++)
printf("%d",B[i].c);
printf("#");printf("/t");
while(C[F[a]][B[c].c]!=40)
{ if(a==b)
{ m=C[F[a]][B[c].c];
if(m<20)
{ a++;b++;
F[a]=m;
G[b]=B[c].c;
c++;
in(c-1);
if(m==0){
printf("错误语法。/n");return(0);}
}
else {s=n=m-20;
a=a-D[n].y;
b=b-D[n].y+1;
G[b]=D[n].x;
if(n==1||n==3)
compute();}
}
if(a!=b){n=C[F[a]][G[b]];
a++;
F[a]=n;}
if(m<20){printf("S%d",m);
printf("/t");
printf("%d/n",m);
}
else {printf("R%d",s);
printf("/t");
printf("Goto=%d/n",F[a]);
}
for(i=0;i<=a;i++)
printf("%d",F[i]);
printf("/t"); printf("#");
for(i=1;i<=b;i++){
if(G[i]>8)
switch(G[i]){
case 9: printf("%c",D[1].z);break;
case 10:printf("%c",D[3].z);break;
case 11:printf("%c",D[5].z);break;
case 12:printf("%c",D[7].z);break;
case 13:printf("%c",D[9].z);break;}
else printf("%d",G[i]);}
printf("/t");
for(i=c;B[i].c!=8;i++)
printf("%d",B[i].c);
printf("#");
printf("/t");
}
if(C[F[a]][8]==40){
printf("Acc 正确语法!/n");
printf("result=%f/n",result[0]);}
return(0);
}
int cifafenxi(int &s)
{
int i,p,e,n,j,r=0;
char A[20];
char a;
double sum=0,sum1=0,sum2=0,sum3,m=0,x=0;
i=p=e=s=n=j=0;
printf("请输入无符号数四则运算表达式:/n");
scanf("%s",&A);
printf("词法分析结果:/n");
a=A[0];
while(A[i]!='/0')
{
switch(A[i]){
case '+':printf("%c 类型码为 2/n",A[i]);B[s].c=2;
a=A[i+1];
printf("No value! class=%d/n",B[s].c);
s++;break;
case '-':printf("%c 类型码为 3/n",A[i]);B[s].c=3;
a=A[i+1];
printf("No value! class=%d/n",B[s].c);
s++;break;
case '*':printf("%c 类型码为 4/n",A[i]);B[s].c=4;
a=A[i+1];
printf("No value! class=%d/n",B[s].c);
s++;break;
case '/':printf("%c 类型码为 5/n",A[i]);B[s].c=5;
a=A[i+1];
printf("No value! class=%d/n",B[s].c);
s++;break;
case '(':printf("%c 类型码为 6/n",A[i]);B[s].c=6;
a=A[i+1];
printf("No value! class=%d/n",B[s].c);
s++;break;
case ')':printf("%c 类型码为 7/n",A[i]);B[s].c=7;
a=A[i+1];
printf("No value! class=%d/n",B[s].c);
s++;break;
case '.':printf("%c",A[i]);p++;
if(A[i+1]>='0'&&A[i+1]<='9'||A[i+1]=='E')
break;
else if(a=='.'){
printf("错误的单词/n");s++;a=A[i+1];p--;r=1;}
else {printf(" 类型码为 1/n");B[s].v=sum1,B[s].c=1;
printf("value=%f class=%d/n",B[s].v,B[s].c);s++;
sum1=0;a=A[i+1];p--;}
break;
case 'E':printf("%c",A[i]);
e++;
switch(A[i+1]){
case 'E':printf(" 错误的单词/n");r=1;
a=A[i+1];e--;break;
case '-':
case '+':i++;
printf("%c",A[i]);if(A[i]=='-')j++;
default:if(A[i+1]>='0'&&A[i+1]<='9')
break;
else if((A[i+1]>'9'||A[i+1]<'0')||A[i+1]=='/0')
{printf(" 错误的单词/n");s++;a=A[i+1];e=p=0;r=1;}
}
break;
default:
printf("%c",A[i]);
if((A[i]>'9'||A[i]<'0')&&A[i]!='.'&&A[i]!='E')
if((A[i+1]>'9'||A[i+1]<'0')&&A[i+1]!='.'&&A[i+1]!='E'&&A[i+1]!='/0')
break;
else {printf(" 错误的单词/n");s++;
r=1;a=A[i+1];break;}
if(A[i]>='0'&&A[i]<='9'){
if(e!=1){
if(p==0) sum1=sum1*10+A[i]-48;
else {n++;x=x*10+(A[i]-48); }}
else m=m*10+A[i]-48;
}
switch(A[i+1]){
case '.':if(p!=0)goto l1;
case 'E':if(e==0) break;
l1:default:if(A[i+1]>='0'&&A[i+1]<='9')
break;
else if(a=='E'){printf(" 错误的单词/n");e=p=0;
r=1;s++;a=A[i+1];}
else{printf(" 类型码为 1/n");
if(j==1)sum3=pow(10,-m);
else sum3=pow(10,m);
sum2=x/pow(10,n);
sum=(sum1+sum2)*sum3;
B[s].v=sum;B[s].c=1;
printf("value=%f class=%d/n",B[s].v,B[s].c);s++;
x=m=sum1=sum=sum2=0;j=e=p=n=0;a=A[i+1];}
}
}i++;
}
if(r)
return 0;
else return 1;
}
正确的输入及结果:
请输入无符号数四则运算表达式:
1.2E+2-100
词法分析结果:
1.2E+2 类型码为 1
value=120.000000 class=1
- 类型码为 3
No value! class=3
100 类型码为 1
value=100.000000 class=1
状态栈 符号栈 余留串 动作 下一状态
0 # 131# S5 5
05 #1 31# R6 Goto=3
03 #F 31# R4 Goto=2
02 #T 31# R2 Goto=1
01 #E 31# S8 8
018 #E3 1# R8 Goto=6
016 #EA 1# S5 5
0165 #EA1 # R6 Goto=3
0163 #EAF # R4 Goto=13
01613 #EAT # R1 Goto=1
01 #E # Acc 正确语法!
result=20.000000
Press any key to continue
语法错误的输入及结果:
请输入无符号数四则运算表达式:
12++
词法分析结果:
12 类型码为 1
value=12.000000 class=1
+ 类型码为 2
No value! class=2
+ 类型码为 2
No value! class=2
状态栈 符号栈 余留串 动作 下一状态
0 # 122# S5 5
05 #1 22# R6 Goto=3
03 #F 22# R4 Goto=2
02 #T 22# R2 Goto=1
01 #E 22# S7 7
017 #E2 2# 错误语法。
Press any key to continue
词法错误的输入及结果:
请输入无符号数四则运算表达式:
1.2Ea+.
词法分析结果:
1.2E 错误的单词
a+ 类型码为 2
No value! class=2
.错误的单词
词法错误。
Press any key to continue
- 简易四则运算编译器(自己的创作 C语言)
- 大数四则运算(C语言)
- C语言的编译器
- C语言数据结构----栈的应用(四则运算)
- 栈的测试--四则运算表达式求值(C语言)
- 分数的四则运算及化简(C语言实现)
- TCC研究(1): Tiny C Compiler最小的C语言编译器,自己编译自己
- 带括号的四则运算C语言实现
- C语言实现矩阵的四则运算
- C语言|构造一个简易编译器检测括号是否正确
- C语言实现 加减乘除四则运算(小数)
- 数据结构(基于C语言) 简单四则运算
- C语言实现四则运算(小型计算器)
- 四则运算(C语言)
- C语言实现四则运算
- C语言编译四则运算
- c语言加减乘除, 四则运算
- 分数的四则运算(c++)
- 对java技术String的探讨续
- 公司网络测试报告
- 将人民币转换为大写的java类
- 刷新--界面刷新函数比较
- 保存处理过程
- 简易四则运算编译器(自己的创作 C语言)
- 配置文件Web config
- 在Myeclipse7中整合struts2
- linux系统服务setup设置
- 本地计算机的 OracleOraDb10g_home1TNSListener服务启动后又停止了,一些服务自动停止
- IBM certifications III 认证考试
- 关于PAZU打印控件
- RMAN命令详解
- JS等待页面自动跳转