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

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

一、实验目的与任务

算术表达式和赋值语句的文法可以是(你可以根据需要适当改变):

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;

}

相关主题
相关文档
最新文档