语
p1.s; }
P→ε {P.s=P.i}
F→( E ) { F.place := E.place} F→id {F.place:=position (id)} V→id {V.place:=position(id)}
3、实现原理
基于翻译模式的自上而下语义处理(翻译)
1. 对每个非终结符 A,构造一个函数,以 A 的每个继承属性为形参,以A的
综合属性为返回值(若有多个综合属性,可返回记录类型的值) 。如同预测分析程序的构造,该函数代码的流程是根据当前的输入符号来决定调用哪个产生式。
2. 与每个产生式相关的代码根据产生式右端的终结符,非终结符,和语义规则
集(语义动作),依从左到右的次序完成下列工作:
(1)
对终结符 X,保存其综合属性x的值至专为 X.x 而声明的变量;
然后调用匹配终结符(match_token) 和取下一输入符号(next_token)的函数; (2)
对非终结符 B,利用相应于 B 的函数调用产生赋值语句
c:=B(b1, b2, …, bk),其中变量 b1, b2, …, bk 对应 B的各继承属性,变量c对应B的综合属性 (3)
对语义规则集,直接copy其中每一语义规则(动作)来产生代
码,只是将对属性的访问替换为对相应变量的访问。
4、文法的属性分析 文法符号 start D B L A S E 属性 无 无 无 L.type A.type 无 E.place 综合或继承 继承 继承 综合 页脚内容
含义 类型 类型 指向变量或临时变量的指针(用整数10
语
R T P F V
R.i R.s T.place P.i P.s F.place V.place 继承 综合 继承 继承 综合 综合 综合 实现) 同上 同上 同上 同上 同上 同上 同上 5、过程设计
int getsym(); //读一个单词
void enter(enum symbol type); //登记符号表 void init();
int position(char* idt); //查询符号表用函数,返回在符号表中位置 int gen(enum symbol op, int arg1, int agr2,int result ); //生成四元式 void newtemp()//申请临时变量 void start(); void D(); void B();
void L(enum symbol type); void A(enum symbol type); void S(); void H(); int E(); int R(int Ri); int T(); int P(int pi); int F(); int V();
页脚内容
10