`
pf_miles
  • 浏览: 134613 次
  • 性别: 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 破解

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

    本文将依据《主板C7329_P8B75-M_LE使用说明书.pdf》内容,展开讨论该主板的相关知识,包括产品的规范、版权保护、免责声明、保修政策以及源代码提供等方面。 首先,版权保护是使用说明书中的一个核心议题。华硕明确...

    华硕P8B75-V用户手册

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

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

    EPLAN_Electric_P8_2.9_SP1安装包_baiduyun

    8P8C网口座规格书

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

    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解决...

    华硕P8H61-I 主板说明书

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

    P8xC591 的CAN总线应用

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

    ePlan P8\EPLAN_P8_高级教程第1部分

    ePlan P8\EPLAN_P8_高级教程第1部分

    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. 数据清洗与...

    华硕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 Electric P8 2.5 60秒卡死补丁

    1. 首先,确保备份原有的EPLAN Electric P8 2.5安装文件,以防万一补丁安装失败,可以恢复到之前的版本。 2. 下载补丁文件,通常是压缩包形式,包含修复后的可执行文件或脚本。 3. 解压缩下载的补丁文件,里面可能...

    EPLAN+P8快速入门

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

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

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

Global site tag (gtag.js) - Google Analytics