更新时间:2024-05-11 19:46:45
封面
版权信息
内容简介
前言
第一部分 编程语言导论
第1章 为什么要构建另一种编程语言
1.1 编写自己的编程语言的动机
1.1.1 编程语言实现的类型
1.1.2 组织字节码语言实现
1.1.3 示例中使用的语言
1.2 编程语言与库的差别
1.3 适用于其他软件工程任务
1.4 建立语言需求
1.5 案例研究:Unicon语言的创建需求
1.5.1 Unicon需求#1——保留人们对Icon的喜爱
1.5.2 Unicon需求#2——支持大型大数据项目
1.5.3 Unicon需求#3——现代应用程序的高级输入/输出
1.5.4 Unicon需求#4——提供可实现的通用系统接口
1.6 本章小结
1.7 思考题
第2章 编程语言设计
2.1 确定要编程语言提供的单词和标点符号的类型
2.2 指定控制流
2.3 决定支持哪种数据
2.3.1 原子类型
2.3.2 复合类型
2.3.3 领域特定类型
2.4 整体程序结构
2.5 完成Jzero语言的定义
2.6 案例研究:设计Unicon中的图形功能
2.6.1 2D图形语言支持
2.6.2 添加3D图形支持
2.7 本章小结
2.8 思考题
第3章 扫描源代码
3.1 技术需求
3.2 词素、词类和标记
3.3 正则表达式
3.3.1 正则表达式规则
3.3.2 正则表达式示例
3.4 使用UFlex和JFlex
3.4.1 头部分
3.4.2 正则表达式部分
3.4.3 编写一个简单的源代码扫描器
3.4.4 运行扫描器
3.4.5 标记和词法属性
3.4.6 扩展示例以构造标记
3.5 为Jzero编写扫描器
3.5.1 Jzero Flex规范
3.5.2 Unicon Jzero代码
3.5.3 Java Jzero代码
3.5.4 运行Jzero扫描器
3.6 正则表达式并不总是足够的
3.7 本章小结
3.8 思考题
第4章 解析
4.1 技术需求
4.2 语法分析
4.3 理解上下文无关文法
4.3.1 编写上下文无关文法规则
4.3.2 编写编程构造规则
4.4 使用iyacc和BYACC/J
4.4.1 声明头部分中的符号
4.4.2 组合yacc上下文无关文法部分
4.4.3 理解yacc解析器
4.4.4 修复yacc解析器中的冲突
4.4.5 语法错误修复
4.4.6 组合简单示例
4.5 为Jzero编写解析器
4.5.1 Jzero lex规范
4.5.2 Jzero yacc规范
4.5.3 Unicon Jzero代码
4.5.4 Java Jzero解析器代码
4.5.5 运行Jzero解析器
4.6 改进语法错误消息
4.6.1 向Unicon语法错误消息添加详细信息
4.6.2 向Java语法错误消息添加详细信息
4.6.3 使用Merr生成更好的语法错误消息
4.7 本章小结
4.8 思考题
第5章 语法树
5.1 技术需求
5.2 GNU make的使用
5.3 树
5.3.1 定义语法树类型
5.3.2 解析树与语法树
5.4 从终结符创建叶子
5.4.1 用叶子包装标记
5.4.2 使用YACC的值栈
5.4.3 为解析器的值栈包装叶子
5.4.4 确定需要哪些叶子
5.5 从产生式规则构建内部节点
5.5.1 访问值栈上的树节点
5.5.2 使用树节点工厂方法
5.6 为Jzero语言形成语法树
5.7 调试并测试语法树
5.7.1 避免常见的语法树错误
5.7.2 以文本格式输出语法树
5.7.3 使用dot输出语法树
5.8 本章小结