编译原理程序设计实践(二) 全局变量定义

以下各节的代码根据教材P288的附录A中的pascal代码改写而来。改写时的要求是

1、尽量使用原有的变量名和类型名、函数名和参数名

2、对c++中未提供的运算符或者函数,则额外实现

3、尽量不改动原有的处理流程。

此外,代码中的注释基本摘自技术高手李凡希的博客。地址为http://blog.csdn.net/lifanxi/article/details/3833 

这里向这位技术大牛致以崇高的敬意!

由于代码较多,故分几次贴出,本次先贴出头文件包含语句和全局变量定义语句

 

/* PL/0编译程序与代码生成解释运行程序 */
/* PL/0 compiler with code generation */
/*引入必要的头文件和类型名*/
#include<set>
using std::set;
#include<fstream>
using std::fstream; 
using std::ifstream; 
using std::ofstream; 
#include <iostream>
using std::istream ;
using std::cin;
using std::cout;
using std::endl;
#include <iomanip>
using std::setw;
using std::left;
using std::boolalpha;
#include <cstring>
#include <cctype>
/* 常量定义 */
const int  norw = 13;     /* of reserved words */ /* 保留字的个数 */
const int  txmax = 100;   /* length of identifier table */ /* 标识符表的长度(容量) */
const int  nmax = 14;     /* max number of digits in numbers */ /* 数字允许的最长位数 */
const int  al = 10;       /* length of identifiers */ /* 标识符最长长度 */
const int  amax = 2047;   /* maximum address */ /* 寻址空间 */
const int  levmax = 3;    /* max depth of block nesting */ /* 最大允许的块嵌套层数 */
const int  cxmax = 200;   /* size of code array */ /* 类PCODE目标代码数组长度(可容纳代码行数) */
/* 类型定义 */
enum  symbol
	{nul, ident, number, plus, minus, times, slash, oddsym,
            eql, neq, lss, leq, gtr, geq, lparen, rparen, comma,
            semicolon, period, becomes, beginsym, endsym, ifsym,
            thensym, whilesym, writesym, readsym, dosym, callsym,
            constsym, varsym, procsym
	}; /* symobl类型标识了不同类型的词汇 */
typedef char  alfa[al]; /* alfa类型用于标识符 */
enum  object{constant, variable, procedure}; /* object为三种标识符的类型 */
typedef set<symbol>  symset; /* symset是symbol类型的一个集合类型,可用于存放一组symbol */
enum fct{lit, opr, lod, sto, cal, _int, jmp, jpc}; /* fct类型分别标识类PCODE的各条指令 */
struct instruction 
{
    fct f;       /* function code */
    int l; /* level */
    int a;   /* displacement addr */
}; /* 类PCODE指令类型,包含三个字段:指令f、层差l和另一个操作数a */
/* 
     lit 0, a  load constant a
     opr 0, a  execute opr a
     lod l, a  load variable l, a
     sto l, a  store variable l, a
     cal l, a  call procedure a at level l
     int 0, a  increment t-register by a
     jmp 0, a  jump to a
     jpc 0, a  jump conditional to a 
*/
 /* 全局变量定义 */
ofstream fa; /* 文本文件fa用于列出源程序 */
ofstream fa1, fa2; /* 文本文件fa1用于列出类PCODE代码、fa2用于记录解释执行类PCODE代码的过程 */
bool listswitch; /* true set list object code */ /* 如果本变量置true,程序编译后将为列出类PCODE代码,
                                                          否则不列出类PCODE代码 */
char ch; /* last char read */ /* 主要用于词法分析器,存放最近一次从文件中读出的字符 */
symbol sym; /* last symbol read */ /* 词法分析器输出结果之用,存放最近一次识别出来的token的类型 */
alfa id;  /* last identifier read */ /* 词法分析器输出结果之用,存放最近一次识别出来的标识符的名字 */
int num; /* last number read */ /* 词法分析器输出结果之用,存放最近一次识别出来的数字的值 */
int cc;  /* character count */ /* 行缓冲区的列指针 */ 
int ll;  /* line length */ /* 行缓冲区长度 */
int kk;  /* 引入此变量是出于程序性能考虑,见getsym过程注释 */
int cx;  /* code allocation index */ /* 代码分配指针,代码生成模块总在cx所指位置生成新的代码 */
char line[81];/* 行缓冲区,用于从文件读出一行,供词法分析获取单词时之用 */
alfa a; /* 词法分析器中用于临时存放正在分析的词 */
instruction code[cxmax];/* 生成的类PCODE代码表,存放编译得到的类PCODE代码 */
alfa word[norw];/* 保留字表 */
symbol wsym[norw];/* 保留字表中每一个保留字对应的symbol类型 */
symbol ssym['^'-' '+1];/* 一些符号对应的symbol类型表 */
char mnemonic[8][5]; /* 类PCODE指令助记符表 */
symset declbegsys, statbegsys, facbegsys; /* 声明开始、表达式开始和项开始符号集合 */
  /* 符号表 */
