词法分析概念
-
词素(lexeme):源程序中的字符序列,它和某类此法单元的模式匹配,被词法分析器识别为该词法单元的实列。
-
词法单元(token):包含单元名(tokenname)和可选的属性值(attribute-value)。单元名是表示某种词法单位的抽象符号。语法分析器通过单元名即可确定词法单元序列结构。
-
模式(pattern):词法单元对应的词素可能具有的形式,可以用正则表达式来表示。
语言
- 概念:
字母表: 一个有限的符号集合
串:字母表中符号组成的一个有穷序列
串s长度:|s|
空串ε,长度为0
语言:给定字母表上一个任意可数串的集合 - 串的运算:
连接:把y附加在x后,记作xy
幂运算: s^0=ε, s^1=s - 语言的运算:
L∪M={s|s∈M或s∈L}
LM={st|s∈L,t∈M}
L*=∪0~∞Li
L+=∪1~∞Li
正则表达式
正则表达式的递归构建:
- 基本部分:
1. ε是一个正则表达式,L(ε)={ε}
2. 若a为Σ上的一个符号,那么a是正则表达式,L(a)={a} - 归纳步骤:
1. 选择:®|(s),L(®|(s))=L®∪L(s);
2. 连接:®(s),L(®(s))=L®L(s);
3. 闭包:®,L(®)=(L®)*;
4. 括号:®,L(®)=L®。 - 运算优先级:* 连接 |
正则表达式的性质
- 等价性: 若两个正则表达式r和s表示同样的语言,则r=s。
- 定律:
1. 选择是可交换的:r|s=s|r
2. 选择是可结合的:r|(s|t)=(r|s)|t
3. 连接是可结合的:r(st)=(rs)t
4. 连接对选择是可分配的:r(s|t)=rs|rt
5. ε是连接的单位元:εr=rε=r
6. 闭包中含有ε:r*=(r|ε)*
7. 具有等幂性:r*=r*
词法单元的识别
词法分析器要求能够检查输入字符串。在前缀中找出和某个模式匹配的词素。
1. 首先通过正则定义来描述各种词法单元的模式
2. 定义ws(white space)——>(blank|tab|newline)+ 来消除空白。(分析器识别到这个模式时,不返回词法单元,继续识别其他模式)