桂林电子科技大学编译原理课程设计说明书 第23页
{ c = getchar(); } if( (c <= '9' && c>= '0') | (c>= 'a' && c<= 'z')) return; else if( c == '(') { f_exp(); if(c == ')') { return ; }else{ cout<<\括号匹配错误\ exit(0); } } else{ cout<<\当前错误字符:\ exit(0); } }
void f_exp_remains(){ if(flag == 1) { c = getchar(); } if(c == '$'){ flag = 1; return; } if(c == '+'){ flag = 1; f_term(); f_exp_remains(); } else if(c == ')'){ flag = 0; return ; }else{ cout<<\当前错误字符:\ exit(0); }
桂林电子科技大学编译原理课程设计说明书 第24页
}
void f_term_remains(){ if(flag == 1){ c = getchar(); } if(c == '*'){ flag = 1; f_factor(); f_term_remains(); } else{ flag = 0; //这里如果不是*,T’直接取空,递退到上级函数处理,所以当前输入字符没有处理,flag = 0,调用的下一个函数不能输入新的字符 return; } }
fisrt集计算:
#include
struct define //文法存储形式 {
char left;
string right; };
/*统计文法条数,非终止符个数,终止符个数,并把非终止符,终止符弄成一个字符串,用于查找下标*/
void get_gene(); //获得产生式,并统计
int get_index(char b); //得到终止符,或非终止符统一下标
void add(string &tLeft , string s); //将s添加到tLeft中,即将右边的字符串添加到左边的字符串中,去掉重复,如果右边存在新的字符,要将flag置为 1 ,用于不动点算法。
void first(); //计算first集
string s_NT=\ //用于存储所有出现的非终止符,终止符(统一下标查找) struct define *p = new define[10]; //文法数组
string *tFirst=new string [10];//存非终结符的first集 int counts , tCount , ntCount; //文法条数,终结符符数,非终结符个数
桂林电子科技大学编译原理课程设计说明书 第25页
bool flag=1; //用于不动点算法
int main() {
int i;
get_gene(); //获得产生式,并统计 first();
cout<<\ for(i=0;i cout<<\ return 0; } void first() { int i,j; string rights,tmp; flag=1; while(flag) { flag=0;//若无更新,下一循环将退出 for(i=0;i add(tFirst[get_index(p[i].left)],tFirst[get_index(rights[j])]);//将非终结符的rights[j]集加到p[i].left的first集中 break; 桂林电子科技大学编译原理课程设计说明书 第26页 } else if((int)(tFirst[get_index(rights[j])]).find('@')!=-1&&j /*统计文法条数,非终止符个数,终止符个数,并把非终止符,终止符弄成一个字符串,用于查找下标*/ void get_gene() //获得产生式,并统计 { ifstream in(\ int i; char b; tCount=0; counts = 0; while( in>> p[counts].left >> b >> p[counts].right) //输入文法,一次获取一行 counts++; in.close(); cout< for(i=0;i /*统计非终止符,终止符*/ for(i=0;i
相关推荐: