编译原理规则集怎么写
用来描叙化学分子式的书写规则(例如:AL2(CO3)3 ,Cu(OH)2)
a-->mn/(c)
mn 为一个大写字母和一个小写字母
c-->b/bc
c为一个分子式
b-->a/an
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 300
#define GMLEN 10
struct elem{
char name;
double v;
}nTbl[MAXN];
char *pos;
char cmstr[GMLEN];
FILE *fp;
int c;
double FACTOR();
double ATOM()//处理文法 a
{
int i=0;
char W;
double num;
int j;
while((c=*pos++)==' '||c=='/t');
if(c=='')
return 0.0;
if(c>='A'c<='Z')
{
W[i]=c;
c=*pos++;
if(c>='a'c<='z')
W[++i]=c;
W[i]='/0';
for(j=0;nTbl[j].v>0.0;j++)
if(strcmp(W,nTbl[j].name)==0)
return nTbl[j].v;
printf("元素表中没有所输入的元素!");
return 0.0;
}
else if(c=='(')
{
if((num=FACTOR())<0.0)
return -1.0;
if((c=*pos++)!=')')
printf("括号不必配!");
return num;
}
printf("分子式中存在非法字符!");
return -1.0;
}
double MATOM() //处理文法 b
{
double num;
int n=1;
if((num=ATOM())<0.0)
return -1.0;
c=*pos++;
if(c>='0'c<='9')
{
n=0;
while(c>='0'c<='9')
{
n=n*10+c-'0';
c=*pos++;
}
pos--;
return num*n;
}
}
double FACTOR()//处理文法c
{
double num,d;
if((num=MATOM())<0.0)
{
return -1.0;
}
while(*pos>='A'*pos<='Z'||*pos=='(')
{
if((d=MATOM())<0.0)
return -1.0;
num+=d;
}
return num;
}
int main(int argc, char *argv[])
{
int i=0;
double num;
char fname[]="atom.dat";
if((fp=fopen(fname,"r"))==NULL)
{
printf("打开文件%s失败!
免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。
如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!
新励学网教育平台
海量全面 · 详细解读 · 快捷可靠
累积科普文章数:18,862,126篇