(图 cr:王挺-国防科学技术大学-计算机学院 计算机科学与技术系 )
lex源程序分为辅助定义(AUXILIARY DEFINITION)和识别规则(RECOGNITION RULES)两个部分。
辅助定义(AUXILIARY DEFINITION):用文法的形式定义一些语法单位。
例
把字母定义为letter,0~9定义为digit:
AUXILIARY DEFINITION
letter->A|B|…|Z
digit->0|1|…|9
这些AB既可以看成是字符、也可以是字、还可以是正规式。
这是最基本的正规式。
识别规则(RECOGNITION RULES):对应程序员单词的识别规则。
正规式+正规式所对应的单词的种别编码+自身的值,
RECOGNITION RULES
1 DIM {RETURN(1,-)}
2 IF {RETURN(2,-)}
3 DO {RETURN(3,-)}
4 STOP {RETURN(4,-)}
5 END {RETURN(5,-)}
6 letter(letter|digit)* {RETURN(6,TOKEN)}
7 digit(digit)* {RETURN(7,DTB)}
8 = {RETURN(8,-)}
9 + {RETURN(9,-)}
10 * {RETURN(10,-)}
11 ** {RETURN(11,-)}
12 , {RETURN(12,-)}
13 ( {RETURN(13,-)}
14 ) {RETURN(14,-)}
letter(letter|digit) :这条正规式识别的是以字母开头的字母数字串。
TOKEN:代表单词自身的字符串。
:识别标识符。
digit(digit)* :识别数字串。
DTB:子程序。
:调用DTB子程序,将数字串转变为二进制常数。
每一条规则都是正规式,正规式所对应的单词的种别编码都写在对应的后面,用括号括起来。
lex程序核心:正规式+所对应的动作
LEX的工作过程:
首先,对每条识别规则Pi 构造一个相应的非确定有限自动机Mi ;
然后,引进一个新初态X,通过ε弧,将这些自动机连接成一个新的NFA;
最后,把M确定化、最小化,生成该DFA的状态转换表和控制执行程序。