资源简介
实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。
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
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
- 华工往年编译原理试卷
- 编译原理课程设计for循环LR法三元式
- 哈工程-编译原理课程设计(2016级)
评论
共有 条评论