编译原理实验报告 下载本文

精品文档

iii.pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ );

push( SEM, T );

(4) 递归下降子程序: ·数据结构:SYN —算符栈;

SEM —语义栈; E: 入口 T: 入口

T F

n ω0? n ω1? y y 出口 push(SYN, w) 出口 push(SYN, w)

read(w) QUAT read(w) QUAT

T F

F: 入口 主程序:Z ?E ( ? n i ? n err read(w) read(w) push(SEM, entry(w)) E E err n # ? err n ) ? y y 输出四元式序列 read(w)

结束 出口

四、 实验核心代码

void main() //主函数

{ t = 1;

cout<<\输入表达式,以#结束:\ Z(); }

string its(int a){ //整形变成字符串形函数

11欢迎下载

精品文档

}

string d;

char b='0',c; int i;

while(a!=0){ i = a; a = a/10;

c = (int)b + i; d = c + d; }

return d;

char F(char w){ //F自动机 string theWord;

if(w>='a'&&w<='z'||w>='A'&&w<='Z'){

theWord = w; //当前字符是字母 markStack.push(theWord); //则压栈 }

else if(w == '('){ //是左括号

cin>>w; //则读取下一字符 w = E(w);

if(w!=')'){ //不是右括号则输入有误,报错 cerr<<\输入错误!\ exit(0); } }

else{ //否则有误,报错 cerr<<\输入错误!\ exit(0); }

cin>>w; //读取下一字符 return w; }

char E(char w){ //E自动机 string operate,a,b,c; string state[5];

w = T(w);

while(w=='+'||w=='-'){ //是加或减符号 operate = w;

cin>>w; //读入下一字符 w = T(w);

b = markStack.pop(); //字符栈弹出

a = markStack.pop(); //两个操作字符

12欢迎下载

精品文档

cout<<\ c = \ //输出四元式 markStack.push(c); //新状态压栈 t++; //状态计数加一 }

return w; }

char T(char w){

string operate,a,b,c; string state[5];

w = F(w); while(w=='*'||w=='/'){ operate = w;

cin>>w; //读取下一字符 w = F(w);

b = markStack.pop(); //符号栈弹出

a = markStack.pop(); //两个操作字符

cout<<\ c = \ markStack.push(c); t++; }

return w; }

bool Z(){ //Z自动机 char w; cin>>w;

w = E(w);

if(w=='#'){ //遇到\则结束 return true; } else{

return false; } }

五、 实验结果

13欢迎下载

精品文档

实验思考题:

1. 语法分析分为几类?其关键技术各是什么? 答: 自顶向下法(推导法)

从开始符号出发,采用推导运算,试图自顶向下构造语法树。 自底向上法(归约法)

从给定的符号串出发,采用归约运算,试图自底向上构造语法树。

2. 什么是递归下降子程序法,什么是LL(1)分析法?二者对文法各有什么要求?

答: 递归下降子程序法:递归子程序法属于自顶向下语法分析方法。故又名递归下降法。要求文法是LL(1)文法。

LL(1)分析法:LL(1)分析法是指从左到右扫描(第一个 L) 、最左推导(第二个 L)和只查看一个当前符号(括号中的 1)之意;LL(1)分析法又称预测分析法,属于自顶向下确定性语法分析方法。要求文法是LL(1)文法。

3. 比较LL(1)分析法和递归下降子程序法的异同。

答: 相同点:都要求文法是LL(1)文法;都是自顶向下的分析方法;都通过分析下个字符来判断该进入哪个状态或者调用哪个函数。

不同点:LL(1)分析法先建立起预测分析表,通过对分析栈的不断操作(出栈,入栈)来进行;递归下降子程序法是通过函数间的函数调用来实现不同状态间的转换,并简化了代码。

4. 什么是语法制导翻译技术?其核心技术是什么?

答:语法制导翻译是在语法分析过程中,随着分析(推导或归约)的逐步进展,每识别出一个语法结构,根据文法的每个规则所对应的语义子程序进行翻译的方法;核心技术是构造属性翻译文法。

5. 表达式的四元式属性翻译文法如何设计?

答: 假定:SEM(m)-- 语义栈(属性传递、赋值场所); QT[q] – 四元式区;

G``(E):E -> T | E+T{GEQ(+)} | E-T{GEQ(-)} T -> F | T*F{GEQ(*)} |

T/F{GEQ(/)}

14欢迎下载

精品文档

F -> i{PUSH(i)} | ( E ) 其中:

⑴ PUSH(i)– 压栈函数(把当前 i 压入语义栈); ⑵ GEQ(w) – 表达式四元式生成函数: 生成一个四元式送QT[q]过程:

① t := NEWT; { 申请临时变量函数;} ② SEND(w,SEM[m-1],SEM[m],t) ③ POP;POP;PUSH(t)

15欢迎下载