Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

语法分析要解决什么

复习

  • 字符怎样组成词:把字符流切成词法单元
  • 语言与文法:用规则描述语言
  • 树:用父子关系表示层次结构

TL;DR

  • 语法分析把词法单元序列组织成语法结构
  • 它要判断这串词是否符合文法
  • 还要给出结构,通常是一棵语法树
  • 同一串词,可能有不止一种结构方式

正文

  词法分析把字符切成了一个个词,比如 1+2*3。可这些词只是排成一排,还没有“结构”。把它们组织成有意义的结构,就是语法分析(syntax analysis)的任务。

两个问题

  语法分析要同时回答两个问题:

  1. 合不合法:这串词法单元,符不符合这门语言的文法?
  2. 什么结构:如果合法,它们是怎样组合起来的?

  第 2 点常常被忽略,却至关重要。看 1 + 2 * 3,它不只是五个孤立的词,而是一棵有层次的表达式树:乘法先算,再加。只有拿到这个结构,编译器才知道该先做哪一步运算,才能正确生成代码。

词是平的,结构是立体的

  词法分析产出的,是一条平铺的词序列。而语法分析要给它们加上立体的层级关系——谁包含谁、谁先谁后。

  这个“立体结构”,通常用语法树来表示:树的叶子是词,内部的节点代表“这里存在一个语法成分”,比如“一个表达式”“一个加法”。从平的序列,到立体的树,是语法分析最大的贡献。

为什么会有多种结构

  一个有意思的事实是:同一串词,可能对应不止一种结构。

  比如 1 - 2 - 3,既可以理解成 (1 - 2) - 3,也可以理解成 1 - (2 - 3)。两种结构的运算结果不同!到底按哪种,需要语言的规则提前约定(通常是“左结合”)。

  这种“一种输入、多种语法树”的情况,叫歧义,是语法分析要特别处理的麻烦。它也是后面一节的重点。

  那么,用什么工具来精确描述程序语言的语法呢?下一章引入上下文无关文法

思考题 1

  语法分析相比词法分析,多解决了什么问题?

思考题 2

  为什么同一串词法单元,可能有不同的语法结构?

小结

知识点

  • 语法分析把词序列组织成语法结构
  • 它要判断合法性并给出结构
  • 语法树表示词之间的层级关系
  • 同一串词可能存在多种结构(歧义)

参考资料

  1. Wikipedia(zh):语法分析:把词法单元组织为语法结构
  2. Wikipedia(zh):抽象语法树:程序语法结构的树形表示

思考题答案(仅供参考)

思考题 1

  词法分析只把字符切成词,产出的是平铺序列;语法分析在此之上判断这串词是否符合文法,并给出它们的层级结构(语法树),从而揭示谁包含谁、运算如何组织。

思考题 2

  因为文法规则可能允许多种组合方式。例如 1 - 2 - 3 既可以结合成 (1-2)-3,也可以结合成 1-(2-3)。若语言没有明确规定优先级或结合性,就会出现多种结构,即歧义。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