编译原理课程设计_算术表达式的语法分析及语义分析程序设计_表达式语法分析设计

2020-02-28 其他范文 下载本文

编译原理课程设计_算术表达式的语法分析及语义分析程序设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“表达式语法分析设计”。

设计题一:算术表达式的语法分析及语义分析程序设计。1.目的通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。2.设计内容及要求:

算术表达式的文法:

〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/

选择算符优先分析方法完成以上任务,生成逆波兰式的中间代码;

(1)写出算术表达式的符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(2)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

源代码

#define _CRT_SECURE_NO_WARNINGS #include “stdio.h” #include “stdlib.h” #include using namespace std;char data[20][20];//算符优先关系 char s[100];//模拟符号栈s char lable[20];//文法终极符集 char input[100];//文法输入符号串 char str[20][10];//用于输入串的分析 int k,j;char a,q;int r;//文法规则个数 int r1;int m, n, N;//转化后文法规则个数 char st[10][30];//用来存储文法规则 char first[10][10];//文法非终结符FIRSTVT集 char last[10][10];//文法非终结符LASTVT集

int fflag[10] = { 0 };//标志第i个非终结符的FIRSTVT集是否已求出 int lflag[10] = { 0 };//标志第i个非终结符的LASTVT集是否已求出 int deal();//对输入串的分析

int terminal_symbol(char c);//判断字符c是否是终极符 int location(char c);//求字符c在算符优先关系表中的下标 void out(int j, int k, char *s);//打印s栈

void firstvt(char c);//求非终结符c的FIRSTVT集 void lastvt(char c);//求非终结符c的LASTVT集 void table();//创建文法优先关系表 char output[10];//存储逆波兰式 void main(){

int i, j, k = 0;printf(“请输入文法规则数:”);scanf(“%d”, &r);printf(“请输入文法规则:n”);for(i = 0;i

} for(i = 0;i

} for(i = 0;i

for(j = 0;st[i][j]!= '';j++)if((st[i][j]'Z')&& st[i][j]!= '-'&&st[i][j]!= lable[k++] = st[i][j];for(j = 0;st[i][j]!= '';j++){

} if(st[i][0]'Z'){

} if(st[i][j] >= 'A'&&st[i][j]

} if(st[i][j + 1] >= 'A'&&st[i][j + 1]

} printf(“文法error!n”);exit(-1);printf(“文法error!n”);exit(-1);scanf(“%s”, st[i]);//存储文法规则,初始化FIRSTVT集和LASTVT集*/

first[i][0] = 0;/*first[i][0]和last[i][0]分别表示st[i][0]非终极符的last[i][0] = 0;

FIRSTVT集和LASTVT集中元素的个数*/

'>'&&st[i][j]!= '|')lable[k] = '#';lable[k + 1] = '';

} table();//

printf(“FIRST集为:n”);//输出每个非终结符的FIRST集 for(i = 0;i

} printf(“LAST集为:n”);//输出每个非终结符的LAST集 for(i = 0;i

} printf(“算符优先分析表如下:n”);for(i = 0;lable[i]!= '';i++)printf(“t%c”, lable[i]);printf(“n”);for(i = 0;i

} printf(“请输入文法输入符号串以#结束:”);scanf(“%s”, input);deal();cout

char text[20][10];//存储改写后的文法

int i, j, k, t, l, x = 0, y = 0;int m, n;x = 0;for(i = 0;i

firstvt(st[i][0]);

lastvt(st[i][0]);} for(i = 0;i

{

text[x][y] = st[i][0];

y++;

for(j = 1;st[i][j]!= '';j++)

{

if(st[i][j] == '|')//

{

text[x][y] = '';

x++;

y = 0;

text[x][y] = st[i][0];

y++;

text[x][y++] = '-';

text[x][y++] = '>';

}

else

{

text[x][y] = st[i][j];

y++;

}

}

text[x][y] = '';

x++;

y = 0;} r1 = x;//

printf(“转化后的文法为:n”);for(i = 0;i

printf(“%sn”, text[i]);} for(i = 0;i

{

//输出转化后的文法规则串 /*求每个终结符的推导结果(去掉“->”后的} str[i][0] = text[i][0];for(j = 3, l = 1;text[i][j]!= '';j++, l++)str[i][l] = text[i][j];str[i][l] = '';for(i = 0;i

for(j = 1;text[i][j + 1]!= '';j++){

if(terminal_symbol(text[i][j])&& terminal_symbol(text[i][j + 1])){

} if(text[i][j + 2]!= ''&&terminal_symbol(text[i][j])&& {

} if(terminal_symbol(text[i][j])&&!terminal_symbol(text[i][j + 1]))//终结{

} if(!terminal_symbol(text[i][j])&& terminal_symbol(text[i][j + 1]))//非终{ for(k = 0;k

} m = location(text[i][j]);for(t = 0;t

} n = location(first[k][t + 1]);data[m][n] = '

break;m = location(text[i][j]);n = location(text[i][j + 2]);data[m][n] = '=';m = location(text[i][j]);n = location(text[i][j + 1]);data[m][n] = '=';terminal_symbol(text[i][j + 2])&&!terminal_symbol(text[i][j + 1]))符和非终结符相接,用后于关系填表

结符和终结符相接,用先于关系填表

if(st[k][0] == text[i][j])

break;

}

n = location(text[i][j + 1]);

for(t = 0;t

{

m = location(last[k][t + 1]);

data[m][n] = '>';

}

}

} } m = location('#');//#后于所有的终结符规约

