1 / 11
文档名称:

编译原理实验4算符优先算法.docx

格式:docx   大小:22KB   页数:11页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

编译原理实验4算符优先算法.docx

上传人:cjc201601 2022/3/6 文件大小:22 KB

下载得到文件列表

编译原理实验4算符优先算法.docx

文档介绍

文档介绍:、实验目的与任务
算术表达式和赋值语句的文法可以是(你可以根据需要适当改
变):
S—i=E
E—E+E|E-E|E*E|E/E|(E)|i
根据算符优先分析法,将赋值语句进行语法分析,翻译成等价的一
组基本操作,每一基本操作用、实验目的与任务
算术表达式和赋值语句的文法可以是(你可以根据需要适当改
变):
S—i=E
E—E+E|E-E|E*E|E/E|(E)|i
根据算符优先分析法,将赋值语句进行语法分析,翻译成等价的一
组基本操作,每一基本操作用四元式表示。
二、实验涉及的相关知识点
算符的优先顺序。
三、实验内容与过程
如参考C语言的运算符。输入如下表达式(以分号为结束):
a=10;
b=a+20;
注:此例可以进行优化后输出(不作要求):(+,b,a,20)
c=(1+2)/3+4-(5+6/7);
四、实验结果及分析
(1)输出:(=,a,10,-)
(2)输出:(=,r1,20,-)
(+,r2,a,r1)
(=,b,r2,-)
(+,r4,5,r3,)
输出:(+,r1,1,2)(/,r2,r1,3)(/,r3,6,7)
(+,r5,r2,4)(-,r6,r5,r4)(=,c,r6,-)
五、实验有关附件(如程序、附图、参考资料,等)
h=='#')o][Peek(n0).No];
if(r=='<')h=='E'&&Peek(1).ch=='#'&&
Token[ipToken].ch=='#')
returnTRUE;
else
returnFALSE;
}
h)
{
k=TRUE;h=='E')
{
n++;
}returnn;
词结束(遇到“#”号),无法移进,需要规约,返回:1
词没有结束,需判断是否可以移进
栈单词<=单词:移进后返回:2
栈单词>单词:不能移进,需要规约,返回:1
单词没有优先关系:出错,返回:-1
intMoveIn()
{
STokens,t;h='#';
Token[TokenNumber].No=O_NUL;
returnTRUE;h='+';
Token[TokenNumber].No=O_PLUS;
GetChar();
break;
case'-':
Token[TokenNumber].ch='-';
Token[TokenNumber].No=O_MINUS;
GetChar();
break;
case'*':
Token[TokenNumber].ch='*';
Token[TokenNumber].No=O_TIMES;
GetChar();
break;
case'/':
Token[TokenNumber].ch='/';
Token[TokenNumber].No=O_SLASH;
GetChar();
break;
case'(':
Token[TokenNumber].ch='(';
Token[TokenNumber].No=O_L_PAREN;
GetChar();
break;
case')':
Token[TokenNumber].ch=')';
Token[TokenNumber].No=O_R_PAREN;
GetChar();
break;
default:
if(ch>='0'&&ch<='9')h='i';
Token[TokenNumber].No=O_IDENT;
}
else
{
return!MakeErr("表达式中含有非
法字符。");
}
break;
}
TokenNumber++;
}
//从表达式缓冲区中取到下面第一个非空字符
//成功:返回字符;不成功:返回'\0'
charGetFirstChar()
{
while(GetChar()!='\0')
{
if(ch>32)returnch;
}return'\0';
//从表达式缓冲区取一个字符,返回该字符的同时将它存于全局变
量ch中
//成功:返回字符;不成功:返回'\0'
charGetChar()
{
if((ch=Buffer[ipBuffer])!='\0')ipBuffer++;
returnch;
}
//生成错误信息
//错误信息存于全局变量ErrMsg中
//返回:TRUE
boolMakeErr(char*ErrMassage)
ErrMsg=ErrMassage;
returnTRUE;