一、词法分析器的作用
1.识别源文件中的 space 和注释并删除;
2.识别源文件中的 lexeme;
3.用 token 来代替源文件中的 lexeme,token 的形式为 <token-name, attribute-value>;
其中 attribute-value为可选项,例如对于常量60,token 即为 <60>,没有attribute-value,
而对于一个整型的变量,就需要有 attribute-value 来存储诸如变量类型、变量值等信息。
对于有 attribute-value 的 token,形式一般为 <token-name, ptr>,其中 ptr 为一个指针,指向存储 attribute-value 的区域。
4.生成一张 symbol table,用于存储某些 token 的 attribute-value,在 lexical analysis 以及之后的阶段都需要用到这张 symbol table。
下面这张图说明了 lexical analyzer, parser(syntax analyzer) 和 symbol table 是如何交互的。
词素与正则表达式进行匹配时还要遵循最长前缀匹配原则。
前缀相同时要遵循优先匹配原则。
三、正则表达式 -> NFA -> DFA
DFA不同于NFA的地方:
1.不能以 epsilon 作为 label
2.对于每个状态 s 和每一个 symbol a,只有一条以 s 为出发点,以 a 为 label 的边。
NFA -> DFA
RE -> NFA
1) r = s | t
2) r = s t
3) r = s *