词法分析的核心在于,将文法转换为NFA再转换为DFA,根据DFA识别出单词的种别码。
下面给出RL/0文法的词汇表:
1.基本字:
begin, call, const, do, end,if, odd, procedure, read,then, var, while, write
对应的种别码:
beginsym, callsym, constsym, dosym, endsym,ifsym, oddsym, proceduresym, readsym,thensym, varsym, whilesym, writesym
2.标识符对应的种别码:ident
3.常数对应的种别码:number
4.运算符:
+, -, *, /, odd,=, <>, <, <=, >, >=, :=
对应的种别码:
plus, minus, times, slash,oddsym,eql, neq, lss, leq, gtr, geq,becomes
5.界符
( ) , ;.
对应的种别码:
Lapren,raplen,comma,semicolon,period
下面是简易的定义,注重过程,不在具体问题上纠结。
标识符对应的正规式为:(a|…|z)星(0|…|9)星 (暂时不考虑下划线)
而常数对应的正规式为:(1|…|9)(0|…|9)* (只考虑无符号的整数)
可以画出NFA
由于很接近dfa,直接给出状态转换表:
据此可以完成编码。
词法分析流程图:
词法分析程序: