编译原理——词法分析(2)

本文介绍了词法分析的基础概念,包括串和语言的定义、正则表达式的使用及语言上的运算。同时,详细解释了如何通过状态转换图识别词素,包括保留字、标识符和数字等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

紧接着上一篇词法分析进行学习,可以点这前往呀~https://blog.youkuaiyun.com/zoweiccc/article/details/82632904

1.1串和语言

       字母表是一个有限的符号集合。符号的典型例子包括字母、数位和标点符号。如集合{0,1}是二进制字母表。

某个字母表的串(string)是该字母表符号的有穷序列,空串是长度为0的串。

语言(language):是某个给定字符表上任意的可数的串的集合,像空集和仅包括空串的集合都是语言。

 

1.2语言上的运算

1.3 正则表达式

正则表达式可以描述所有通过对某个字母表上的符号应用这些运算符而得到的语言。比如,在这种表示法中,如果使用letter_来表示任一字母或下划线,用digit_来表示数位,那么可以用如下的正则表达式来描述对应于C语言标识符的语言:letter_(letter_|digit)*

其中竖线表示并运算,星号表示”零个或多个”括号中表达式的连接。

       每个正则表达式r表示一个语言(正则集)L(r)

        下面是正则表达式运算的例子:

 

用一个正则表达式定义的语言叫做正则集合,以下是对于任意正则表达式r、s和t都成立的代数定律。

Lex的正则表达式的扩展表示方法:

 

1.4状态转换图

作为构造词法分析器的一个中间步骤,我们首先将模式转换成具有特定风格的流图,称为状态转换图。状态转换图有一组被称为“状态”的结点或圆圈。词法分析器在扫描输入串的过程中寻找和某个模式匹配的词素,而转换图中的每个状态代表一个可能在这个过程中出现的情况。

       以下是关于状态转换图的重要约定:

(1)某些状态称为接受状态或最终状态。这些状态表面已经找到了一个词素,虽然实际的词素可能不包括lexemeBegin指针和forward指针之间的所有字符。我们用双层的圈来表示一个接受状态,并且如果改状态要执行一个动作的话——通常是向语法分析器返回一个词法单元和相关属性值——我们将把这个动作附加到该接受状态上。

(2)另外,如果需要将forward回退一个位置(即相应的词素并不包含那个在最后一步使我们到达接受状态的符号),那么我们将在该接受状态的附近加上一个*。若出现需要将forward指针回退多个位置,我们将为接受状态附加相应数目的*。

(3)有一个状态被指定为开始状态,也称初始状态,该状态由一条没有出发结点的、标号为“start“的边指明。在读入任何输入符号之前,状态转换图总是位于它的开始状态。

 

这里附上龙书上的例子:

 

识别所有与词法单元relop匹配的词素的状态转换图:

 

保留字和标识符的识别:

首先,先明确保留字和标识符具体是什么,保留字指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用,而我肤浅的把它认为它是关键字;标识符是指用来标识某个实体的一个符号,这里为了方便理解,把他当作是用户定义的变量。

 

 

我们可以使用两种方法来处理那些看起来很像标识符的保留字:

(1)初始化时就将各个保留字填入符号表中,如上图3-14就是使用了这种方式。

(2)为每个关键字建立单独的状态转换图,如下图的3-15是关键字then的例子。

 

下图为无符号数字(number)的状态转换图:

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值