本篇笔记是我对龙书第2.3-2.5节内容的理解,主要介绍编译器前端关于语法分析的众多基础概念。下篇笔记将根据本篇笔记的主要内容,实现一个针对简单表达式的后缀式语法翻译器Demo(原书中是java实例,我给出的将是逻辑一致的Python版本的实现)。
1. 语法分析(Syntax Analysis)简单来说,语法分析的任务是分析输入的符号字符串(string of symbols, 通常是词法分析产生的tokens)是否遵循某种语言在其上下文无关文法(context-free grammar)中给出的规则,其中,规则由一系列产生式(production)给出。
如果分析成功,则它会构造出程序的抽象语法树(Abstract syntax tree);否则它会抛出类似于"syntax error"的错误提示。
完成语法分析的程序在术语上被称为Parser,其任务是判决输入的token streams是否可以由该语言的文法的开始符号推导出来以及如何推导。
原则上parser必须具备为输入串构造出语法分析树的能力(虽然事实上,编译器在实现语法分析时是不会真正去构造完整的语法分析树的,它会构造更简洁的抽象语法树)。
Paser有两类常见实现方式:
1) top-down parsing
自顶向下类型的parser从根节点开始构造语法分析树,逐步向叶子节点方向进行。这种方法可以较容易地手工构造出高效的语法分析器。
与此类parser相关的常见术语有inherited attributes和LL parser。
2) bottom-up parsing
自底向上的方法从叶子节点开始,逐步构造出根节点。这种方法可以处理更多种文法和翻译计划,故直接从文法生成语法分析器的软件工具通常采用bottom-up的方法。
与此类parser相关的常见术语有synthesized attributes和