当前位置:新励学网 > 秒知问答 > 编译原理规则集怎么写

编译原理规则集怎么写

发表时间:2024-07-28 02:30:46 来源:网友投稿

用来描叙化学分子式的书写规则(例如: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失败!

免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。

如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!