- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
逆波兰中间代码生成程序设计
课程设计目的
通过编译原理课程设计,加深对语义翻译的理解,了解程序编译具体过程,同时熟练掌握用编程语言来实现编译器的功能。
课程设计要求
(1)编制一个中间代码生成程序,能将算术表达式(如带有嵌套括号)等翻译成四元组。
(2)程序具有通用性,即能接受各种不同的算术表达式等语法成分。
(3)有运行实例.对于语法正确的算术表达式,能生成四元组序列,并输出结果;对不正确的表达式,能检测出错误。
(4)提交实习报告。
算法描述
算法中利用到3个数组,A数组存放表达式,B为操作符数组,C数组存放逆波兰式。将输入的表达式存储到数组B中,然后将运算对象与运算对象后的运算符之间插入空格并存入数组A中。
在A中,若为运算对象,则将运算对象压入到C中;若为运算符,则将其与B中的数据进行优先级比较,大于则插入到B中,小于则将B中运算符插入到C中;
最后将数组C中的数据全部输出。
程序结构
gets(B)
gets(B)
A[i++]=B[j]
A[i++]=B[j]
(T[B[j+1]]T[B[j]])(T[B[j]]==0)A[i++]= ;B[j]=0; B[j]=0;
(T[B[j+1]]T[B[j]])(T[B[j]]==0)
A[i++]= ;B[j]=0;
B[j]=0;
否
T[ch]==4
T[ch]==4
B[++j]=0 是
B[++j]=0
否
B[j]0T[ch]==5 是 否
B[j]0
T[ch]==5
是
C[k++]=B[j];C[k++]= ;B[j]=0; 否
C[k++]=B[j];C[k++]= ;B[j]=0;
T[ch]T[chb]
T[ch]T[chb]
B[++j]=ch; 是
B[++j]=ch;
T[ch]T[ch]T[chb] 否
T[ch]T[ch]T[chb]
C[k++]=B[j--];C[k++]= ; i--; 是
C[k++]=B[j--];C[k++]= ; i--;
T[ch]T[ch]==T[chb] 否
T[ch]T[ch]==T[chb]
C[k++]=B[j--];C[k++]= ;i--; 是
C[k++]=B[j--];C[k++]= ;i--;
否
C[k++]=ch;
C[k++]=ch;
j0
j0
C[k++]=B[j];C[k++]= ; B[j]=0; 是
C[k++]=B[j];C[k++]= ; B[j]=0;
否
puts(C);
puts(C);
主要变量说明
A[N]-存放表达式
B[N]-操作符数组
C[N]-存放逆波兰式
T[256]-存放运算符及运算对象的优先级
char ch,chb-用于对运算符和运算对象之间进行比较
程序清单
#define N 50
#define nul 0
main()
{
int i=0,j=0,k=0,len;
char A[N]={nul},B[N]={nul},C[N]={nul}; int T[256]={nul};
char ch,chb;
T[=]=1;
T[+]=2;
T[-]=2;
T[*]=3;
T[/]=3;
T[%]=3;
T[(]=4;
T[)]=5;
while(1){
puts(Input the expression!for example:s=(a+b)*c-d/(e+f));
gets(B);
len=strlen(B);
for(j=0;jlen;j++)
{
A[i++]=B[j];
if((T[B[j+1]]T[B[j]])(T[B[j]]==0))
A[i++]= ;
B[j]=0;
}
A[
文档评论(0)