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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的与任务
算术表达式和赋值语句的文法可以是(你可以根据需要适当改变):
S→i=E
E→E+E|E-E|E*E|E/E|(E)|i
根据算符优先分析法,将赋值语句进行语法分析,翻译成等价的一组基本操作,每一基本操作用四元式表示。

二、实验涉及的相关知识点
算符的优先顺序。

三、实验内容与过程
如参考C语言的运算符。

输入如下表达式(以分号为结束):(1)a = 10;
(2)b = a + 20;
注:此例可以进行优化后输出(不作要求):(+,b,a,20)
(3)c=(1+2)/3+4-(5+6/7);
四、实验结果及分析
(1)输出:(=, a,10,-)
(2)输出:(=,r1,20,-)
(+,r2,a,r1)
(=,b,r2,-)
(3)输出:(+,r1,1,2) (/,r2,r1,3) (/,r3,6,7) (+,r4,5,r3,) (+,r5,r2,4) (-,r6,r5,r4) (=,c,r6,-)
五、实验有关附件(如程序、附图、参考资料,等)
...
...
h == '#') o][Peek(n0).No];
if(r == '<') h == 'E'&& Peek(1).ch == '#' && Token[ipToken].ch == '#')
return TRUE;
else
return FALSE;
}
h)
{
k = TRUE; h == 'E')
{
n ++;
}
return n;
}
词结束(遇到“#”号),无法移进,需要规约,返回:1
词没有结束,需判断是否可以移进
栈单词<=单词:移进后返回:2
栈单词>单词:不能移进,需要规约,返回:1
单词没有优先关系:出错,返回:-1
int MoveIn()
{
SToken s,t; h = '#';
Token[TokenNumber].No = O_NUL;
return TRUE; 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'
char GetFirstChar()
{
while(GetChar() != '\0')
{
if(ch>32) return ch;
}
return '\0';
}
//从表达式缓冲区取一个字符,返回该字符的同时将它存于全局变量ch中//成功:返回字符;不成功:返回'\0'
char GetChar()
{
if((ch = Buffer[ipBuffer]) != '\0')
ipBuffer ++;
return ch;
}
//生成错误信息
//错误信息存于全局变量ErrMsg中
//返回:TRUE
bool MakeErr(char * ErrMassage)
{
ErrMsg = ErrMassage;
return TRUE;
}。

相关文档
最新文档