设计题一:算术表达式的语法分析及语义分析程序设计。、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。:算术表达式的文法:〈无符号整数〉∷= 〈数字〉{〈数字〉}〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉}〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’〈加法运算符〉∷= +|-〈乘法运算符〉∷= *|/选择算符优先分析方法完成以上任务,生成逆波兰式的中间代码;(1)写出算术表达式的符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。(2)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。源代码#define_CRT_SECURE_NO_WARNINGS#include""#include""#include<iostream>usingnamespacestd;chardata[20][20]; //算符优先关系chars[100]; //模拟符号栈scharlable[20]; //文法终极符集charinput[100]; //文法输入符号串charstr[20][10]; //用于输入串的分析intk,j;chara,q;intr; //文法规则个数intr1;intm,n,N; //转化后文法规则个数charst[10][30]; //用来存储文法规则charfirst[10][10]; //文法非终结符FIRSTVT集charlast[10][10]; //文法非终结符LASTVT集intfflag[10]={0}; //标志第i个非终结符的FIRSTVT集是否已求出intlflag[10]={0}; //标志第i个非终结符的LASTVT集是否已求出intdeal(); //对输入串的分析intterminal_symbol(charc); //判断字符c是否是终极符intlocation(charc); //求字符c在算符优先关系表中的下标voidout(intj,intk,char*s); //打印s栈voidfirstvt(charc); //求非终结符c的FIRSTVT集voidlastvt(charc); //求非终结符c的LASTVT集voidtable(); //创建文法优先关系表charoutput[10];//存储逆波兰式voidmain(){inti,j,k=0;printf("请输入文法规则数:");scanf("%d",&r);printf("请输入文法规则:\n");for(i=0;i<r;i++){scanf("%s",st[i]); //存储文法规则,初始化FIRSTVT集和LASTVT集*/ first[i][0]=0; /*first[i][0]和last[i][0]分别表示st[i][0]非终极符的FIRSTVT集和LASTVT集中元素的个数*/last[i][0]=0;}for(i=0;i<r;i++) //判断文法是否合法{for(j=0;st[i][j]!='\0';j++){if(st[i][0]<'A'||st[i][0]>'Z'){printf("文法error!\n");exit(-1);}if(st[i][j]>='A'&&st[i][j]<='Z'){if(st[i][j+1]>='A'&&st[i][j+1]<='Z'){printf("文法error!\n");exit(-1);}}}}for(i=0;i<r;i++)//for(j=0;st[i][j]!='\0';j++)if((st[i][j]<'A'||st[i][j]>'Z')&&st[i][j]!='-'&&st[i][j]!='>'&&st[i][j]!='|')lable[k++]=st[i][j];lable[k]='#';lable[k+1]='\0';table();//printf("FIRST集为:\n"); //输出每个非终结符的FIRST集for(i=0;i<r;i++){printf("%c:",st
编译原理课程设计 算术表达式的语法分析及语义分析程序设计 来自淘豆网www.taodocs.com转载请标明出处.