没有合适的资源?快使用搜索试试~ 我知道了~
首页从lex,yacc到javacc教程
从lex,yacc到javacc教程
5星 · 超过95%的资源 需积分: 10 81 下载量 143 浏览量
更新于2023-07-23
收藏 72KB DOCX 举报
关于使用lex,yacc,javacc等工具构造词法语法解释程序,简单易懂,范例详尽。
资源详情
资源推荐
从 lex&yacc 说到编译器(1.正则表达
式)
作者
学过编译原理的朋友肯定都接触过 这个小型的词法扫描工具但是却很少有人真正把
用在自己的程序里在构造专业的编译器的时候常常需要使用到 和 正是因为这
两个工具使得我们编写编译器解释器等工具的时候工作变得非常简单不过话说回来会使用
和 的人也确实不简单 和 里面牵涉到一系列的编译原理的理论知识不是简
单地看看书就能搞懂的本文只是简单地介绍一下 和 的使用方法相关编译理请查看
本科教材
国内大学教材里面对于 和 的介绍很少有些根本就没有不过在国外的编译原理
教材介绍了很多按照学科的分类国内大学本科里面开的!!编译原理""教程只是讲解编译的
原理并不讲解实践而对于实践方面则是另外一门学科!!编译技术""关于编译技术的书籍
在国内是少之又少前不久听说上海交大的计科内部出版过编译技术的教材可惜我们这些人
就无法得见了还好机械工业出版社引进了美国¤# $% 所著的经典著作!!编译
原理及实践""中比较详细地介绍 和 的使用
属于 &'( 内部的工具它通常都是 的附带工具如果你使用的 操作系统那
么肯定系统本身就有 和 不过 的名字变成了 )如果你使用的 *%+ 操
作系统那么可以到 + 或者 &'(,- 里面找得到网上也有 +%+ 版本 和
大家可以自己去找一找
本文一共有两篇一篇是介绍 另一篇是介绍 和 搭配使用我们构造自
己的编译器或者解释器就如同儿戏所以我把本文的名字叫做黄金组合
本文以 ./ 0 1为例两讲解如何构造扫描程序
0 可以通过一个输入文件然后生成扫描器的 $ 源代码
其实扫描程序并不只用于编译器¤比如编写游戏的脚本引擎的时候我看到很多开发者都是
自己写的扫描器其算法相当落后/完全没有 203 的概念化1甚至很多脚本引擎开发者的词法扫
描器都没有编写而是在运行过程中寻找 4/单词1在现代的计算机速度确实可以上小型的
脚本引擎在运行中进行词法扫描但是作为一个合格的程序员或者说一个合格的计算机本科毕
业生而来说能够运用编译原理与技术实践应该是个基本要求
如果要说到词法分析的扫描器源代码编写其实也很简单会 $ 语言的人都会写可是
# % 在!!编译原理及技术"里面花了 5 多页原因就是从理论角度介绍标准的
可扩展的高效的词法扫描器的编写里面从正则表达式介绍到 203/有穷自动机1再到 '03/非
确定性有穷自动机1最后才到代码的编写以自动机原理编译扫描器的方法基本上就是现在词法
扫描器的标准方法也就是 使用的方法在 中我们甚至不需要自己构造词法的 203
我们只需要把相应的正则表达式输入然后 能够为我们自己生成 203然后生成源代码可谓
方便之极
本文不讲 203 的输入是正则表达式我们直接先看看正则表达式方面知识就可以了
1.正则表达式(regular expression):
对于学过编译原理的朋友来说这一节完全可以不看不过有些东西还是得注意一下因为在
. 中的正则表达式的使用有些具体的问题是在我们的课本上没有说明的
先看看例子
例
1.1
6
这就是定义了 这个正则表达式它就等于字符串 6所以如果你的源程序中
出现了 6 这个字符传那么它就等于出现一次 正则表达式
例
1.2
%7877977577:77
这个表达式就是说正则表达式 % 就是 8; 中的某一个字母所以无论是 或
者是 ;都是属于 % 这个正则表达式的
<7=符号表示”或者”的意思
那么定义正则表达式¤67>同样的如果你的源程序中出现了
6 或者 >那么就等于出现了一次 正则表达式
例
1.3
8?
<?=符号表示”零到无限次重复”
那么 所表示的字符串就可以是空串/什么字符都没有1 8 88 888 88888
88888888888 88888888;等等总之 就是由 个或者 ' 个 8 所组成/' 可以为任意自
然数1
与”?=相同的有个”@=符号请看下面的例子 8
例
1.4
-8@
<@=符号表示”8 到无限次重复”
那么 - 和 不同的唯一一点就是- 不包含空串因为”@=表示至少一次重
复那么 - 至少有一个 8所以 - 所表达的字符串就是 888888 8888
88888;等等
例
1.5
%ABC
-ABD3BEC
这里的 % 等于例 8 中的 %也就是说7)7 就相当于ABC
同理- 也就是相当于¤7)77%77F7;77D737G7$72;7E不过注意的一点就是你不能
把 - 写成A3BDC而必须大写和小写都应该各自写出来
例
1.6
3AH3C
<H=表示非也就是除了这个字符以外的所有字符
所以 3 表示的就是除了 3 以外的所有字符
下面让我们来看看一些一般高级程序语言中常用的综合例子
%ABC
)-I%J@
-ABD3BEC
% 前面多次提起过就是 B 的阿拉伯数字)- 就是所有的数字组合也就是整数
- 前面也提起过唯一不同的就是多了一个下划线因为一般我们的 $ 语言中容许有下
划线来表示定义的变量名所以我也把下划线当成英语字母来处理了
这里 )- 中使用上面定义的 % 正则表达式在 中用I%J就是表示正则表达
式 %
+AKC
+LA KC@
+ 就是提行的意思这里我们使用的是K 这个符号它和 $ 语言中表示提行号一致
问题是大家可能要问到为什么要使用AC符号因为在 中如果你使用AC那么里面表示的肯定就
是单个字符号而不会被理解成”K=和”=两个字符
*L 就是空格符号的意思一般的高级程序语言中有两种一种就是简单的空格还
有一种就是K 制表符使用了”@=符号就表示了这些空白符号的无限组合
从 lex&yacc 说到编译器(2.ex 的使用)
作者
看了第一篇的关于正则表达式的说明后下面我们就来通过它使用 . 这个词法分析工具
来构造我们的编译器的词法分析器
关于 的教程应该是很多这里我就简单地介绍一下然后着重后面的 和 的配合
使用以及其技巧所以如果你不看了后还是不太明白 或者 的使用请你自己上网去查
查这方面的教程是很多的我知道的一篇常见的就是
Yacc 与¤Lex 快速入门
Lex 与¤Yacc 介绍
它的作者就是 3 G
0 就是 F 的意思而 就是 3D- 的意思. 可以在 + 或
者 L- 中找到它是 的一个工具属于 &'( 组织产品网上也可以找到单独可以在
+%+ 下用的版本
我们一般把我们的词法扫描程序要扫描的一些单词/41用正则表达式写好然后作为
的输入文件输入命令 . / 就是输入文件1 经过处理后就能得到一个名字叫
的 $ 源代码这个 $ 源代码文件就是我们的词法扫描程序通常 为我们生成的词法
分析器的 $ 源代码都是十分复杂而且庞大的我们一般根本不会去查看里面的代码/放心好
了. 这个东西不会出错的1
下面让我们看看几个我已经使用过的几个 输入文件
这是一个前段时间我为 &G3 上的一个 >,& 游戏写的脚本引擎所使用的 输入文件/部
分1
例 8
剩余56页未读,继续阅读
JinHuanBaobei
- 粉丝: 13
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 保险服务门店新年工作计划PPT.pptx
- 车辆安全工作计划PPT.pptx
- ipqc工作总结PPT.pptx
- 车间员工上半年工作总结PPT.pptx
- 保险公司员工的工作总结PPT.pptx
- 报价工作总结PPT.pptx
- 冲压车间实习工作总结PPT.pptx
- ktv周工作总结PPT.pptx
- 保育院总务工作计划PPT.pptx
- xx年度现代教育技术工作总结PPT.pptx
- 出纳的年终总结PPT.pptx
- 贝贝班班级工作计划PPT.pptx
- 变电值班员技术个人工作总结PPT.pptx
- 大学生读书活动策划书PPT.pptx
- 财务出纳月工作总结PPT.pptx
- 大学生“三支一扶”服务期满工作总结(2)PPT.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功