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等常量需要定义,其次,因为没有定义

[cpp]  view plain copy
  1. int main()
  2. {
  3. linenum=0;
  4. yylex(); /* 进行分析 */
  5. printf("\nLine Count: %d\n",linenum);
  6. return 0;
  7. }
  8. int yywrap()
  9. {
  10. 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章相关推荐

  1. 《编译原理-龙书》练习第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.2.1 1) S1 = aa+ S2 = S1a* 2)              * + a ...

  3. 编译原理 龙书第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 ...

  4. 编译原理 龙书 笔记

    DFA NFA CFG DFA的定义: A = ( Σ, S, s0, F, N ) Σ: 输入字母表(alphabet),是一个输入字符的集合. S:状态的集合s0: 初始状态F:终止状态集合 F ...

  5. DirectX12 3D游戏开发实践(龙书)第四章 Direct3D的初始化

    目录 Direct3D的初始化 预备知识 Direct3D概述 组件对象模型 纹理格式(Textures Formats) 交换链和页面翻转 深度缓冲 资源与描述符 多重采样技术的原理 利用Direc ...

  6. 编译原理(龙书):第一章部分题目参考答案

    目录 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 ...

  7. dx12 龙书第十九章学习笔记 -- 法线贴图

    本章需要掌握的内容:①法线贴图②TBN坐标系 1.使用法线贴图的动机 左图是使用法线贴图后的结果,右图是没有使用法线贴图(使用法线插值)的结果.可以明显感知到,高光在右图中是分布在一条直线上的,并没有 ...

  8. dx12 龙书第十二章学习笔记 -- 几何着色器

    如果不启用曲面细分(tessellation)这一环节,那么几何着色器(geometry shader)这个可选阶段便会位于顶点着色器与像素着色器之间.顶点着色器以顶点作为输入数据,而几何着色器的输入 ...

  9. DirectX12 3D游戏开发实践(龙书)第五章 渲染流水线

    渲染流水线 渲染流水线 3D视觉即错觉? 模型表示 计算机色彩基础 颜色运算 不透明度 XXX位颜色 渲染流水线概述 输入装配器阶段 顶点 图元拓扑 点列表 线条带 线列表 三角形带 三角形列表 具有 ...

最新文章

  1. 【牛腩新闻发布系统】开始前端03
  2. 用Python分析了1w四六级数据,教你如何通过四六级!
  3. 深度学习之后会是啥?
  4. java webservice接口开发_搭建Soap webservice api接口测试案例系统
  5. 用真实脑电波提高魔法伤害!硬核玩家改造《上古卷轴V》,脑机接口控制魔法施放...
  6. jquery 获得鼠标指针 X/Y 值
  7. java rest客户端_Java中的简单REST客户端
  8. android语言切换快捷键,Android的语言设置两种方法
  9. 一步步学习SPD2010--第九章节--使用可重用工作流和工作流表单(1)--创建和使用可重用工作流...
  10. 【clickhouse】clickhouse 表引擎之 set
  11. ECMAScript 6中的Set和Map数据结构
  12. 哦,指针问题的见解啊
  13. 驱动级的自动按键_太牛了!业余单片机爱好者用DS3231制作自动亮度的4位数码管时钟...
  14. linux安装mysql 5.7_linux安装mysql5.7.24
  15. 前端打印ip地址_赶紧收藏 | 前端应该会的23个linux常用命令
  16. k60单片机全称 恩智浦_k60 飞思卡尔k60芯片的串口查询接收例子源程序,曾用于 比赛 SCM 单片机开发 240万源代码下载- www.pudn.com...
  17. iozone使用简介
  18. Cent OS 使用nohup 启动 Springboot避坑
  19. Ubuntu16.04系统安装搜狗输入法详细教程
  20. 焦虑 程序员_我如何克服焦虑和沮丧来完成freeCodeCamp的前端开发程序

热门文章

  1. 【AI入门学习方法】
  2. 微风:UI设计需要学习哪些软件?
  3. 计算天数(C语言)——罡罡同学
  4. python 合并word文件_python读取word合并单元格
  5. 数据结构中的L=(List)malloc(sizeof(PtrToNode));是什么意思
  6. 《Multi-Scale Residual Learning-using a Cycle Spinning CNN for Single Image De-Raining》
  7. 铕掺杂的氧化钇纳米片/片状氧化钴二维层状碳化钛复合材料-瑞禧
  8. bilibili缓存文件在哪里_不要再胡乱清理手机内存,花1分钟删掉这些文件夹,释放大量空间...
  9. python+adb命令实现自动刷视频脚本
  10. python输出好看的表格