type
status
date
slug
summary
tags
category
icon
password
词法分析(进入正文!)
关键字运算符和界符等符号都是一字一码,这个时候他们的tok只有种码(也就是类别码),并不会有属性码(也有可能有属性值,但是此时的属性值就是tok本身,如while关键字的tok的属性值字段就是while字符串)。而对变量整型值等,他们就有属性值,此时他们的属性值字段就是变量名和实际的整形值等,而无实际意义的东西在词法分析阶段就会略过,如注释空格等
词法分析器和语法分析器之间的关系
- 词法分析器分析结束后再将结果传给语法分析器,也就是实验一的模式
- 词法分析器作为语法分析器的子程序,当语法分析器需要一个tok的时候再调用词法分析器,也就是实验一的模式
一些词法分析的难点(稍微有印象就好了)
词法分析的主要方法
根据待识别语言的词法规则(降格的语法规则)来创建状态转换图,也就是自动机,这里就涉及到非确定自动机的确定化了。这里涉及到的手动编码实际上就是如何处理自动机的问题,说白了就是图的遍历的问题,所以词法分析最重要的就是正则表达式和自动机的绘制
下图提到的两种方法:
- 手动编码实现词法分析,就是自己手搓一个词法分析的自动机,这个非常阴间,就是一个图的遍历转换的过程,有多个正则表达式还需要将多个正则表达式统一起来变成一个确定有限自动机
- 正则表达式方式,就是自己只要写一个正则表达式(flex源文件)交给flex就能自动生成词法分析的自动机了
一些词法分析的概念
- 字母表:是一个有限符号的集合,也就是待识别语言的每一个“字”构成的集合(如c语言中的各种操作符界符,还有字母数字等),实际上也是词法分析器生成的自动机的字母表(状态转移的条件,也就是那个西格玛)
- 字母表上的串(句子):就是字母表中字符的一个有穷序列(如在c语言中123,abc等就是串,或者说句子),对串取模||,就是代表这个串包含的字符数量,|空串|=0
- 语言:就是一堆串构成的集合,这个集合需要是可数的,并且其中的所有的串都是定义在给定的字母表上(周尔强的ppt不要太抽象)
正则表达式的定义(这里的L()代表的满足括号内的正则表达式的串的集合,也就是由该正则表达式确定的语言)
- 空串是一个正则表达式
- 字母表上的单个字母是一个正则表达式
- ppt上的最后一条,也就是正则表达式的组合也是正则表达式
下面给出一个正则表达式的例子便于理解
这里的西格玛是字母表,而每个正则表达式后面的集合就是满足前面的正则表达式的语言(也就是定义在字母表上的串集合)
自动机拒绝串的两种情况
- 没办法进行状态转移了
- 串识别完成,但是当前状态不是结束状态(也就是接受状态)
根据正则表达式生成非确定有限自动机
详见上面自动机的笔记,如果是链接的话就串联,如果是或的话就并联,如果是星号的话就增加一个节点和两个空边,节点进行自循环,如果是加号的话就将上面的两条空边中的一条空边换成符号就好了
flex的使用
上面两行是flex源文件中的第二个部分,就是类似宏定义的部分
flex中的yylex就是一个词法分析函数,每次调用的时候就会启动一次自动机来识别一个单词,如果是单独使用词法分析器的话就是一直运行自动机(自动机结束的时候将结果记录并且重启),而如果将其当成语法分析的一个子程序的话就是语法分析器需要一个tok的时候调用一次yylex获取一个单词,然后不会自己重启自动机,而是等待之后语法分析器来启动自动机(也就是调用yylex)
注意:yylex是返回tok的类别,而yylval是记录yylex返回的tok的属性值的
- 作者:Noah
- 链接:https://imnoah.top/article/Compiler/Chapter3
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。