返回文档首页
(一)简介
代码下载: git clone git://git.code.sf.net/p/redy/code redy-code
当我们需要识别文本时,通常分析步骤为:
- 根据文本内容的规律推导一个上下文无关文法,但最好是正则文法。
- 根据文法画出状态机。
- 把状态机转化为状态矩阵。
这一章的内容有:
- 整数,长整数的识别
(二)整数,长整数的识别
(1)整数与长整数
在Redy中整数与长整数的区别为:长整数在整数后面多加了一个后缀L或者 l。
整数总其分这么几种:
- 十进制整数
- 二进制整数:以0B或者0b开头的数,如0B10001010 , 0b0101001
- 人进制整数:以0o或者0O或者0开头的数,如0O741525463, 0o1455,0214
- 十六进制数:以0x或者0X开头的数,如0x25445fa,0Xfffa45
(2)BNF文法
longinteger ::= integer ("l" | "L") integer ::= decimalinteger | octinteger | hexinteger | bininteger decimalinteger ::= nonzerodigit digit* | "0" octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+ hexinteger ::= "0" ("x" | "X") hexdigit+ bininteger ::= "0" ("b" | "B") bindigit+ nonzerodigit ::= "1"..."9" octdigit ::= "0"..."7" bindigit ::= "0" | "1" hexdigit ::= digit | "a"..."f" | "A"..."F"
(3)状态机
其中Decimal表示十进制,Oct表示8进制,Hex表示16进制,Bin表示2进制,long表示长整数。
Dn_m表示数字n到m
(4)状态矩阵
对于整数长整数来说输入类型可以分为这么几种:
- 数字0 (D0)
- 数字1 (D1)
- 数字2到7 (D2_7)
- 数字8到9 (D8_9)
- 字母a和A (S_a)
- 字母B和b (S_b)
- 字母c到f和C到F (S_c_f)
- 长整数标志符l与L (S_l)
- 八进制前缀o和O (S_o)
- 十六进制前缀x和X (S_x)
- 除以上字符以外的类型 (other)
其中:
D0_9 包含 D0 , D1 , D2_7 , D8_9
D0_7 包含 D0 , D1 , D2_7
D1_9 包含 D1 , D2_7 , D8_9
S_a_f 包含 S_a , S_b , S_c_f
状态转化矩阵为:
状态\输入
Other
D0
D1
D2_7
D8_9
S_a
S_b
S_c_f
S_o
S_x
S_l
Begin
Prefix
Decimal
Decimal
Decimal