对于程序语言, 个人的感受是, 对词素并没有一个固定的边界定义, 如果词法分析阶段做的事少一点, 那么语法分析阶段做的事就要多一点, 考虑到语法分析要远比词法分析复杂, 所以后者应当为前者服务, 以尽可能减轻语法分析的复杂度...一个词法分析器由多个分词策略组成, 这些分词策略具有不同的优先级, 可采用一个排序树的结构来存放.
----
语法分析
词法分析是将词素序列转为抽象语法树(Abstract syntax tree)的过程...经过语法分析阶段, 对于给定的一个正则表达式, 可以得到其对应的抽象语法树(Abstract Syntax Tree), 而语义分析阶段要做的, 就是对这棵树进行遍历分析, 以达成相应目的....Follow集均等同父节点
语义分析的编码实现
一个 AST 树, 可能会经历多种处理, 比如 计算 First 集、Follow 集、生成 NFA....从表达的语义来看,DFA 与 NFA 并没有差别,如上例的 NFA 的转换:
其对应的 DFA 转换:
事实上, 两者都表达了 "起点处输入a可能到达1或2".