【编译原理】语法制导的语义计算——翻译程序,语义栈,中缀转后缀

本节内容依旧非常抽象,因此这里给出三道完整例题 ,对应以下3个重要知识点/题型:

1.0「自顶向下」构造LL(1)翻译程序

2.0「自底向上」构造LR(1)语义栈

3.0 「自顶向下/自底向上」中缀转后缀

 
 
 

1.0「自顶向下」构造LL(1)翻译程序

下面的翻译模式可用于将二进制无符号小数转化为十进制小数。请构造相应的递归下降翻译程序:

N →  p {S.f := 1}  S  {print(S.val)}
S →  {B.f := S.f}  B  {S₁.f := S.f + 1}  S₁  {S.val := B.val + S₁.val}
S →  ε  {S.val := 0}
B →  0  {B.val := 0}
B →  1  {B.val := 2 ^ (-B₁.f)}

先说明一个MatchToken函数:

// MatchToken用于判别【正在处理的终结符】与【当前扫描的输入符号】是否匹配
void MatchToken(int expected) {
   
	if(lookahead != excepted) {
   			// lookahead为当前扫描的输入符号
		printf("语法错误!");
		exit(0);						// 若不匹配:报告出错,跳出
	} else {
   
		lookahead = getToken();			// 若匹配:则向词法分析程序申请读入下一个输入符号
	}
}

下面,为每个非终结符构造翻译程序:

>>> 小技巧(>_<):
<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值