《编译原理-龙书》练习第3章
3.1 词法分析器的作用
3.1.1 float limitedSquare ( x ) { float x ;
return ( x <= -10.0 || x >= 10.0 ) ? 100 : x * x ;
}
除了标点符号/运算符号/赋值符号,其他都有属性值(词法值?)
3.1.2 Here is a photo of <B> my hourse </B>
<P> <IMG SRC = "HOUSE.GIF" > <BR>
See <A HREF = "morePix.html" > More Pictures </A> if you liked that one. <P>
3.3 词法单元的归约
3.3.2
1)a(a|b)*a a后面0个或多个a或b,最后加个a
2)0个或多个b或者前面加个a,这个表达式重复0次或多次
3)0个或多个a或b,后面接个a,再接个a或b,再接个a或b
4)3个b,然后随意插入a
5)语言描述起来比较困难:aa或bb重复0次或多次,后面接0次或多次(ab或ba,接0次或多次aa或bb,接ab或ba,接0次或多次aa或bb)
3.3.3长度为n的字符串
1)前缀:n+1个
2)后缀:n+1个
3)真前缀 n-1个
4)子串
子串数 = 非空子串数+1
非空子串数计算如下:
删除前缀长度可能是 0, 1, 2 ...,n-1
对应的删除后缀的可能长度为n-1 n-2 n-3 ...,0 - 0
因此总数为n+n-1+...+1+1=(n+1)*n/2+1
5)子序列数
c(n,0)+c(n,1)+...+c(n,n) = 2^n
3.3.4[sS][eE][lL][eE][cC][tT]
3.3.5 2)以后的题太难了,靠自己想搞不定,从网上搜的
1)uv=[b-df-hj-np-tv-z]
uv*auv*euv*iuv*ouv*uuv*
2)a*b*c*....y*z*
!!3)开始是/*,结尾是*/,中间可以有/*,但不能有*/,除非"*/"。
other -> [^/*//]
notend ->[other*
///*(notend"*/"notend)*/*//
!!4) ^(?![0-9]*([0-9])[0-9]*\1[0-9]*)[0-9]*$
!!5)^(?![0-9]*([0-9])[0-9]*\1[0-9]*\1[0-9]*)[0-9]*$
!!6)^(?!(b*ab*ab*)*ab*$|(a*ba*ba*)*$)(a|b)*$
!!7) b*(ab?)*
!!8)b*a*b?a*
3.3.6
1) [a-jA-J]
2) [辅音字母表]
3)[0-9a-fA-F]
!!4[.?!,:;...]
3.3.7 \""\" 或 \"\\
3.3.8 补集可以全部列出来
3.3.9 m个a和n个a?连起来
3.3.10 1)[ ]中的第一个^表示补,开头^表示行首
2)^可以用在前面加一个"\n"匹配,$在最后加个"\n"匹配
3.3.11 不确定这样是否正确:
character -> 所有可以用来做文件名的字符
[character\*?\??]+.[character\*?\??]+
3.3.12 假设e为专义字符,将ee->\e,其它情况的e->\,_前面如果没有\,则表示为character,%前面如果没有\,则表示为character*
3.4 词法单元的识别
3.4.1 看完这节马上做这个会觉得比较难,等看完3.6节以后回头再看会感觉比较容易,包括3.4.2
1) a(a|b)*a
2 a则不变 ->其他->4最终状态
a /
start-> 0 ->a-> 1 b↓↑a 3中*清空
b \
3 b则不变,加一个*
2)((ε|a)b*)*
KPM
3.4.3
1) a b a b a b a a b
0 0 1 2 1 2 1 1 2
2) 3)类似
3.4.4 提示用归纳法,其实主要用了归纳法的思想。
程序中最重要的是t,表示匹配到当前失效函数的值,求下一个失效函数值要用到。
初值设置应该没啥问题,只有一个字符串的真子串长度肯定是0
假设当前已经算出f(s) = t,下一步计算f(s+1)
如果b(s+1)==b(t+1),则容易得到f(s+1)=t+1,以t+1作为新的t进行下一步计算
如果b(s+1)!=b(t+1),说明继续匹配失败,需要减小t为一个合适的值(程序第3行的做法),直到满足两个条件之一:
1.t=0,说明前面的算出的值失效,从0开始重新算
2.新的t计算得出b(s+1)==b(t+1),这样找到一个前面有效的值,加1即可继续计算
说出来可能比较难理解,实际调试一下比较容易理解。
3.4.5 参见《算法导论》中文版570页
3.5 词法分析器生成工具
图3-23 的LEX程序没法运行,首先是开头声明部分LT等常量需要定义,其次,因为没有定义
- int main()
- {
- linenum=0;
- yylex(); /* 进行分析 */
- printf("\nLine Count: %d\n",linenum);
- return 0;
- }
- int yywrap()
- {
- return 1;
所以编译的时候要加上ll:gcc lex.yy.c -ll
3.6 有穷自动机
3.7 从正则表达式到自动机
3.7.1 1) 图3-26 开始状态为 A = {0,1,3}
A输入a以后为 B = {2}
A输入b以后为 C = {4}
2) 图2-29 开始状态A={0} A
A输入a以后为 B = {0,1} B
A输入b以后为 A = {0} B
B -> a -> C = {0,1,2} C
B -> b -> {0,1} C
C -> a -> {0,1,2} C
C -> b -> D = {0,1,2,3} D
D -> a -> {0,1,2} D
D -> b -> {0,1,2,3}
3)略
3.7.2 1)aabb 图3-29
a 0,1
a 0,1,2
b 0,2,3 匹配成功,但要接着匹配下一个
b 0,2,3 输入结束,匹配成功。
3.8 词法分析器生成工具的设计
3.8.1
i -> f
character+
3.8.2略
3.8.3
3.8.4
a -> b -> c -> ->d
3.9 基于DFA的模式匹配器的优化
3.9.1
结点n | nullable(n) | firstpos(n) |
1)? | true | firstpos(c1) |
2)+ | nullable(c1) | firstpos(c1) |
3.9.2 1) (a|b)*
a:1 b:2
A = {1,2}
只有1个状态
《编译原理-龙书》练习第3章相关推荐
- 《编译原理-龙书》练习第4章
4.2 上下文无关文法 **4.2.7节中L={a^nb^n|n>=1}怎么用文法表示? S -> aAb A -> ab| ε 4.2.1 1) E -> EE* -> ...
- 《编译原理-龙书》练习第2章
第2章 一个简单的语法制导翻译器 2.2 语法定义 主要描述了"上下文无关文法" 2.2.1 1) S1 = aa+ S2 = S1a* 2) * + a ...
- 编译原理 龙书第4章 作业3
4.2.1 考虑上下文无关文法: S→S S + | S S * | a, 以及串aa+a* 1)给出这个串的一个最左推导 S→S S * →S S + S * →a S + S * →a a + S ...
- 编译原理 龙书 笔记
DFA NFA CFG DFA的定义: A = ( Σ, S, s0, F, N ) Σ: 输入字母表(alphabet),是一个输入字符的集合. S:状态的集合s0: 初始状态F:终止状态集合 F ...
- DirectX12 3D游戏开发实践(龙书)第四章 Direct3D的初始化
目录 Direct3D的初始化 预备知识 Direct3D概述 组件对象模型 纹理格式(Textures Formats) 交换链和页面翻转 深度缓冲 资源与描述符 多重采样技术的原理 利用Direc ...
- 编译原理(龙书):第一章部分题目参考答案
目录 1.1.1 1.1.2 1.1.3 1.1.4 1.6.1 1.6.3 1.6.4 1.1.1 What is the difference between a compiler and an ...
- dx12 龙书第十九章学习笔记 -- 法线贴图
本章需要掌握的内容:①法线贴图②TBN坐标系 1.使用法线贴图的动机 左图是使用法线贴图后的结果,右图是没有使用法线贴图(使用法线插值)的结果.可以明显感知到,高光在右图中是分布在一条直线上的,并没有 ...
- dx12 龙书第十二章学习笔记 -- 几何着色器
如果不启用曲面细分(tessellation)这一环节,那么几何着色器(geometry shader)这个可选阶段便会位于顶点着色器与像素着色器之间.顶点着色器以顶点作为输入数据,而几何着色器的输入 ...
- DirectX12 3D游戏开发实践(龙书)第五章 渲染流水线
渲染流水线 渲染流水线 3D视觉即错觉? 模型表示 计算机色彩基础 颜色运算 不透明度 XXX位颜色 渲染流水线概述 输入装配器阶段 顶点 图元拓扑 点列表 线条带 线列表 三角形带 三角形列表 具有 ...
最新文章
- 【牛腩新闻发布系统】开始前端03
- 用Python分析了1w四六级数据,教你如何通过四六级!
- 深度学习之后会是啥?
- java webservice接口开发_搭建Soap webservice api接口测试案例系统
- 用真实脑电波提高魔法伤害!硬核玩家改造《上古卷轴V》,脑机接口控制魔法施放...
- jquery 获得鼠标指针 X/Y 值
- java rest客户端_Java中的简单REST客户端
- android语言切换快捷键,Android的语言设置两种方法
- 一步步学习SPD2010--第九章节--使用可重用工作流和工作流表单(1)--创建和使用可重用工作流...
- 【clickhouse】clickhouse 表引擎之 set
- ECMAScript 6中的Set和Map数据结构
- 哦,指针问题的见解啊
- 驱动级的自动按键_太牛了!业余单片机爱好者用DS3231制作自动亮度的4位数码管时钟...
- linux安装mysql 5.7_linux安装mysql5.7.24
- 前端打印ip地址_赶紧收藏 | 前端应该会的23个linux常用命令
- k60单片机全称 恩智浦_k60 飞思卡尔k60芯片的串口查询接收例子源程序,曾用于 比赛 SCM 单片机开发 240万源代码下载- www.pudn.com...
- iozone使用简介
- Cent OS 使用nohup 启动 Springboot避坑
- Ubuntu16.04系统安装搜狗输入法详细教程
- 焦虑 程序员_我如何克服焦虑和沮丧来完成freeCodeCamp的前端开发程序
热门文章
- 【AI入门学习方法】
- 微风:UI设计需要学习哪些软件?
- 计算天数(C语言)——罡罡同学
- python 合并word文件_python读取word合并单元格
- 数据结构中的L=(List)malloc(sizeof(PtrToNode));是什么意思
- 《Multi-Scale Residual Learning-using a Cycle Spinning CNN for Single Image De-Raining》
- 铕掺杂的氧化钇纳米片/片状氧化钴二维层状碳化钛复合材料-瑞禧
- bilibili缓存文件在哪里_不要再胡乱清理手机内存,花1分钟删掉这些文件夹,释放大量空间...
- python+adb命令实现自动刷视频脚本
- python输出好看的表格