天天看点

java实现语法分析器_语法分析 | 语法分析的任务

在之前,我们有对编译器做过一定的介绍,我们认为编译器是具有一定流水线结构的软件系统。它可以分为前端,中端和后端这样的不同的阶段。

java实现语法分析器_语法分析 | 语法分析的任务

编译器前端

对于我们正在研究的前端,我们已经通过词法分析的学习掌握了从将源程序转化为记号流的过程。

对于之后的语法分析器阶段,我们在编译器设计的早期,只实现了分析源程序是否合法,如果不合法就返回程序的出错信息给程序员,退出源程序的编译过程。程序员对代码进行修改后就重启该编译过程,重新进行词法分析和语法分析...。在后期的编译器设计过程中,我们的语法分析过程就通常需要生成一个抽象语法树的中间表示。该语法书输出到后续阶段,用于语义分析器或者代码生成器进行进一步的处理。这样的新设计使语法分析器能够更加专注于自己的任务,将语义检测和代码生成的任务交给后续阶段再来进行处理。

语法分析器是前端比较核心的模块,负责处理程序员输入的程序,产生编译器后端需要使用的第一个非常核心的数据结构——抽象语法树。

单独提出语法分析器的模块如下,输入是记号流,输出是语法书。

java实现语法分析器_语法分析 | 语法分析的任务

语法分析器是以语言的语法规则为准则对从记号流输入的语法进行分析的。

举个语法错误处理的例子:

java实现语法分析器_语法分析 | 语法分析的任务

对于上面的程序,如果进行语法分析,可以得到如下的语法错误:

java实现语法分析器_语法分析 | 语法分析的任务
  • 第一行缺少右圆括号,
  • 第二行缺少分号
  • 第四行,得到了一个逗号而不是期待得到的分号

在举一个语法书的构建的例子

如果程序员根据上面得到的反馈信息对源代码进行修改,使其能够得到一个可以通过语法分析器的代码,该代码显示如下:

java实现语法分析器_语法分析 | 语法分析的任务

语法分析会接着对语法分析通过的代码存入内存,由于对如此显示的字符串的存储后续的处理会过于麻烦,所以我们需要对其构造一定的数据结构,我们通常选用语法树的数据结构。语法树显示如下:

java实现语法分析器_语法分析 | 语法分析的任务

对这样的一个代码分析完成后,我们返回的是该树的根节点的指针。

语法分析是编译器中第一个做切分的阶段,将程序员所写的字符串变化到相应的树状结构上。

语法分析的路线图

  • 数学理论:上下文无关文法(CFG)
    • 描述语言语法规则的数学工具
  • 自顶向下分析
    • 递归下降分析算法(预测分析算法)
    • LL 分析算法
  • 自底向上分析
    • LR 分析算法

原文链接:

  • 编译原理 - 网易云课堂