资源简介
基于语法制导翻译的表达式转换编译器
中缀表达式转后缀表达式,含文档。
代码片段和文件信息
#include
#include
#include
#include
#include“t_node.h“
using namespace std;
//判断c是否是操作符
bool judge(char c);
//在c中下标在first和last之间的最小元素的下标
int findmin(vector cint firstint last);
// 把输入的表达式字符窜进行处理,把每个操作数和操作符依次保存在b中,在c中保存相应分优先级
void translate(string avector &bvector &cint *flag2);
//转变成表达式数
void trantotree(vector bvector ct_node *root);
//进行后序遍历
void search(t_node *root);
//清除该树占用的内存
void deletetree(t_node *root);
int main()
{
string s;
char c;
int flag=1;
int *flag2;
while(flag==1){
*flag2=1;
vector v1;
vector v2;
t_node *root=new t_node();
cout<<“请输入中缀表达式:“< cin>>s;
translate(sv1v2flag2);
while(*flag2==1){
trantotree(v1v2root);
cout<<“后序遍历结果为:“< search(root);
cout< deletetree(root);
break;
}
cout<<“是不是要继续(y/n)?“< cin>>c;
if (c == ‘n‘ || c == ‘N‘) flag = 0;
while (getchar() != ‘\n‘);
printf(“\n“);
continue;
}
}
void deletetree(t_node *root)
{
if(root!=NULL)
{
deletetree(root->left);
deletetree(root->right);
delete root;
}
}
void search(t_node *root)
{
if(root!=NULL)
{
search(root->left);
search(root->right);
cout<value<<“ “;
}
}
int rank(char ch)
{
if(ch==‘+‘||ch==‘-‘)
return 1;
else if(ch==‘*‘||ch==‘/‘||ch==‘%‘)
return 100;
else
return 1000;
}
bool judge(char c)
{
if(c==‘+‘||c==‘-‘||c==‘*‘||c==‘/‘||c==‘%‘)
return true;
else
return false;
}
int findmin(const vector cint firstint last)
{
int temp=c[last]k=last;
for(int i=last-1;i>=first;i--)
{
if(c[i] {
k=i;
temp=c[k];
}
}
return k;
}
//转变成表达式数
void trantotree(vector bvector ct_node *root)
{
if(b.size()==1)
root->value=b[0];
else
{
vector b1b2;
vector c1c2;
int ij;
i=findmin(c0c.size()-1);
root->value=b[i];
for(j=0;j {
b2.push_back(b[j]);
c2.push_back(c[j]);
}
root->left=new t_node();
trantotree(b2c2root->left);
for(j=i+1;j {
b1.push_back(b[j]);
c1.push_back(c[j]);
}
root->right=new t_node();
trantotree(b1c1root->right);
}
}
// 把输入的表达式字符窜进行处理,把每个操作数和操作符依次保存在b中,在c中保存相应分优先级
void translate(string avector &bvector &cint *flag2)
{
int len=a.length();
int i=0j=0k=0count=0count1=0count2=0;
string s=““;
while(i {
if(a[i]==‘(‘)
{
k++;
i++;
count++;
count1++;
continue;
}
if(a[i]==‘)‘)
{
k--;
i++;
count--;
count2++;
continue;
}
if(count2>count1){cout<<“输入的表达式不正确!右括号在前!“ < if(!judge(a[i]))//a[i]不是运算符!
{
s=s+a[i];
i++;
}
else //a[i]是运算符!
{
if(ju
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3718 2010-06-29 11:17 编译原理\main.cpp
文件 243656 2010-06-29 18:16 编译原理\main.o
文件 998 2010-06-29 22:58 编译原理\Makefile.win
文件 167974 2010-06-30 09:22 编译原理\tempfile.exe
文件 28664 2010-06-30 22:47 编译原理\tempfile.rar
文件 413 2010-06-29 11:17 编译原理\t_node.cpp
文件 594 2009-04-26 00:59 编译原理\t_node.h
文件 59060 2010-06-29 18:16 编译原理\t_node.o
文件 1032 2010-06-29 17:23 编译原理\中缀式变后缀式.dev
文件 716008 2010-06-29 22:58 编译原理\中缀式变后缀式.exe
文件 320000 2010-07-01 12:27 编译原理\编译原理文档111--杨博.doc
目录 0 2010-07-01 12:27 编译原理
----------- --------- ---------- ----- ----
1542117 12
- 上一篇:LVQ神经网络
- 下一篇:OV13850相关代码
评论
共有 条评论