语法分析 1

程序设计语言构造的语法可以使用 上下文无关文法 或者 BNF (巴库斯-瑙尔范式) 表示法来描述,文法为语言设计者和编译器编写者提供了很大便利:

  • 文法给出了一个程序设计语言的精确易懂的语法归约
  • 对于某些类型的文法,我们可以自动构造出高效的语法分析器,它能够确定一个源程序的语法结构。同时,语法分析器的构造过程可以揭示出语法的二义性,同时还可能发现一些容易在语言的初始设计阶段被忽略的问题
  • 一个正确设计的文法给出了一个语言的结构,该结构有助于把源程序翻译为正确的目标代码,也有助于检测错误
  • 一个文法支持逐步加入可以完成新任务的新语言构造,从而迭代地演化和开发程序语言。如果对语言的实现遵循语言的文法结构,那么在实现中加入这些新构造的工作就会变得更加容易

语法分析器从词法分析器获得一个词法单元组成的串,并验证这个串可以由源语言的文法生成,我们期望语法分析器能够以易于理解的方式报告语法错误,并能够从常见的错误中恢复并继续处理程序的其余部分。从概念上来说,对于良构的程序,语法分析器构造出一棵 语法分析树,并把它传递给编译器的其他部分进一步处理。我们并不需要显式地构造出语法分析树,对于源程序的检查和翻译工作可以和语法分析过程交替完成,因此语法分析器和其他部分可以用一个模块实现。

词法分析 2

如果一个 NFA 状态有一个标号非 \(\varepsilon\) 的离开转换,那么我们称这个状态为 重要状态 (important state)。子集构造法在计算 \(\varepsilon-closure(move(T,a))\) 的时候,它只使用了集合T中的重要状态,也就是说只有当状态s是重要的,状态集合 \(move(s,a)\) 才可能是非空的。在子集构造法的应用过程中,两个NFA状态集合可以被认为是一致的条件是

词法分析 1

词法分析是编译器的第一阶段,主要负责读取源程序的输入字符,将它们组成 词素,生成并输出一个词法单元序列,每个词法单元对应一个词素,这个词法单元序列将被语法分析器进行语法分析。除此之外,词法分析器还会过滤源程序中的注释和空白,生成错误信息与源程序的位置关联起来,有时还会进行宏扩展。