把文法规约转成分析程序

开发者可以直接编写分析器,也可以把产生式交给生成工具。工具按所选算法计算预测信息或状态转换,再输出供运行时使用的分析表和代码,减少逐条手写决策的工作。

Cornell课程以LL预测表和LR动作、转移表说明这些计算,并把yacc、Bison与CUP列为使用LR相关技术的生成器。不同工具和配置支持的文法类别并不完全相同。

参考:[1] [2]

识别结构以后还要构造结果

分析过程完成一条产生式时,可以执行相应动作,例如建立AST节点,把子表达式组合成更大的表达式。记号携带的名称、数值和位置等资料,也需按接口传给这些动作。

生成器自动化的是符合其算法约束的结构处理,不会自动知道语言中每个名字代表什么、某个类型是否合法或业务动作应产生什么结果。后续语义检查与代码生成仍有各自职责。

参考:[1] [3] [4]

生成成功也需理解冲突规则

规则在某个状态下给出多种动作时,工具可能报告冲突。原因可能是文法歧义,也可能是所用分析方法不能区分相关上下文;不能见到冲突就认定语言本身无法定义。

优先级和结合性声明能排除某些不希望的解析,但也可能使错误设计被安静接受。验收时应核对代表性输入的结构和错误处理,而不只看工具有没有生成一个可编译文件。

参考:[2] [5]