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

虎书P8问题(2)——直线式程序解释器

阅读更多
《虎书》确实彪悍,绪论里就留给读者实践性这么强的问题,对于中文版第8页上的问题(2),我的答案如下:

p8q2.h:
#ifndef P8Q2_H
#define P8Q2_H

#include "util.h"
#include "slp.h"

typedef struct table* Table_;

struct table{string id; int value; Table_ tail;};

Table_ Table(string id, int value, Table_ tail);

Table_ interpStm(A_stm stm, Table_ t);

struct intAndTable{int value; Table_ t;};

typedef struct intAndTable* IntAndTable_;

IntAndTable_ IntAndTable(int value, Table_ t);

IntAndTable_ interpExp(A_exp exp, Table_ t);

#endif


p8q2.c:
#include "p8q2.h"
#include <stdio.h>
#include <stdlib.h>

Table_ update(string id, int value, Table_ t);
IntAndTable_ interpAndPrintExp(A_exp exp, Table_ t);

Table_ Table(string id, int value, Table_ tail){
    Table_ t = checked_malloc(sizeof(t));
    t->id = id;
    t->value = value;
    t->tail = tail;
    return t;
}

IntAndTable_ IntAndTable(int value, Table_ t){
    IntAndTable_ iat = checked_malloc(sizeof(iat));
    iat->value = value;
    iat->t = t;
    return iat;
}

Table_ interpStm(A_stm stm, Table_ t){
    Table_ t1;
    IntAndTable_ iat;
    if(stm->kind == A_compoundStm){
	t1 = interpStm(stm->u.compound.stm1, t);
	return interpStm(stm->u.compound.stm2, t1);
    }else if(stm->kind == A_assignStm){
	IntAndTable_ iat = interpExp(stm->u.assign.exp, t);
	return update(stm->u.assign.id, iat->value, iat->t);
    }else if(stm->kind == A_printStm){// To support one-by-one print, interprete exp-by-exp
	if(stm->u.print.exps->kind == A_lastExpList){
	    iat = interpAndPrintExp(stm->u.print.exps->u.last, t);
	    return iat->t;
	}else if(stm->u.print.exps->kind == A_pairExpList){
	    A_expList list = stm->u.print.exps;
	    while(list->kind == A_pairExpList){
		iat = interpAndPrintExp(list->u.pair.head, t);
		t = iat->t;
		list = list->u.pair.tail;
	    }
	    iat = interpAndPrintExp(list->u.last, t);
	    return iat->t;
	}else{
	    printf("Invalid print exps!\n");
	    exit(1);
	}
    }else{
	printf("Statement type error!\n");
	exit(1);
    }
}

IntAndTable_ interpExp(A_exp exp, Table_ t){
    int value1;
    IntAndTable_ iat1, iat2;
    Table_ t1;
    if(exp->kind == A_idExp){
	value1 = lookUp(exp->u.id, t);
	return IntAndTable(value1, t);
    }else if(exp->kind == A_numExp){
	return IntAndTable(exp->u.num, t);
    }else if(exp->kind == A_opExp){
	iat1 = interpExp(exp->u.op.left, t);
	iat2 = interpExp(exp->u.op.right, iat1->t);
	switch(exp->u.op.oper){
	    case A_plus:
		value1 = iat1->value + iat2->value;
		break;
	    case A_minus:
		value1 = iat1->value - iat2->value;
		break;
	    case A_times:
		value1 = iat1->value * iat2->value;
		break;
	    case A_div:
		value1 = iat1->value / iat2->value;
		break;
	    default: 
		printf("Invalid operator!\n");
		exit(1);
	}
	return IntAndTable(value1, iat2->t);
    }else if(exp->kind == A_eseqExp){
	t1 = interpStm(exp->u.eseq.stm, t);
	return interpExp(exp->u.eseq.exp, t1);
    }else{
	printf("Invalid operation type!\n");
	exit(1);
    }
}

Table_ update(string id, int value, Table_ t){
    return Table(id, value, t);
}

int lookUp(string key, Table_ t){
    while(t){// The initail table was a NULL
	if(strcmp(key, t->id) == 0){
	    return t->value;
	}
	t = t->tail;
    }
    return 0;// initial with 0
}

IntAndTable_ interpAndPrintExp(A_exp exp, Table_ t){
    IntAndTable_ iat = interpExp(exp, t);
    printf("%d ", iat->value);
    return iat;
}


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

int main(){
    interpStm(prog(), NULL);
    printf("\n");
    return 0;
}


输出结果:
8 7 80
分享到:
评论
1 楼 gatt 2008-10-06  
请问你还在研究这本书吗?这本书对我来说难度太大了,现在卡在活动记录,没办法继续读下去了