for(t = 0;t

n = location(first[0][t + 1]);

data[m][n] = '

for(t = 0;t

m = location(last[0][t + 1]);

data[m][n] = '>';} data[n][n] = '=';}

void firstvt(char c){ int i, j, k, m, n;for(i = 0;i

{

if(st[i][0] == c)

break;} if(fflag[i] == 0){

n = first[i][0] + 1;

m = 0;

do

{

if(m == 2 || st[i][m] == '|')

{ if(terminal_symbol(st[i][m + 1]))

//求FIRSTVT集

}

}

} {

} else {

} if(terminal_symbol(st[i][m + 2])){

} if(st[i][m + 1]!= c){

}

firstvt(st[i][m + 1]);for(j = 0;j

}

for(k = 0;k

}

int t;

for(t = 0;t

}

if(t == n){

}

first[i][n] = first[j][k + 1];n++;

if(first[i][t] == first[j][k + 1])

break;

if(st[j][0] == st[i][m + 1])

break;

first[i][n] = st[i][m + 2];n++;first[i][n] = st[i][m + 1];n++;m++;} while(st[i][m]!= '');first[i][n] = '';first[i][0] =--n;fflag[i] = 1;

void lastvt(char c)//求LASTVT集 {

int i, j, k, m, n;for(i = 0;i

} if(lflag[i] == 0){

n = last[i][0] + 1;m = 0;do {

if(st[i][m + 1] == '' || st[i][m + 1] == '|'){

if(terminal_symbol(st[i][m])){

} else {

if(terminal_symbol(st[i][m1];n++;last[i][n] = st[i][m];n++;if(st[i][0] == c)break;

}

}

}

}

}

}

}

if(t == n){

}

last[i][n] = last[j][k + 1];n++;m++;} while(st[i][m]!= '');last[i][n] = '';last[i][0] =--n;lflag[i] = 1;int deal(){

int i, j;int size = 0;// int x, y;int z;//输入串的长度 k = 1;s[k] = '#';//栈置初值

for(i = 0;input[i]!= '';i++);//计算输入串的长度 z = i--;// i = 0;while((a = input[i])!= '')//a表示要输入的字符 {

if(terminal_symbol(s[k]))j = k;j = k1]))j = j2;x = location(s[j]);y = location(q);} while(data[x][y]!= '

} k = j + 1;if(k == 2 && a == '#'){

out(1, k, s);printf(“%c”, a);out(i + 1, z, input);printf(“结束n”);for(N = 0;N

} if(!terminal_symbol(s[m])&&!terminal_symbol(str[N][n])){

} else

if(terminal_symbol(s[m]))if(s[m] == str[N][n]){

}

s[j + 1] = str[N][0];break;

if(terminal_symbol(s[m + 1])&& terminal_symbol(str[N][n + 1]){

}

s[j + 1] = str[N][0];break;&& s[m + 1] == str[N][n + 1])

}

} printf(“规约成功!n”);return 1;//输入串符合文法的定义

else

if(data[x][y] == '

out(1, k, s);

printf(“%c”, a);

out(i + 1, z, input);

printf(“移进n”);

k++;

s[k] = a;

i++;

}

else

{

printf(“n规约失败n”);

return 0;

} } printf(“n规约失败n”);//

return 0;}

void out(int j, int k, char *s){ int n = 0;int i;for(i = j;i

printf(“%c”, s[i]);

n++;} for(;n

printf(“ ”);} }

int location(char c){ int i;for(i = 0;lable[i]!= '';i++)

//求字符c在算符优先关系表中的下标

} {

} return-1;if(c == lable[i])return i;int terminal_symbol(char c)//判断字符c是否是终极符 {

} int i;for(i = 0;lable[i]!= '';i++){

} return 0;if(c == lable[i])return 1;

《编译原理课程设计_算术表达式的语法分析及语义分析程序设计.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
编译原理课程设计_算术表达式的语法分析及语义分析程序设计
点击下载文档
相关专题 表达式语法分析设计 语义 算术 表达式 表达式语法分析设计 语义 算术 表达式
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文