c语言-求帮备注解释 C 代码,编译原理 虎书中的

问题描述

求帮备注解释 C 代码,编译原理 虎书中的

虎书绪论里的联系,太凶。。。大学生表示看着很困难
求给定语句中任意子表达式内的print语句的参数个数,对一个直线式程序语言写的程序进行"解释"。

三个头文件

(1)prog1.h
A_stm prog(void);

(2)slp.h
typedef struct A_stm_ *A_stm;
typedef struct A_exp_ *A_exp;
typedef struct A_expList_ *A_expList;
typedef enum {A_plus,A_minus,A_times,A_div} A_binop;

struct A_stm_ {enum {A_compoundStm, A_assignStm, A_printStm} kind;
union {struct {A_stm stm1, stm2;} compound;
struct {string id; A_exp exp;} assign;
struct {A_expList exps;} print;
} u;
};
A_stm A_CompoundStm(A_stm stm1, A_stm stm2);
A_stm A_AssignStm(string id, A_exp exp);
A_stm A_PrintStm(A_expList exps);

struct A_exp_ {enum {A_idExp, A_numExp, A_opExp, A_eseqExp} kind;
union {string id;
int num;
struct {A_exp left; A_binop oper; A_exp right;} op;
struct {A_stm stm; A_exp exp;} eseq;
} u;
};
A_exp A_IdExp(string id);
A_exp A_NumExp(int num);
A_exp A_OpExp(A_exp left, A_binop oper, A_exp right);
A_exp A_EseqExp(A_stm stm, A_exp exp);

struct A_expList_ {enum {A_pairExpList, A_lastExpList} kind;
union {struct {A_exp head; A_expList tail;} pair;
A_exp last;
} u;
};

A_expList A_PairExpList(A_exp head, A_expList tail);
A_expList A_LastExpList(A_exp last);

(3)util.h
#include

typedef char *string;
typedef char bool;

#define TRUE 1
#define FALSE 0

void *checked_malloc(int);
string String(char *);

typedef struct U_boolList_ *U_boolList;
struct U_boolList_ {bool head; U_boolList tail;};
U_boolList U_BoolList(bool head, U_boolList tail);

三个源文件
(1)prog1.c
#include "util.h"
#include "slp.h"
//要分析的语句:
A_stm prog(void) {

return
A_CompoundStm(A_AssignStm("a",
A_OpExp(A_NumExp(5), A_plus, A_NumExp(3))),
A_CompoundStm(A_AssignStm("b",
A_EseqExp(A_PrintStm(A_PairExpList(A_IdExp("a"),
A_LastExpList(A_OpExp(A_IdExp("a"), A_minus,
A_NumExp(1))))),
A_OpExp(A_NumExp(10), A_times, A_IdExp("a")))),
A_PrintStm(A_LastExpList(A_IdExp("b")))));
}

(2)slp.c
#include "util.h"
#include "slp.h"

A_stm A_CompoundStm(A_stm stm1, A_stm stm2) {
A_stm s = checked_malloc(sizeof *s);
s->kind=A_compoundStm; s->u.compound.stm1=stm1; s->u.compound.stm2=stm2;
return s;
}

A_stm A_AssignStm(string id, A_exp exp) {
A_stm s = checked_malloc(sizeof *s);
s->kind=A_assignStm; s->u.assign.id=id; s->u.assign.exp=exp;
return s;
}

A_stm A_PrintStm(A_expList exps) {
A_stm s = checked_malloc(sizeof *s);
s->kind=A_printStm; s->u.print.exps=exps;
return s;
}

A_exp A_IdExp(string id) {
A_exp e = checked_malloc(sizeof *e);
e->kind=A_idExp; e->u.id=id;
return e;
}

A_exp A_NumExp(int num) {
A_exp e = checked_malloc(sizeof *e);
e->kind=A_numExp; e->u.num=num;
return e;
}

A_exp A_OpExp(A_exp left, A_binop oper, A_exp right) {
A_exp e = checked_malloc(sizeof *e);
e->kind=A_opExp; e->u.op.left=left; e->u.op.oper=oper; e->u.op.right=right;
return e;
}

A_exp A_EseqExp(A_stm stm, A_exp exp) {
A_exp e = checked_malloc(sizeof *e);
e->kind=A_eseqExp; e->u.eseq.stm=stm; e->u.eseq.exp=exp;
return e;
}

A_expList A_PairExpList(A_exp head, A_expList tail) {
A_expList e = checked_malloc(sizeof *e);
e->kind=A_pairExpList; e->u.pair.head=head; e->u.pair.tail=tail;
return e;
}

A_expList A_LastExpList(A_exp last) {
A_expList e = checked_malloc(sizeof *e);
e->kind=A_lastExpList; e->u.last=last;
return e;
}

(3)util,c
/*

  • util.c - commonly used utility functions.
    */

#include
#include
#include
#include "util.h"
void *checked_malloc(int len)
{void *p = malloc(len);
if (!p) {
fprintf(stderr,"nRan out of memory!n");
exit(1);
}
return p;
}

