3 语法分析
语法分析项目代码见github: wrm244/SyntaxAnalysis
语法分析的目的
语法分析程序以单词串作为分析对象,根据描述该语言的文法,分析源程序的语法结构,检查输出的单词序列是否符合该语言的文法,并分析组成此语句的语法成分,若有错误,则输出对应的错误信息;反之,则继续执行分析,直至该程序结束。
实验要求
加深对语法分析工作过程的理解;强化对语法分析方法的掌握;基于词法分析程序,能够采用C/C++或Java编程语言实现PL/0编译程序的语法分析程序,并使用自己编写的程序对PL/0编程语言程序段进行语法分析。
实验分析
语法分析的过程
语法分析的作用是识别由词法分析给出的单词符号串是否是给定文法的正确句子(程序)。PL/0语言语法可用EBNF形式描述:
语法分析常用的程序设计方法可分为自顶向下分析和自底向上分析两类。其中,自顶向下分析包括预测分析法和递归下降分析法,自底向上分析包括LR分析法和算符优先分析法。此章节采用了自顶向下的递归下降分析方法来进行语法分析。所谓的自顶向下的语法分析,就是对已经给出的符号串,为其自上而下的构造一棵语法树。
采用递归下降分析
递归下降分析(Recursive Descent Parse)是直接以程序的方式模拟产生式产生语言的过程,它的基本思想是:为每个非终结符构造一个函数,每个函数的函数体按非终结符的候选式分情况展开,遇到终结符就进行比较,看是否与输入符号串匹配;遇到非终结符就调用该非终结符对应的函数。分析过程从调用文法开始符号对应的函数开始,直到所有非终结符都展开为终结符并得到匹配为止。如果分析过程中达到这一步则表明分析成功,否则表明输入符号串有语法错误。由于文法是递归定义的,因此函数也是递归的。如下图所示,递归下降分析器的输入是词法分析输出的token串,通过分析检查输入的token串是否符合文法要求,输出语法树和错误信息。
代码实现
语法分析部分在词法分析Java的基础上,封装成LexicalAnalysisImpl词法分析实现类,接口来自LexicalAnalysis;同时把词法分析判断字符串类型方法同样封装成IsStringImpl判断字符串实现类,接口来自IsString。在经过算法分析递归下降方法,给出SyntaxAnalysisImpl语法分析实现类,接口来自SyntaxAnalysis。
实验结果
const a := 10;
var b, c d;
//单行注释
/*
* 多行注释
*/
procedure procedure fun1;
if a <= 10
begin
c = b + a
end;
begin
read(b;
while b # 0
begin
call fun1;
write 2 * c);
read(b);
end;
end.
(语法错误,行号:1)
(语法错误,行号:2)
(语法错误,行号:10)
(语法错误,行号:11)
(语法错误,行号:13)
(语法错误,行号:16)
(语法错误,行号:17)
(语法错误,行号:20)