词法分析

您所在的位置:网站首页 semiconductors词素划分 词法分析

词法分析

2023-06-06 08:56| 来源: 网络整理| 查看: 265

本系列文章是《编译原理》的读书笔记,并加入了一些个人的理解。本系列的主要内容顺序如下:1)、首先解释什么是词法单元;2)、如何手动识别词法单元;3)、最后是词法分析器如何自动机自动识别词法单元;本文主要是看一下词分析器的词法单元部分。包括一些基本概念,以及词法单元的识别。

首先我们先大体上看一下词法分析器的作用。它的主要任务是读入源程序的输入字符、将它们组成词素,生成并输出一个词法单元的序列。每个词法单元对应一个词素。

这里我们有提到几个专业名词:词素、词法单元。它们的定义马上就会说到,我们可以先看看下面这幅图:

从图中我们可以看出来词法分析器还在和符号表进行交互,其主要作用是从符号表中读取有关标识符种类信息,以确定需要向语法分析器传送的词法单元。

一、词法单元

现在我们就先来看看前面提到的一些专业名词:

词法单元:由一个 词法单元名和一个可选的属性 构成。比如一个特定的关键字,或者代表一个标识符的输入字符序列。

词法单元是语法分析器处理的输入符号。

词素:源程序中的一个字符序列,它和某个词法单元的模式匹配。它被词法分析器识别为该词法单元的一个实例;

模式:它描述了一个词法单元的词素可能具有的形式;

这儿我大致地解释一下这三个概念之间的关系:词法单元指定的是某一类型的事物,用面向对象来说就是,词法单元类(class);词素就是指的是该类的具体实例;而模式就是该类的一个属性,它描述了词素所具有的具体特征。

1234class Tokens{ string pattern;};Tokens lexeme;

并不是说实际就是这个代码,我只是为了便于理解,而进行的类比。下表给出了一些常见的词法单元:

词法单元 非正式描述 词素实例 if(关键字) 字符i,f if else(关键字) 字符e,l,s,e else comparison(比较运算符) ,=,==… A | B | C | ... | Z | a | b | c | ... | z | _ digit -> 0 | 1 | ... | 9 id -> letter_ (letter_ | digit ) * 例二

无符号数是形如5280、0.01234、6.336E4或者1.89E-4的串。下面的正则定义给出了这类符号串的精确定义:

12345digit -> 0 | 1 | ...| 9digits -> digit digit* optionalFraction -> . digits | 空集optionalExponent -> (E (+|-|空) digits) | 空number -> digits optionalFraction optionalExponent 正则表达式的扩展 单目后缀运算符+:指的正闭包; 单目后缀运算符?:表示出现0个,或者一个; 字符类:正则表达式a1 | a2 | a3 |…|an可以缩写为 [a1a2a3…an]。当a1到an形成一个逻辑上连续的序列时,可以写作 [a1 - an]; 例三

我们可以使用正则表达式的扩展,来把例一的正则表达式进行改写:

123letter_ -> [A-Za-z_]digit -> [0-9]id -> letter_ (letter_ | digit ) *

现在通过正则表达式,我们可以写出对应词法单元对应的模式来。因此下一步要做的就是读取源代码里面的字符流,搭配对应的词法单元的模式,生成对应的词法单元。

三、输入缓冲

很多情况下,我们需要至少向前看一个字符。比如在c语言中,像-、=或者< 这样单字符运算符也有可能是 -> 、== 或者



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3