实验二: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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值