struct{
	alfa name; /* 符号的名字 */
	object kind;
	union
	{
		int val;                     /* 如果是常量名 val中放常量的值 */
		struct{
			int level, adr, size;   /* 如果是变量名或过程名,存放层差、偏移地址和大小 */
		}; 
	}; 
}table[txmax+1]; 
ifstream  fin; /* fin文本文件用于指向输入的源程序文件,fout程序中没有用到 */
alfa fname; /* 存放PL/0源程序文件的文件名 */
int err; /* 出错总次数 */

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理经典教材 目录 第一章引论 1.1什么叫编译程序 1.2编译过程概述 1.3编译程序的结构 1.3.1编译程序总框 1.3.2表格与表格管理 1.3.3出错处理 1.3.4遍 1.3.5编译前端与后端 1.4编译程序与程序设计环境 1.5编译程序的生成 第章高级语言及其语法描述 2.1 程序语言的定义 2.1.1语法 2.1.2 语义 2.2 高级语言的一般特性 2.2.1 高级语言的分类 2.2.2程序结构 2.2.3数据类型与操作 2.2.4语句与控制结构 2.3程序语言的语法描述 2.3 上下文无关文法 2.3.2语法分析树与义性 2.3.3 形式语言鸟瞰 练 习 第三章词法分析 3.1 对于词法分析器的要求 3.1.1词法分析器的功能和输出形式 3.1.2词法分析器作为一个独立子程序 3.2词法分析器的设计 3.2.1输入、预处理 3.2.2 单词符号的识别:超前搜索 3.2.3状态转换图 3.2.4状态转换图的实现 3.3正规表达式与有限自动机 3.3.1正规式与正规集 3.3.2确定有限自动机(DFA) 3.3.3非确定有限自动机(NFA) 3.3.4正规文法与有限自动机的等价性 3.3.5 正规式与有限自动机的等价性 3.3.6确定有限自动机的化简 3.4词法分析器的自动产生 3.4.1语言LEX的一般描述 3.4.2超前搜索 3.4.3 LEX的实现 练 习 第四章语法分析——自上而下分析 4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.3.1左递归的消除 4.3.2消除回溯、提左因子 4.3.3 LL(1)分析条件 4.4递归下降分析程序构造 4.5预测分析程序 4.5.1预测分析程序工作过程 4.5.2预测分析表的构造 4.6 LL(1)分析中的错误处理 练 习 第五章语法分析——自下而上分析 5.1 自下而上分析基本问题 5.1.1 归约 5.1.2规范归约简述 5.1.3符号栈的使用与语法树的表示 5.2算符优先分析 5.2.1算符优先文法及优先表构造 5.2.2算符优先分析算法 5.2.3优先函数 5.2.4算符优先分析中的出错处理 5.3LR分析法 5.3.1 LR分析器 5.3.2LR(O)项目集族和LR(O)分析表的构造 5.3.3 SLR分析表的构造 5.3.4规范LR分析表的构造 5.3.5 LALR分析表的构造 5.3.6 义文法的应用 5.3.7LR分析中的出错处理 5.4语法分析器的自动产生工具YACC 练 习 第六章属性文法和语法制导翻译 6.1属性文法 6.2基于属性文法的处理方法 6.2.1 依赖图 6.2.2树遍历的属性计算方法 6.2.3 一遍扫描的处理方法 6.2.4抽象语法树 6.3 S-属性文法的自下而上计算 6.4 L-属性文法和自顶向下翻译 6.4.1 翻译模式 6.4.2自顶向下翻译 6.4.3递归下降翻译器的设计 6.5自下而上计算继承属性 6.5.1 从翻译模式中去掉嵌入在产生式中间的动作 6.5.2分析栈中的继承属性 6.5.3模拟继承属性的计算 6.5.4 用综合属性代替继承属 练 习
系统地讲述c语言的基础知识、基本语法以及编程方法,并且结合c阐述面向对象的程序设计思想,使读者在掌握c语言语法知识的同时,能够解决现实生活中较简单的问题,并用计算机语言进行描述。本书每一章中都用大量实用性较强的例题阐述基本知识点,同时在每章的最后都提供一个有一定难度且趣味性较强的综合实例,将本章中多个知识点有机地结合起来,力求读者能把理论与实践紧密结合,体会解决实际问题的过程。全书内容精练,重点突出,从实例出发提出概念,突出应用,趣味性强。 语言表达严谨、文字通俗易懂,同时配有题型多样的典型习题,适用于c高级语言程序设计的初学者,可以作为普通高等院校中电子信息类专业程序设计基础的教材,也适宜有兴趣学习c的非计算机专业学生作为辅助教材,同时也适合自学。 目录编辑 第1章c简单程序设计1 1.1概述1 1.1.1c语言的发展历史1 1.1.2c程序设计的初步知识2 1.1.3字符集5 1.1.4词法记号5 1.2基本数据类型6 1.2.1基本数据类型7 1.2.2变量8 1.2.3常量10 1.3运算符和表达式13 1.3.1运算符的优先级14 1.3.2算术运算符及其表达式15 1.3.3关系运算符与逻辑运算符15 1.3.4增1、减1运算符及其表达式17 1.3.5赋值运算符、复合的赋值运算符及其表达式17 1.3.6条件运算符18 1.3.7位操作运算符18 1.3.8其他运算符20 1.3.9数据类型转换21 1.3.10类型别名22 1.4面向对象设计思想及其实例23 1.4.1程序设计语言的发展23 1.4.2面向过程的程序设计(pop)思想23 1.4.3面向对象的程序设计(oop)思想24 1.4.4面向对象思想分析实例——卖报亭24 1.5c上机实践26 1.5.1c程序的实现过程26 1.5.2cbuilder可视化编程环境27 本章小结30 习题31 第2章数据的输入/输出与控制结构34 2.1键盘输入34 2.2屏幕显示输出35 2.3字符数据的输入输出36 2.3.1字符数据的输入与输出36 2.3.2字符串的输入与输出37 2.4程序基本控制结构38 2.4.1语句的概念38 2.4.2算法的基本控制结构41 2.5选择结构42 2.5.1if-else语句42 2.5.2switch语句46 2.6循环结构48 2.6.1while语句与do-while语句48 2.6.2for循环语句50 2.6.3ifgoto实现循环功能51 2.6.4循环的嵌套52 2.7跳转语句53 2.7.1break语句54 2.7.2continue语句54 2.7.3break语句与continue语句的比较54 2.7.4goto语句55 2.8编程实例——水果收银机55 本章小结56 习题57 第3章数组61 3.1数组的基本概念61 3.2数组的定义与数组元素的表示法62 3.2.1数组的定义格式62 3.2.2数组元素的表示方法62 3.3数组的赋值63 3.3.1数组赋初值63 3.3.2数组赋值65 3.4字符数组66 3.4.1字符数组的定义格式66 3.4.2字符数组的赋值66 3.4.3字符数组的输入输出操作67 3.4.4字符串处理函数68 3.5编程实例——选择法排序和josephus问题70 3.5.1选择法排序70 3.5.2josephus问题71 本章小结72 习题72 第4章函数76 4.1函数的定义与调用76 4.1.1函数的定义76 4.1.2函数的声明和调用77 4.2函数的调用方式和参数传递79 4.2.1函数的调用过程79 4.2.2函数的传值调用80 4.2.3函数的引用调用81 4.2.4数组作为函数参数83 4.3函数的嵌套调用和递归调用85 4.3.1函数的嵌套调用85 4.3.2函数的递归调用86 4.4带默认形参值的函数90 4.5内联函数和重载函数92 4.5.1内联函数92 4.5.2重载函数93 4.6编程实例——进制与十进制的转换94 本章小结95 习题95 第5章程序结构100 5.1全局变量与局部变量100 5.1.1全局变量100 5.1.2局部变量101 5.2静态变量102 5.3存储类型103 5.4作用域与生存期104 5.4.1作用域104 5.4.2可见性105 5.4.3生存期105 5.5编译预处理105 5.5.1文件包含106 5.5.2宏定义106 5.5.3条件编译108 5.6多文件结构109 本章小结110 习题110 第6章指针114 6.1指针的概念114 6.1.1指针变量的声明115 6.1.2指针变量的初始化与引用115 6.2指针运算116 6.2.1运算符“ [1]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值