《虎书》确实彪悍,绪论里就留给读者实践性这么强的问题,对于中文版第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
分享到:
相关推荐
定位模块 Q70P4 Q70P8 接线 参数设置 程序编写 教程教学 时长2个半小时 第1 集 Q70P4 Q70P8接线教程 第2集 Q70P4 Q70P8参数设置 第3集 Q70P4 Q70P8程序编写包括手动控制/自动数据控制/回原点控制 注意 视频,需要...
数字孪生平台DS的操作入门与进阶! BOS3D速成营:http://prod-api.boswinner.com/bos3d_demo/#/bos3d/init
华硕p8h61主板驱动程序是一款可以有效解决华硕p8h61主板在使用过程中出现的一些问题的驱动工具,主板是电脑的核心,处理器是附着在主板上面的。主板驱动主要包括:芯片组驱动、集成显卡驱动、集成网卡驱动、集成声卡...
三菱QD70定位模块视频教程 第1集qd70第1集接线 第2集QD70参数设置教程 第3集 Q70P4 Q70P8程序讲解 第4集G52 更正教程 第5原点回位 另外+QD70定位手册PDF +程序例子
华硕P8Z77-V LE PLUS主板采用全新SMART DIGI+ 智能数字供电设计的第3代双智能处理器,支持UASP协议、更快的USB 3.0传输速度,支持 Windows 8。以下文档是华硕P8Z77-V LE PLUS用户手册,有需要的朋友可立即下载此文档...
华硕P8B75-V用户手册
ibm filenet p8 ecm 方案建议书
主板C7329_P8B75-M_LE使用说明书
包括P8Z77-V-LX-ASUS-2501最新bios,修改工具,刷机工具,适用于华硕相关主板经验,刷机成功系统为WIN732
8P8C网口座规格书,反口的规格书不好找,好不容易找到
华硕P8H61-I 主板说明书 P8H61-I 主板说明书
华硕P8Z77-V LX2 2501 BIOS 老主板支持NVME 含NVMW整合工具
华硕P8H61-M LX2 CM6731-8 DP-MB REV2.01主板BIOS
分析问题——设计算法——界面设计、编写程序——运行程序、验证结果。 2. 计算机程序:就是指示计算机如何去解决问题或完成任务的一组可执行的指令。 3. 程序设计:就是寻求解决问题的方法,并将其实现步骤编写成...
2个模块QD70P8,QD70P4控制12轴 模块QD62外接欧姆龙编码器E6C2-CWZ6C 模块QJ71C24N-R2和基恩士DL-RS1A RS-232通讯测量高度 模块Q64AD连接基恩士CCD激光测试仪IG-1000测量外径 本项目包括PLC程序,台达触摸屏DOP-B10S...
华为p8青春版是由华为官方推出的一款手机usb驱动程序,如果你的手机与电脑的连接出现了异常,下载此驱动可以帮你很好的解决这个问题,欢迎有需要的朋友下载使用!官方介绍北京时间2015年4月22日下午2点,华为P8中国...
P8xC591 P87C591 CAN总线的应用
解决问题的过程:(P3) 分析问题——设计算法——界面设计、编写程序——运行程序、验证结果。 计算机程序:就是指示计算机如何去解决问题或完成任务的一组可执行的指令。 程序设计:就是寻求解决问题的方法,并将其...