相关推荐

    三菱QD70定位模块plc视频教学 Q70P4 Q70P8编程讲解教程+程序+手册.zip

    定位模块 Q70P4 Q70P8 接线 参数设置 程序编写 教程教学 时长2个半小时 第1 集 Q70P4 Q70P8接线教程 第2集 Q70P4 Q70P8参数设置 第3集 Q70P4 Q70P8程序编写包括手动控制/自动数据控制/回原点控制 注意 视频,需要...

    P8 二开早知道——加载模型

    数字孪生平台DS的操作入门与进阶! BOS3D速成营:http://prod-api.boswinner.com/bos3d_demo/#/bos3d/init

    华硕P8H61-M LX2 CM6731-8 DP-MB REV2.01主板BIOS

    【华硕P8H61-M LX2 CM6731-8 DP-MB REV2.01主板BIOS】是华硕公司为特定型号主板设计的一款BIOS更新程序,该程序主要针对P8H61-M LX2、CM6731-8以及DP-MB REV2.01这三款主板。BIOS(基本输入输出系统)是计算机硬件与...

    P8xC591 的CAN总线应用

    用户可以通过编程设置中断标志,当接收到CAN消息或者发生错误时,微控制器会触发中断服务程序,处理相关事件。同时,P8xC591还提供了多个接收和发送缓冲区,用于存储待发送和接收到的数据,确保数据传输的实时性和...

    华硕p8h61主板驱动程序ForwinXP

    华硕p8h61主板驱动程序是一款可以有效解决华硕p8h61主板在使用过程中出现的一些问题的驱动工具,主板是电脑的核心,处理器是附着在主板上面的。主板驱动主要包括:芯片组驱动、集成显卡驱动、集成网卡驱动、集成声卡...

    三菱PLC QD70定位模块视频 Q70P4 Q70P8编程讲解教程 +程序 手册.zip

    三菱QD70定位模块视频教程 第1集qd70第1集接线 第2集QD70参数设置教程 第3集 Q70P4 Q70P8程序讲解 第4集G52 更正教程 第5原点回位 另外+QD70定位手册PDF +程序例子

    黑果E3+1230Ⅴ2+GTX470+华硕p8b75v.zip

    标题中的“黑果E3+1230Ⅴ2+GTX470+华硕p8b75v.zip”指的是一个针对Mac (MAC) 操作系统的自定义硬件配置,具体包括Intel的E3 1230 V2处理器、NVIDIA的GTX 470显卡以及华硕的P8B75-V主板。这个压缩包文件可能是为了...

    EPLAN Electric P8 2.7图框及封页模板制作

    2. 添加行号:用户可以通过选中栅格A、开/关输入框和开关对象捕捉,用“线性尺寸标注”量下列号高度,然后用“直线”划线,等尺复制线段。 3. 添加行文本及属性:用户可以通过【插入】——【特殊文本】——【行文本...

    华硕P8B75-V用户手册

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

    IBM FileNet P8 Content Engine Java API 程序设计指导手册

    ### IBM FileNet P8 Content Engine Java API 程序设计指导手册 #### 一、配置 Eclipse IDE **课程概述** 本课程将引导您通过一系列步骤完成 Eclipse 集成开发环境(IDE)的配置,包括创建项目、添加必要的 JAR ...

    P8Z77-V_PRO用户手册

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

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

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

    华硕P8Z77-V LX2 2501 BIOS 老主板支持NVME 含NVMW整合工具

    华硕P8Z77-V LX2 2501 BIOS 老主板支持NVME 含NVMW整合工具

    ibm filenet p8 ecm 方案建议书

    根据给定的文件信息,以下是对IBM FileNet P8 ECM方案的关键知识点的详细解析: ### 1. 需求背景 在当前信息化社会中,企业和组织面临着日益增长的文档和非结构化内容管理需求。无论是小公司还是大型企业,都必须...

    8P8C网口座规格书

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

    华硕P8Z77-V-LX-ASUS-2501刷bios支持M2硬盘工具和详细说明

    包括P8Z77-V-LX-ASUS-2501最新bios,修改工具,刷机工具,适用于华硕相关主板经验,刷机成功系统为WIN732

    三菱PLC Q系列大型程序伺服12轴Q01U RS232通讯CCD 应用 实际使用中程序,详细中文注释 2个模块QD70P8

    2个模块QD70P8,QD70P4控制12轴 模块QD62外接欧姆龙编码器E6C2-CWZ6C 模块QJ71C24N-R2和基恩士DL-RS1A RS-232通讯测量高度 模块Q64AD连接基恩士CCD激光测试仪IG-1000测量外径 本项目包括PLC程序,台达触摸屏DOP-B10S...

    ASUS华硕 P8H61-M LX3 R2.0主板BIOS編程器位移800刪除后的bin文件

    【华硕P8H61-M LX3 R2.0主板BIOS编程器位移800删除后的bin文件】是针对ASUS华硕P8H61-M LX3 R2.0主板BIOS更新的重要资源。BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,它负责在开机时执行初始化任务...

Global site tag (gtag.js) - Google Analytics