标识符转移图(变量)
标识符的转移图
记号流:编译器内部定义的数据结构,编码所识别出的词法单元
Token 记号
nextToken() 读取标识符或者关键字
getChar()读取一个字符
输入原代码到词法分析器返回记号流:
步骤从0开始对应表中操作,假设记号表中已经记录了id这个标识符
一: 假设读取第一个 字符为i
0.第一步 I/O 读取一个字符例如 此字符必须要符合 标识符的定义 例如:(a-zA-Z 0-9 _)等标识符定义 符合后开始第二步操作
二: 假设读取第二个 字符为 d
- 第二部读取第二个字符 是否符合标识符(a-zA-Z 0-9 _)定义 符合和第一个字符拼接,对比符号表判断是否有此标识符定义(变量定义),如果有则第二步,如果没有则继续调用(图中1步)读取字符 重复1步操作
2.返回记号
从记号流中读取标识符流程并识别关键字:
与此同时我们还需要识别关键字 以if为例
上面还是我们之前识别标识符的转移图
下面是能识别标识符和if关键字的转移图
读取字符为 "i" 但是不符合1的条件[a-h j-z A-Z_],则直接到3的流程 存储好此字符,并读取下一个字符如果符合4的条件[f] 那么还需要读取一个字符判断是否为分隔符(例如 ifconfig 这种) 分隔符不一定只有一种有的是 ‘(’ 有的是 ’ ’ 空格符合后则是关键字还需要对比关键字表 ,否则还是跳转到1流程,判断是否为记号流
其他关键字也如此
关键字表算法:
哈希表和完美哈希介绍:
LINK: http://www.cnblogs.com/gaochundong/p/hashtable_and_perfect_hashing.html