词法分析正则表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们可以用正则表达式来定义每种类型的token
2020/10/1
编译原理
10
一些RE的简写
R+
one or more strings from L(R): R(R*)
R?
optional R: (R|ε)
[abce]
one of the listed characters: (a|b|c|e)
[a-z]
else {…错误处理…}
/
l
2020/10/1
编译原理
5
状态转换图的实现(续3)
对于含回路的状态结点来说,可让它对应一个由While语句 和if语句构成的程序段
字母或数字
GetChar(); while(IsLetter() or IsDigit())
GetChar();
i
其他
…状态j的对应程序段…
a
{ ,a,a, ……任意个a的串}
(ab)
{ ,a,b,aa,ab ……所有由a 和b组成的串}
(ab)(aabb)(ab) {上所有含有两个相继的a或两个 相继的b组成的串}
2020/10/1
编译原理
9
简单的例子
正则表达式R描述的字符串的集合表示为L(R) L(R)=由R定义的“语言”
L(abc) = { abc } L(hello|goodbye) = {hello, goodbye} L(1(0|1)*) = 所有的非零二进制数
Reserve:整型函数过程,对strToken中的字符串查找保留字 表,若它是一个保留字则返回它的编码,否则返回0值。 Retract:子程序过程,将搜索指示器回调一个字符位置,将 ch置为空白字符
2020/10/1
编译原理
3
状态转换图的实现(续1)
InsertId:整型函数过程,将strToken中的标识符插 入符号表,返回符号表指针
InsertConst:整型函数过程,将strToken中的常数 插入常数表,返回常数表指针。
关于出错处理的一些说明:
如果后面还有状态图,出现在这个地方的代码应为: 将搜索指示器回退一个位置,并令下一个状态图开始 工作。
如果后面没有其他的状态图,则出现在上述位置的代 码应该进行真正的出错处理,报告源程序含有非法符 号,并进行善后处理。
one character from this range:(a|b|c|d|e|…|y|z)
[^ab]
anything but one of the listed chars
[^a-z]
one character not from this range
2020/10/1
编译原理
11
例子
正则表达式
词法分析——正则表达式
授课:胡静
空白
字母或数字
字母
0
1 非字母与数字
*
2
数字
数字
3
非数字
*
4
=
5
+
6
*
非*
*
.
7
8
.
. .
*
9
.
.,
10
(
11
)
12
其他
13
状态转换图实例
其中的假设条件是: 1.关键字都是保留字,不允许使用他们作为自己 定义的标识符 2.将关键字作为一类特殊标识符来处理。把它们 预先安排在一张表格中。 3.再次,如果关键字、标识符和常数之间没有确 定的运算符或界符做间隔,则必须至少用一个空 白符做间隔。
状态转换图的实现
ch:字符变量,存放最新读进的源程序字符 strToken:字符数组,存放构成单词符号的字符串 GetChar:子程序过程,将下一个输入字符读到ch中,搜索 指示器前移一个字符位置。
GetBC:子程序过程,检查ch中的字符是否为空白。如果 是,则调用GetChar,直至ch中进入一个非空白字符。 Concat:子程序过程,将ch中的字符连接到strToken之后。 IsLetter和IsDigit: 布尔函数过程,它们分别判断ch中的字 符是否为字母和数字。
R*
concatenation of a RE R zero or more times
(R* = ε|R|RR|RRR|RRRR…)
在实际形式中,会有优先级的限制,因此可以加入一些括号。
2020/10/1
编译原理
8
正规式的例子
令={a,b},
正规式
正规集
a
{a}
ab
{a,b}
ab
{ab}
(ab)(ab) {aa,ab,ba,bb}
a
ordinary character stands for itself
ε
the empty string
R|S either R or S (alternation), where R, S = RE
RS R followed by S (concatenation), where R, S = RE
j
2020/10/1
编译原理
6
tokens
Identifiers: x
y11 elsen _i00
Integers: 2 1000 -500
5L
Floating point: 2.0 0.00020 .02 1.1e5
Strings: “x” “He said, \“Are you?\””
Comments: /** don’t change this **/
digit = [0-9] posint = digit+ int = -? posint real = int (ε | (. posint))
= -?[0-9]+(ε | (. [0-9]+)) [a-zA-Z_][a-zA-Z0-9_]*
这种简写方式不支持递归
在L(R)中的字符串
“0” “1” “2” “3” … “8” “412” … “-42” “1024” … “-1.56” “12” “1.0”
Keywords: if else while break
Symbols: + * { } ++ < << [ ] >=
0.e-10
2020/10/1
ቤተ መጻሕፍቲ ባይዱ
编译原理
7
如何描述tokens
我们可以使用正则表达式来描述程序设计语言中的tokens
正则表达式(RE, Regular Expression)的定义如下:
2020/10/1
编译原理
4
状态转换图的实现(续2)
对于不含回路的分叉结点来说,可让它对应一个switch语 句,或一组if…then…else语句
字母
GetChar()
j
if(IsLetter()){…状态j的对应程序段…}
数字
i
else if (IsDigit()) {…状态k的对应程序段…} k else if (ch == ‘/’) {…状态l的对应程序段…}
相关文档
最新文档