下面文章从C++词法分析的角度出发,其实语言是一个句子的集合,而句子是由词法分析器返回的记号组成的非线性结构,C++语法分析的任务是在词法分析基础上,根据语言的语法规则,把词法符号分解成各类语法单位。
反映句子结构的***方法是树,常用的有分析树和语法树。分析语法结构的基本方法有两种:自上而下分析方法和自下而上分析方法。自上而下分析从根到叶子建立分析树,而自下而上分析恰好相反。在这两种情况下,分析器都是从左到右地扫描输入,每次读进一个记号。与C++词法分析类似,语法分析也具有双重含义:
①规定句子形成的规则,也被称为语法规则。程序设计语言的大部分语法规则可以用上下文无关文法(ContextFreeGrammar,简称CFG)来描述。
②根据语法规则识别记号流中的评议结构,也被称为语法分析。最有效的自上而下和自下而上的分析方法都只能处理上下文无关文法的子类,如LL文法和LR方法,但是它们已足以应付程序设计评议的绝大多数语法现象。
一、任务与目的
1、使用C/C++程序设计语言和递归下降子程序的方法编写该函数绘图语言的C++词法分析器。并要求设计一个语法分析器的测试小程序来调用自己编写的语法分析器测试各种不同的输入。
2、语法分析的任务是在C++词法分析基础上,根据语言的语法规则,把词法符号分解成各类语法单位。语法分析所依据的是语言的语法规则,语法规则通常用上下文无关文法描述。#t#
通过自己动手编写语法分析器,掌握正规式与正规文法、上下文无关文法(CFG)、有推导的基本概念(推导、分析树与语法树、二义性及二义性的消除)、自上而下分析(递归下降子程序方法、预测分析表方法、LL(1)文法)、自下而上分析。理解如何理论联系实际以及明白理论与实际的差别。
二、分析与设计
语法分析程序一般具有如下功能:对单词符号串进行语法分析(根据语义规则进行推导和规约),识别出程序中的各类语法单位,最终判断输入串是否构成语法上正确的“程序”。
这里我们采用递归下降分析方法:直接以程序的方式模拟产生式产生语言的过程。它的基本设计思想是:为每一个非终结符构造一个子程序,每一个子程序的过程体中按该产生式的候选项分情况展开,遇到终结符直接匹配,而遇到非终结符就调用相应非终结符的子程序。
该分析从调用文法开始符号的子程序开始,直到所有非终结符都展开为终结符并得到匹配为止。若分析过程中达到这一步则表明分析成功,否则表明输入中有语法错误。递归下降分析对文法的限制是不能有公共左因子和左递归。由于文法是递归定义的,因此子程序也是递归的。
对于规模比较小的语言,递归下降子程序方法是很有效的方法,它简单灵活,容易构造,其缺点是程序与文法直接相关,对文法的任何改变均需对程序进行相应的修改。
这里给出C++词法分析程序大概的设计方法:
1、根据要求写出语法分析的上下文无关文法G;
2、消除上下文无关文法G的二义性;
3、消除上下文无关文法G的(直接)左递归,并提取左因子;
4、构造文法的状态转换图并且简化;
5、将转换图转化为EBNF表示;
6、从EBNF构造递归下降子程序;
以下是较为详细的设计:
总体结构与模块划分
语法测试模块(parsermain.cpp)
|