语法分析
一、 实验目的
算术表达式的文法可以是(你可以根据需要适当改变):
E→E+E|E-E|E*E|E/E|(E)|i
根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确。
二、 实验环境
操作系统:window xp
编写环境:visual c++
编写语言:c语言
三、 实验内容
程序输入/输出示例:
如参考C语言的运算符。输入如下表达式(以分号为结束)和输出结果:
(1)10;
输出:正确
(2)1+2;
输出:正确
(3)(1+2)/3+4-(5+6/7);
输出:正确
(4)((1-2)/3+4
输出:错误
(5)1+2-3+(*4/5)
输出:错误
实验步骤:
1.简述你的程序实现的功能是什么?
判断一个表达式是否遵循给的文法
E→E+E|E-E|E*E|E/E|(E)|i
2.程序的模块描述。
字符串ch是读取txt文件的一个表达式 每个表达式以分号分割
字符串ch2是将读取的表达式转化 变成以#结尾的符号串 如10*(2+3)变成i*(i*i)#
St是符号栈栈 以#开始
Table是算符优先表
四、 实验结果
五、 实验小结
#include
#include
using namespace std;
const int maxn = 1000;
FILE * in;
FILE * out;
char st[maxn];//符号栈
char ch[maxn], ch2[maxn];//符号串
int top, id;
int len, n;//符号串长度
char map[6][4] = {"E+E","E-E","E*E","E/E","(E)","i"};//文法产生式右部
char msg[1000];//错误信息
char table[8][8] = {
{'>','>','',''},
{'>','>','',''},
{'>','>','>','>','',''},
{'>','>','>','>','',''},
{'
{'>','>','>','>','-','>','-','>'},
{'>','>','>','>','-','>','-','>'},
{'
};//优先关系表:八个字符分别是+-*/()i#,其中'-'表示出错
void init()
{
in = fopen("f:\\f3.txt", "r");
out = fopen("f:\\fd.txt", "w");
}
void end()
{
fclose(in);
fclose(out);
}
bool get_one()//得到一个符号串
{
char c;
len = 0;
int flag = 0;
while(1)
{
if((c = fgetc(in)) != EOF)
{
if(c == ';')
{
//c[len++] = '#';
break;
}
ch[len++] = c;
}
else//文件结束
{
flag = 1;
break;
}
}
if(len)
{
ch[len] = 0;
//puts(ch);
return true;
}
if(!flag)
return true;
return false;
}
bool get()
{
n = 0;
for(int i = 0; i < len; i++)
{
if(ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/')
ch2[n++] = ch[i];
else if(ch[i] == '(' || ch[i] == ')')
ch2[n++] = ch[i];
else if(ch[i] >= '0' && ch[i] <= '9')
{
while(i < len && ch[i] >= '0' && ch[i] <= '9')
i++;
i--;
ch2[n++] = 'i';
}
else if(ch[i] == 10 || ch[i] == 9 || ch[i] == 32)
continue;
else
return false;
}
ch2[n++] = '#';
ch2[n] = 0;
puts(ch2);
return true;
}
int ID(char c)
{
if(c == '+')
return 0;
if(c == '-')
return 1;
if(c == '*')
return 2;
if(c == '/')
return 3;
if(c == '(')
return 4;
if(c == ')')
return 5;
if(c == 'i')
return 6;
if(c == '#')
return 7;
}
int get_pos(int p)
{
while(st[p] == 'E')
p--;
return p;
}
bool gy(int p)
{
//printf("----%d\n", p);
for(int i = 0; i < 6; i++)
<