语 言 单 词 符 号 的 两 种 定 义方式
目前,多数程序设计语言的单词符号都能用正规文法(左线性文法或右线性文法)或正规式来定义。
例如,高级程序设计语言中“标识符”这个单词符号,其单词结构是一个以字母开头的字母数字串,那么定义“标识符”单词符号的左线性文法为
<标识符> → l | <标识符> l | <标识符> d
或右线性文法为
<标识符> → l | l <字母数字>
<字母数字> → l | d | l <字母数字> | d <字母数字>
其中,
l 代表 a ~ z 中任一英文字母。
d 代表 0~9 中任一数字。
“标识符”单词也可用正规式:字母(字母 | 数字)* 定义;或者用 l 代表字母,d 代表数字,则“标识符”单词可用正规式 l (l | d )*来定义。
这两种定义方式各有不同的特点,用正规式定义简洁清晰,而用正规文法来定义则易于识别。
3.3.1 正规式与正规集
正规文法在第 2 章已经介绍过,在此给出正规式和正规集的递归定义。
设有字母表 Σ = {a 1 , a 2 ,…, a n },在字母表 Σ 上的正规式和它所表示的正规集可用如下规则来定义:
(1 ) Ø 是 Σ 上的正规式,它所表示的正规集是 Ø ,即空集{}。
(2 ) ε 是 Σ 上的正规式,它所表示的正规集仅含一空符号串,即{ ε }。
(3 ) a i 是 Σ 上的一个正规式,它所表示的正规集是由单个符号 a i 所组成,即{ a i }。
(4 )如果 e 1 和 e 2 是 Σ 上的正规式,它们所表示的正规集分别为 L ( e 1 )和 L ( e 2 ),则
① e 1 | e 2 是 Σ 上的一个正规式,它所表示的正规集为 L ( e 1 | e 2 ) = L ( e 1 ) ∪ L ( e 2 )。
② e 1 e 2 也是 Σ 上的一个正规式,它所表示的正规集为 L ( e 1 e 2 ) = L ( e 1 ) L ( e 2 )。
③ ( e 1 )*也是 Σ 上的一个正规式,它所表示的正规集为 L ((e 1)
- ) = L ((e 1 ))* 。
正规式中包含 3 种运算符:连接“·”、或“| ”和闭包“* ”。其中闭包运算的优先级