目标词法 *实数是科学计数法的前缀
我们要实现的最终目标:识别字符串 $s$ 中符合某种词法单元模式的所有词素
直接实现这个目标非常复杂,因此我们首先要将实现拆分为若干步:
第一步: 识别字符串 $s$ 中符合特定词法单元模式的前缀词素。
接下来,用分支判断词法单元分类,进入相应前缀词素匹配流程,组合第一步的结果:
第二步: 识别字符串 $s$ 中符合某种词法单元模式的前缀词素。
如果针对每一个词法单元都可以解答,我们就可以解答任意词法单元;
通过循环处理,每一次迭代返回当前识别的词法单元与词素,继续识别下一个前缀词素。
最终:识别字符串 $s$ 中符合某种词法单元模式的所有词素
首先我们将词素分成从易到难的三类
$\rm ws~if~else~id~int$
Lookahead 1 char
$\rm rel~op$
Lookahead 2 chars
$\rm real~sci$
Lookahead $k$ chars. 在循环中持续匹配,直到可以判断
空白符
标识符
整数
识别字符串 $s$ 中符合某种词法单元模式的前缀词素。
合并三个 FA 中的状态 22, 12, 9 (初始状态),根据下一个字符即可判断词法单元的类型;否则, 调用错误处理模块 (对应 other), 报告该字符有误, 并忽略该字符。
<aside> 💡 Recognition of Reserved Words
There are two approaches to handling reserved words:
getToken
function checks the symbol table entry for the found lexeme and returns the token name indicated by the symbol table.