编译原理课程设计说明书--词法分析,语法分析,语义分析

发布时间 : 星期二 文章编译原理课程设计说明书--词法分析,语法分析,语义分析更新完毕开始阅读

桂林电子科技大学编译原理课程设计说明书 第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 #include #include using namespace std;

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='A'))//终结符 { tmp.append(1,rights[j]);//将字符转为字符串 add(tFirst[get_index(p[i].left)],tmp);//若是终止符,则直接加入该first集 tmp=\恢复为空串 break; } else{ if((int)(tFirst[get_index(rights[j])]).find('@')==-1)//该终结符不含'@' {

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

联系合同范文客服:xxxxx#qq.com(#替换为@)