• 大小: 2KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2022-11-21
  • 语言: 其他
  • 标签: 编译原理  

资源简介

实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。 G[E]:E→E+T∣E-T∣T T→T*F∣T/F∣F F→(E)∣i 说明:终结符号i为用户定义的简单变量,即标识符的定义。 要求: (1)构造该算符优先文法的优先关系矩阵或优先函数; (2)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串是否为该文法定义的算术表达式的判断结果。 (3)算符优先分析过程应能发现输入串出错。 (4)设计两个测试用例(尽可能完备),并给出测试结果。

资源截图

代码片段和文件信息

#include“opp.h“
/********************************************
G[E]:E→E+T∣E-T∣
T→T*F∣T/F∣F
F→(E)∣i
/********************************************/
int M[8][8];
int buffer[20];
char str[20];
int S[30];
int point;
int cfw = 0;
int cbw = 0;
void initM(){
M[0][0] = FW; M[0][1] = FW; M[0][2] = FW; M[0][3] = FW; M[0][4] = FW; M[0][5] = FW; M[0][6] = EQ;
M[1][2] = BW; M[1][3] = BW; M[1][4] = BW; M[1][5] = BW; M[1][6] = BW; M[1][7] = BW; 
M[2][0] = FW; M[2][1] = FW; M[2][2] = BW; M[2][3] = BW; M[2][4] = FW; M[2][5] = FW; M[2][6] = BW; M[2][7] = BW; 
M[3][0] = FW; M[3][1] = FW; M[3][2] = BW; M[3][3] = BW; M[3][4] = FW; M[3][5] = FW; M[3][6] = BW; M[3][7] = BW; 
M[4][0] = FW; M[4][1] = FW; M[4][2] = BW; M[4][3] = BW; M[4][4] = BW; M[4][5] = BW; M[4][6] = BW; M[4][7] = BW;
M[5][0] = FW; M[5][1] = FW; M[5][2] = BW; M[5][3] = BW; M[5][4] = BW; M[5][5] = BW; M[5][6] = BW; M[5][7] = BW;
M[6][2] = BW; M[6][3] = BW; M[6][4] = BW; M[6][5] = BW; M[6][6] = BW; M[6][7] = BW;
M[7][0] = FW; M[7][1] = FW; M[7][2] = FW; M[7][3] = FW; M[7][4] = FW; M[7][5] = FW; M[7][7] = EQ;
}
int mach(int nowint point){
switch(M[now][buffer[point]]){
case FW:cfw++;return 1;
case BW:
if(cbw cbw++;
return 2;
}
else{
printf (“find error in %c\n“str[point]);return 0;
}
case EQ:return 0;
default:printf (“find error in %c\n“str[point]);return 0;
}
}
int analysis(){
S[0] = SHARP ;
int count = 1;
int spoint = 0;
int revalue;
int now = S[spoint];
while(count!=0){
revalue = mach(nowpoint);
switch(revalue){
case 1:
S[count] = buffer[point];
spoint = count;
count++;point++;
now = S[spoint];
break;
case 2:
if(count==spoint+1){
spoint--;
now = S[spoint];
}
else{
count = count-2;
spoint=count-2>0?count-2:0;
now = S[spoint];
}
break;
default: return 0;
}
}
return 0;
}
void main(){
FILE *input;
input = fopen(“test1.txt““rb“);
if (!input){
cout << “cannot open test.txt.“ << endl;
}
else{
initM();
cout << “open  file “ << endl;
//cout << “open “  << file << endl;
int i = 0j = 0;
point = 0;
char c;
while(!feof(input))
{
c = fgetc(input);
if(c==‘(‘){
c = fgetc(input);
buffer[i] = (int)c-48;
cout << buffer[i];
i++;
c = fgetc(input);
if(c==‘‘){
c = fgetc(input);
str[i-1] = c;
//cout << str[i-1];
}
}
}
analysis();
//cout < if(point!=i-1){
printf(“\nDidn‘t match %s \n“str);
}
else
printf(“\nmatch %s \n“str);
}
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件         530  2012-04-19 09:12  opp.h
     文件          30  2012-04-21 22:36  test1.txt
     文件          35  2012-04-21 01:06  test2.txt
     文件        2642  2012-04-19 12:33  opp.cpp

评论

共有 条评论