词法分析

一、词法分析的基本功能

词法分析程序是编译程序的一部分,是整个编译过程的第一步工作

二、词法分析器

读取源程序的字符序列,逐个拼出单词并构造相应的内部表示。同时检查源程序中的词法错误。它的核心作用即将字符序列转化为计算机内部表示
词法分析器的接口:

  1. 作为语法分析程序的子程序(每次将词法分析程序作为一个函数,得到一个token发给语法分析程序)——实际使用的编译器常用的实现形式
  2. 作为编译器的独立一遍处理器——课堂理解

词法分析器代码 java编写_词法分析器代码 java编写

三、单词的分类及内部表示

定义:单词语言中具有独立含义的最小语义单位

lexical analysis method//划分的形式:这三个单词即最小
x1+y//x1 + y,x1不能继续划分,与用户写这段程序时的含义要符合

分类:程序中会出现什么类型的单词,每种类型的单词处理的方式不同

  1. 保留字(一个语言保留字出现的个数和作用是定义好的)
  2. 标识符(可以是变量名、函数名、类名…有具体的命名规则,排列多样∞)
  3. 常量(true/false,10,helloworld)
  4. 特殊符号(运算符、界限符、格式符)

四、词法分析的工具(单词的描述工具)

  1. 正则表达式
  2. 词法分析器代码 java编写_词法分析_02

  3. 自动机
  4. 词法分析器代码 java编写_正则表达式_03

五、正则表达式

1. 基本概念

词法分析器代码 java编写_正则表达式_04

词法分析器代码 java编写_正则表达式_05


词法分析器代码 java编写_字符串_06

词法分析器代码 java编写_词法分析器代码 java编写_07


词法分析器代码 java编写_字符串_08


从A、B中任意选取符号串连接到一起。

词法分析器代码 java编写_词法分析器代码 java编写_09


词法分析器代码 java编写_正则表达式_10

2. 正则表达式

词法分析器代码 java编写_词法分析器代码 java编写_11


定义如此,但是根据不同的场景不同有不同的解释方式来解决不同的问题;就是说正则表达式不仅仅可以依附于字符串加以定义,可以应用在其他事务上,定义只是形式,含义需要赋予相应的解释。但是由于这里学习正则表达式是为了更好的描述词法分析所对应的符号串,所以要建立正则表达式和符号串的联系。

词法分析器代码 java编写_词法分析器代码 java编写_12


和符号串对应的正则表达式定义(2‘)

词法分析器代码 java编写_正则表达式_13


另一种定义方式,实际上和上面的没有区别:

词法分析器代码 java编写_正则表达式_14


注意对于|和·的理解,空串和空集是不一样的。"" 和 null是不一样的

3. 正则表达式的性质

词法分析器代码 java编写_字符串_15


词法分析器代码 java编写_词法分析器代码 java编写_16

首先标识符要考虑一定是以字母开头的,所以前面L,后面可以是字母和数字的任意组合

整数首先考虑符号正负和无符号数(有些语言不允许有前导0),不能有前导0把0单独作为一部分或运算;实数就是使用小数的形式表示

4. 正则表达式的局限性

词法分析器代码 java编写_字符串_17


只想要对称,但是第一个会有abaa这种形式;还有其他的不能表示的情况

5. 例题部分

词法分析器代码 java编写_词法分析_18


(a|b)*:相当于S={a,b}然后这个取星闭包,就是S1,S2…这些,是在这里面任意取,所以是任意的在这个字母表中的字符串集。

词法分析器代码 java编写_正则表达式_19


这里的二进制数不包括含有前导0的,0100这种不行