实验二:CMM语言词法分析

笔记
(一)、扫描处理
最主要的是正则表达式( regular expression)和有穷自动机( finite automata)。
扫描程序的任务是从源代码中读取字符并形成由编译器的以后部分(通常是分析程序)处
理的逻辑单元。
由记号表示的字符串有时称作它的串值( string value)或它的词义( l e x e m e)。
任何与记号相关的值都是记号的属性( a t t r i b u t e),而串值就是属性的示例。
由于扫描程序必须计算每一个记号的若干属性,所以将所有的属性收集到一个单独构造的
数据类型中是很有用的,这种数据类型称作记号记录(token record)。可在C中将这样的记录
说明为:
typedef struct
{ TokenType tokenval;
char * stringval;
int numval;
} TokenRecord;
(以上假设只有标识符需要串值属性,只有数字需要数值属性)。
实际上,扫描程序是在分析程序的控制下进行操作的,它通过函数从输入中返回有关命令的下一个记号,该函数有与C说明相似的说明:
TokenType getToken( void );
这个方式中声明的g e t T o k e n函数在调用时从输入中返回下一个记号,并计算诸如记号串值这
样的附加属性。输入字符串通常并不给这个函数提供参数,但参数却被保存在缓冲区中或由系
统输入设备提供。

(二)、正则表达式
1、基本正则表达式
它们是字母表中的单个字符且自身匹配。假设 a是字母表å中的任一字符,则指定正则表达式a 通过书写L (a) = {a}来匹配a字符。而特殊情况还要用到另外两个字符。有时需要指出空串( empty string)的匹配,空串就是不包含任何字符的串。空串用 ( e p s i l o n )来表示,元符号 (黑体 )是通过设定L( ) = { }来定义的。偶尔还需要写出一个与任何串都不匹配的符号,它的语言为空集( empty set),写作{ }。我们用符号 来表示,并写作L ( ) = {}。
请注意{ }和{ }的区别: { }集不包括任何串,而{ }则包含一个没有任何字符的串。
2、正则表达式运算
在正则表达式中有3种基本运算:① 从各选择对象中选择,用元字符|(竖线)表示。②连结,由并置表示(不用元字符)。③重复或“闭包”,由元字符*表示。④一个或多个重复。⑤任意字符。⑥字符范围。⑦不在给定集合中的任意字符。⑧可选的子表达式
(1)、从各选择对象中选择
如果r 和s 是正则表达式,那么正则表达式r | s 可匹配被r 或s 匹配的任意串。
(2)、连结
正则表达式r 和正则表达式s 的连结可写作r s,它匹配两串连结的任何一个串,其中第1个匹配r,第2个匹配s。
(3)、重复
正则表达式r * 匹配串的任意有穷连结,每个连结均匹配r。例如a *匹配串 、 a、a a、 a aa …(它与 匹配是因为 是与a匹配的非串连结)。
(4)、一个或多个重复
r +表明r 的一个或多个重复。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C_minus语言词法分析实验原理是基于自动机的词法分析方法。该方法将输入的字符进行逐个扫描,通过有限状态自动机(DFA)的匹配方式,将字符流转化成一系列的词法符号,即具有特定含义的单词或符号。 该词法分析器包括以下几个主要部分: 1. 输入缓冲区:该部分用于将输入的字符缓存起来,方便后续的词法分析。 2. 有限状态自动机(DFA):该部分将输入的字符逐个进行状态转移匹配,直到确定匹配的词法符号。 3. 符号表:该部分用于存储所有程序中出现的标识符和常量等信息,并为后续的语法分析提供查询和修改支持。 4. 错误处理:该部分用于识别并处理程序中可能存在的词法错误,如输入了不合法的字符或有拼写错误的标识符等。 在运行该词法分析器时,输入的程序将被读入输入缓冲区中,并逐字符进行扫描。每扫描一个字符,该字符将被送入有限状态自动机中进行匹配和转移处理。如果当前字符匹配失败,则说明该字符不属于任何已知的词法符号,该字符将被当作是一个识别错误并拒绝。如果当前字符匹配成功,则可能出现以下情况之一: 1. 匹配成功的字符可以构成一个完整的词法符号,该符号将被送入符号表中进行记录和分类,然后继续扫描下一字符。 2. 匹配成功的字符还不能构成完整的词法符号,说明该字符还需要继续扫描后面的字符才能确定其最终分类。该字符将继续在下一个状态中进行匹配,并将后续匹配得到的字符与当前字符一起构成一个完整的词法符号。 通过以上的词法分析,将完成语言程序中所有词法符号的分类和记录工作,并可以将具有特定含义和作用的词法符号作为输入送入下一个环节——语法分析中进行进一步的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值