`
pf_miles
  • 浏览: 134170 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

虎书P8问题(1)

阅读更多
见《虎书》中文版第8页;
我的答案:

#ifndef P8Q1_H
#define P8Q1_H
#include "slp.h"

int resolveStm(A_stm stm);
int resolveExp(A_exp exp);
int resolveExpList(A_expList expList);
int countExpInExpList(A_expList expList);

#endif


#include "p8q1.h"

int resolveStm(A_stm stm){
    int temp1 = 0, temp2 = 0;
    if(stm->kind == A_compoundStm){
	temp1 = resolveStm(stm->u.compound.stm1);
	temp2 = resolveStm(stm->u.compound.stm2);
	return temp1>temp2? temp1:temp2;
    }else if(stm->kind == A_assignStm){
	return resolveExp(stm->u.assign.exp);
    }else if(stm->kind == A_printStm){// the way out
    	return countExpInExpList(stm->u.print.exps);
    }else{
	return 0;
    }
}

int countExpInExpList(A_expList expList){
    if(expList->kind == A_lastExpList){
	return 1;
    }else if(expList->kind == A_pairExpList){
	return 1 + countExpInExpList(expList->u.pair.tail);
    }else{
	return 0;
    }
}

int resolveExpList(A_expList expList){
    int temp1,temp2;
    if(expList->kind == A_pairExpList){
	temp1 = resolveExp(expList->u.pair.head);
	temp2 = resolveExpList(expList->u.pair.tail);
	return temp1>temp2?temp1:temp2;
    }else if(expList->kind == A_lastExpList){
	return resolveExp(expList->u.last);
    }else{
	return 0;
    }
}

int resolveExp(A_exp exp){
    int temp1,temp2;
    if(exp->kind == A_idExp){
	return 0;
    }else if(exp->kind == A_numExp){
	return 0;
    }else if(exp->kind == A_opExp){
	temp1 = resolveExp(exp->u.op.left);
	temp2 = resolveExp(exp->u.op.right);
	return temp1>temp2?temp1:temp2;
    }else if(exp->kind == A_eseqExp){
	temp1 = resolveStm(exp->u.eseq.stm);
	temp2 = resolveExp(exp->u.eseq.exp);
	return temp1>temp2?temp1:temp2;
    }else{
	return 0;
    }
}



main.c:
#include <stdio.h>
#include "util.h"
#include "prog1.h"
#include "slp.h"
#include "p8q1.h"

main(){
    printf("%d\n",resolveStm(prog()));
}


输出结果:2

体会:对于“目标”需要特殊处理,“目标”就是解析程序的出口。
分享到:
评论
1 楼 pf_miles 2008-08-16  
上面的代码有缺憾,没有考虑“如果print语句中的expList里面还有print语句”这种情况,需要更改countExpInExpList方法,它也需要和另两个方法互相递归,要解析print语句中的print语句。

int countExpInExpList(A_expList expList){
    int temp1,temp2;
    if(expList->kind == A_lastExpList){
        temp1 = resolveExp(expList->u.last);
        return temp1>1?temp1:1;
    }else if(expList->kind == A_pairExpList){
        temp1 = 1 + countExpInExpList(expList->u.pair.tail);
        temp2 = resolveExpList(expList->u.pair.tail);
        return temp1>temp2?temp1:temp2;
    }else{
        return 0;
    }
}

相关推荐

    eplan p8 2.1sp1 破解

    eplan p8 2.1sp1 破解

    华硕P8B75-V用户手册

    ### 华硕P8B75-V主板用户手册知识点概览 #### 一、产品概述与版权信息 **华硕P8B75-V主板**是华硕公司推出的一款基于Intel B75芯片组设计的主板,适用于搭载第三代Intel酷睿处理器的个人计算机。该主板不仅具备...

    8P8C网口座规格书

    8P8C网口座规格书,反口的规格书不好找,好不容易找到

    主板C7329_P8B75-M_LE使用说明书.pdf

    华硕P8B75-M LE主板用户手册提供的信息涵盖了产品的规范、版权、免责声明、保修和源代码提供等多个方面。为了便于理解和使用,以下详细解释了手册中提到的相关知识点。 首先,手册强调版权保护,声明所有包含的信息...

    EPLAN-Electric-P8-2.9-SP1安装包-baiduyun.txt

    EPLAN_Electric_P8_2.9_SP1安装包_baiduyun

    P8Z77-V_PRO用户手册

    华硕P8Z77-V LE PLUS主板采用全新SMART DIGI+ 智能数字供电设计的第3代双智能处理器,支持UASP协议、更快的USB 3.0传输速度,支持 Windows 8。以下文档是华硕P8Z77-V LE PLUS用户手册,有需要的朋友可立即下载此文档...

    ibm filenet p8 ecm 方案建议书

    ### 1. 需求背景 在当前信息化社会中,企业和组织面临着日益增长的文档和非结构化内容管理需求。无论是小公司还是大型企业,都必须有效地管理海量的文档、电子邮件、通信记录以及其他必须维护的信息。IBM的ECM解决...

    P8xC591 的CAN总线应用

    P8xC591支持CAN 2.0B协议,可以实现最高1Mbps的数据传输速率,并具备多种工作模式,如正常模式、睡眠模式、停机模式等,以满足不同应用场景的需求。 在P8xC591中,CAN控制器与微处理器之间的接口是通过中断或轮询...

    Eplan P8参考手册

    1. **快捷键应用**:熟悉并掌握Eplan P8中的快捷键操作可以显著提高工作效率。例如,使用Ctrl+C复制选中的对象,Ctrl+V粘贴对象等。 2. **模板利用**:合理利用模板可以节省大量的设计时间。Eplan P8提供了多种预设...

    eplan p8 快速入门

    接着,书中将详细介绍EPLAN P8的核心功能,如电路图设计、符号库管理、自动布线、元件参数化等。电路图设计是EPLAN P8的核心应用场景,通过学习如何绘制和编辑电路图,读者能够快速理解电气设计的基本流程。符号库...

    联想p8刷机全套工具

    【联想p8刷机全套工具】是一套专为联想P8平板电脑设计的系统更新与优化工具,旨在解决用户在使用过程中可能遇到的系统卡顿、功能限制或个性化需求等问题。通过刷机,用户可以安装第三方系统固件,提升设备性能,或者...

    数据采集软件P8.rar

    1. 实时同步:能够实时从用友U8和金蝶等财务软件中获取最新的财务数据,确保决策基于最新信息。 2. 自定义字段映射:允许用户根据自身需求,定义从源系统到P8的数据字段映射,确保数据结构的一致性。 3. 数据清洗与...

    华硕P8H61-I 主板说明书

    1. 若遇到启动问题,可以尝试清除CMOS来恢复默认设置。 2. 定期检查散热设备,确保良好的通风条件,防止过热。 3. 使用ASUS提供的驱动程序和更新,以保持最佳的硬件兼容性和性能。 总结,华硕P8H61-I主板是一款性价...

    华硕P8B75-V 2.0点位图

    华硕P8B75-V 2.0是一款基于Intel B75...文件“P8B75-V 2.00.FZ”可能是该主板的BIOS更新文件,用户可以通过升级BIOS来修复潜在问题或获取新特性。不过,执行BIOS更新操作时务必谨慎,遵循正确的步骤,以防损坏主板。

    honglou-p8YiI-vf8c1d648.apk

    honglou-p8YiI-vf8c1d648.apk

    华为P8原厂手机维修图纸 原理图 电路图 元件图 手机故障维修图.zip

    华为P8 故障维修流程图 GSM1发射故障.exe 华为P8 故障维修流程图 GSM1接收故障.exe 华为P8 故障维修流程图 GSM发射故障.exe 华为P8 故障维修流程图 GSM接收故障.exe 华为P8 故障维修流程图 HALL感应故障.exe 华为P8 ...

    EPLAN+P8快速入门

    "《EPLAN+P8快速入门》"是官方提供的初学者指南,它涵盖了软件的基本操作和常见问题解答,是学习EPLAN P8的宝贵资源。通过阅读这本书,初学者可以快速上手,理解软件的工作流程和设计理念。 总之,EPLAN P8是一款...

    华为P8Max手机原厂维修图纸 原理图 电路图 故障维修图(PDF版).zip

    华为P8Max 原厂图 维修流程图 GSM1发射故障.pdf 华为P8Max 原厂图 维修流程图 GSM1接收故障.pdf 华为P8Max 原厂图 维修流程图 GSM发射故障.pdf 华为P8Max 原厂图 维修流程图 GSM接收故障.pdf 华为P8Max 原厂图 维修...

    七彩虹 CF-P8 MX 2.4A bios

    七彩虹 CF-P8 MX 2.4A bios

Global site tag (gtag.js) - Google Analytics