首页 自底向上1解读

自底向上1解读

举报
开通vip

自底向上1解读//对于标识符,赋值,需要自己处理了//只需要维护一个表就行了.//赋值运算符的优先级很低.#include#include#include#includeenumIDENTIFER_TYPE{NUMBER,OPERATOR,LB,RB,END,ERROR};enumOPERATOR_TYPE{EXPR,ADD,SUB,MUL,DIV,ATOM};/*ATOM:给原子(数)赋一个优先级*/typedefstructtagNODE{inttype;doublevalue;intope;structtagNODE*le...

自底向上1解读
//对于标识符,赋值,需要自己处理了//只需要维护一个表就行了.//赋值运算符的优先级很低.#include#include#include#includeenumIDENTIFER_TYPE{NUMBER,OPERATOR,LB,RB,END,ERROR};enumOPERATOR_TYPE{EXPR,ADD,SUB,MUL,DIV,ATOM};/*ATOM:给原子(数)赋一个优先级*/typedefstructtagNODE{inttype;doublevalue;intope;structtagNODE*left,*right,*parent;}NODE;/*词法 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 */intg_type;doubleg_value;intg_ope;constchar*g_str;constchar*g_last_str;intGetNextToken(){staticcharbuff[32];inti=0,k;g_last_str=g_str;while(*g_str&&*g_str=='')++g_str;if(!*g_str)returng_type=END;if(isdigit(*g_str)){while(isdigit(*g_str))buff[i++]=*g_str++;buff[i]=0;g_value=atof((constchar*)buff);returng_type=NUMBER;}switch(*g_str++){case'+':g_ope=ADD;returng_type=OPERATOR;case'-':g_ope=SUB;returng_type=OPERATOR;case'*':g_ope=MUL;returng_type=OPERATOR;case'/':g_ope=DIV;returng_type=OPERATOR;case'(':returng_type=LB;case')':returng_type=RB;}returng_type=ERROR;}voidPutBack(){if(g_str!=g_last_str)g_str=g_last_str;}/*语法分析*/intg_error;intg_lb;constchar*g_pos;NODE*MakeNode(inttype,doublevalue,intope,NODE*l,NODE*r,NODE*p){NODE*node=(NODE*)malloc(sizeof(NODE));node->type=type;node->value=value;node->ope=ope;node->left=l;node->right=r;node->parent=p;returnnode;}voidDestroyTree(NODE*tree){if(!tree)return;if(tree->left)DestroyTree(tree->left);if(tree->right)DestroyTree(tree->right);free(tree);}intLevel(intope){switch(ope){caseATOM:return0;caseMUL:caseDIV:return1;caseADD:caseSUB:return2;caseEXPR:return32;}}voidShowError(){charbuff[256]={0};switch(g_error){case1:sprintf(buff,"需要一个运算符\t位置%s\n",g_pos);break;case2:sprintf(buff,"需要一个表达式\t位置%s\n",g_pos);break;case3:sprintf(buff,"括号不匹配\t位置%s\n",g_pos);break;case4:sprintf(buff,"空表达式\t位置%s\n",g_pos);break;case5:sprintf(buff,"表达式不应该在此结束\t位置%s\n",g_pos);break;}printf(buff);}NODE*BuildSyntaxTreeImpl(){NODE*root,*c,*new_node;intuse_level=0;intstate=0;root=c=MakeNode(OPERATOR,0,EXPR,0,0,0);while(1){GetNextToken();switch(g_type){caseNUMBER:if(state!=0){PutBack();g_error=1;gotoExitWithError;}new_node=MakeNode(NUMBER,g_value,ATOM,0,0,0);use_level=1;state=1;break;caseLB:if(state!=0)PutBack();g_error=1;gotoExitWithError;}++g_lb;new_node=BuildSyntaxTreeImpl();if(new_node==NULL){g_error=4;gotoExitWithError;}use_level=0;/*括号表达式的优先级很高,不使用优先级比较,直接建为右子树*/state=1;break;caseRB:if(!g_lb){g_error=3;gotoExitWithError;}--g_lb;caseEND:{c=root->right;free(root);if(c==NULL){g_error=4;gotoExitWithError;}if(state!=1){g_error=5;gotoExitWithError;}c->parent=NULL;returnc;}default:if(state!=1){PutBack();g_error=2;gotoExitWithError;}new_node=MakeNode(OPERATOR,0,g_ope,0,0,0);use_level=1;state=0;}if(use_level){while(Level(new_node->ope)>=Level(c->ope))c=c->parent;new_node->left=c->right;c->right=new_node;new_node->parent=c;c=new_node;}else{c->right=new_node;new_node->parent=c;}}ExitWithError:g_pos=g_str;DestroyTree(root);return0;}NODE*BuildSyntaxTree(constchar*expression){NODE*tree;g_lb=0;g_last_str=g_str=expression;tree=BuildSyntaxTreeImpl();if(g_lb){PutBack();g_error=3;g_pos=g_str;DestroyTree(tree);tree=0;}returntree;}/*结果计算*/doubleEvalueTree(NODE*tree){doublel,r;if(!tree)return0;if(tree->ope==ATOM)returntree->value;l=EvalueTree(tree->left);r=EvalueTree(tree->right);switch(tree->ope){caseADD:returnl+r;caseSUB:returnl-r;caseMUL:returnl*r;caseDIV:returnl/r;}return0;}doubleEvalue(constchar*expression){NODE*tree=BuildSyntaxTree(expression);doublevalue=0;if(!tree)ShowError();elsevalue=EvalueTree(tree);DestroyTree(tree);returnvalue;}intmain(){printf("%lf\n",Evalue("1+8*(9-8)*9+2-1"));return0;}
本文档为【自底向上1解读】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_597436
暂无简介~
格式:doc
大小:10KB
软件:Word
页数:6
分类:
上传时间:2020-07-18
浏览量:0