string String(char *s)
{string p = checked_malloc(strlen(s)+1);
strcpy(p,s);
return p;
}

U_boolList U_BoolList(bool head, U_boolList tail)
{ U_boolList list = checked_malloc(sizeof(*list));
list->head = head;
list->tail = tail;
return list;
}

解决方案

先搞清楚算法,而不是直接看代码。特别是C语言,这种原始而简陋的语言,直接看代码看到的都是一些分配内存、字符串拷贝之类的底层操作。不明白算法看程序就是给自己添堵。

时间: 2024-07-28 20:49:56

c语言-求帮备注解释 C 代码,编译原理 虎书中的的相关文章

各位大神请帮忙,我对id对应关系和参数设置不怎么懂,所以求帮改下下列代码,谢谢

问题描述 各位大神请帮忙,我对id对应关系和参数设置不怎么懂,所以求帮改下下列代码,谢谢 下边是我JSP的代码,我想点击"其他参数设置"设置连接时跳到"其他参数设置"Edit的编辑里,而不是跳到List里.能不能帮我把这段代码的"其他参数设置"连接修改下. "其他参数设置"Edit编辑的网页参数是: http://localhost:8082/ym//Module/QTCSSZ/Edit.action?id=5&ifr

c#解释代码-C# 求大神解释下面代码

问题描述 C# 求大神解释下面代码 public static string GetSerialPort() { return MulGetHardwareInfo(HardwareEnum.Win32_SerialPort, "Name"); } //枚举win32 api public enum HardwareEnum { Win32_SerialPort , Win32_SerialPortConfiguration , Win32_SerialPortSetting } pu

c语言-求大神解释C语言题,请解释详细一点,谢谢

问题描述 求大神解释C语言题,请解释详细一点,谢谢 下面的代码输出什么? #include int main(void) { int i; int a[5]; for (i = 0; i <= 5; ++i) { a[i] = -i; printf("a[%d] = %dn", i, a[i]); } return 0; } 解决方案 #include<stdio.h> void main() { int i=0; int a[5]={0,0,0,0,0}; for

c语言-求大神给个代码,c语,求指导

问题描述 求大神给个代码,c语,求指导 现在给你n个数,判断对每个数开平方后的和是不是一个整数. 比如: 4,9,16这三个数开平方后的和为9,是一个整数. 2,3,19这三个数开平方后的和为7.5051633134826458945661170495752......,是一个小数. 你的任务就是判断n个数开方后的和是不是一个整数. 输入 多组数据; 对于每组数据: 第一行一个n(n<=100,正整数). 第二行n个数,保证都是不大于10^9的非负整数. 输出 每个数开平方后的和是整数则输出Ye

请求帮忙改代码-编译原理 编译器 java

问题描述 编译原理 编译器 java 词法分析,语法分析,语义分析生成中间代码,目标代码生成.输入c语言,输出汇编语言 解决方案 http://www.cnblogs.com/zhiyinjixu/articles/2251834.html 解决方案二: java编译原理Java编译原理(有感)java编译原理

链表-一段输出两个list不同之处的代码,求大神解释

问题描述 一段输出两个list不同之处的代码,求大神解释 为什么代码中既有head,也有tail,他们两个是什么关系,各起到什么作用?求大神解释 Lnode * difference( Lnode *list1, Lnode *list2 ) { Lnode *head = NULL; Lnode *tail = NULL; Lnode *new_node; Lnode *copy_node; // walk through both lists, adding nodes as necessa

c语言如何进阶?需不需要学操作系统和编译原理

问题描述 c语言如何进阶?需不需要学操作系统和编译原理 学了一段时间的c语言,基本知识都掌握了,想深入学习一下c语言,不知道需不需要先学习一下操作系统方面的知识或者编译原理,请高手指点一下 解决方案 C语言是一种系统编程语言,有人称它叫做"高级语言中的低级语言",由于它接近硬件,语法相对简单,并且自身抽象程度很差,不适合编写应用程序,而很适合编写系统软件,比如微控制器.嵌入式系统.驱动程序等等. 这恰好是操作系统和编译原理的学习中最适合的语言.C语言接近硬件,接近操作系统,天然地,和操

求大神帮我解释一下liquid语言的jekyll代码

问题描述 求大神帮我解释一下liquid语言的jekyll代码 <div class="well"> <h4>Recent posts</h4> <ul class="posts" span="recent"> {% for post in site.posts limit:5 %} <li> <span>{{ post.date | date_to_string }}<

printf-c语言求最小公倍数 求大神帮我理解下这个代码

问题描述 c语言求最小公倍数 求大神帮我理解下这个代码 #includeint main(){? ?int mnik=1;? ?scanf(""%d %d""&m&n);? ?for(i=1;i<=m;i++)? ?{? ? ? ?if(m%i==0 && n%i==0)? ? ? ?{? ? ? ? ? ?k*=i;? ? ? ? ? ?m/=i;? ? ? ? ? ?n/=i;? ? ? ?}? ? ? ?if(m==1 |