编译原理实验四 C-语言 语法分析程序

实验四 语法分析程序
(一)学习经典的语法分析器(1学时)
一、实验目的
学习已有编译器的经典语法分析源程序。
二、实验任务
阅读已有编译器的经典语法分析源程序,并测试语法分析器的输出。
三、实验内容
(1)选择一个编译器,如:TINY,其它编译器也可(需自备源代码)。
(2)阅读语法分析源程序,加上你自己的理解。尤其要求对相关函数与重要变量的作用与功能进行稍微详细的描述。若能加上学习心得则更好。TINY语言请参考《编译原理及实践》第3.7节。对TINY语言要特别注意抽象语法树的定义与应用。
(3)测试语法分析器。对TINY语言要求输出测试程序的字符形式的抽象语法树。(手工或编程)画出图形形式的抽象语法树。
TINY语言:
测试用例一:sample.tny。

(二)实现一门语言的语法分析器(3学时)
一、实验目的
通过本次实验,加深对语法分析的理解,学会编制语法分析器。
二、实验任务
用C或C++语言编写一门语言的语法分析器。
三、实验内容
(1)语言确定:C-语言,其定义在《编译原理及实践》附录A中。也可选择其它语言,不过要有该语言的详细定义(可仿照C-语言)。一旦选定,不能更改,因为要在以后继续实现编译器的其它部分。鼓励自己定义一门语言。也可选择TINY语言,但需要使用与TINY现有语法分析代码不同的分析算法实现,并在实验报告中写清原理。
(2)完成C-语言的BNF文法到EBNF文法的转换。通过这一转换,消除左递归,提取左公因子,将文法改写为LL(1)文法,以适用于自顶向下的语法分析。规划需要将哪些非终结符写成递归下降函数。
(3)为每一个将要写成递归下降函数的非终结符,如:变量声明、函数声明、语句序列、语句、表达式等,定义其抽象语法子树的形式结构,然后定义C-语言的语法树的数据结构。
(4)仿照前面学习的语法分析器,编写选定语言的语法分析器。可以自行选择使用递归下降、LL(0)、LR(0)、SLR、LR(1)中的任意一种方法实现。
(5)准备2~3个测试用例,测试并解释程序的运行结果。

实验过程

学习tiny语言的语法分析器

TINY有两种基本的结构类型:语句和表达式。语句共有5类:(if语句、repeat语句、assign语句、read语句和read语句),表达式共有3类(算符标的是、常量表达式和标识符表达式)。因此,语法树节点首先安装它是语句还是表达式来进行分类,接着根据语句或表达式的种类进行再次分类。
树节点最大可有3个孩子的结构(仅在带有else部分的if
语句才用到)。语句通过同属域而不是子域来排序,即由父亲到他的孩子的唯一物理连接是到最左孩子的。孩子则在一个标准连接表中自左向右连接到一起,这种连接称作同属连接,用于区别父子连接。

设计流程:

  1. 创建一个树节点的结构体

  2. 使用递归下降算法,将每一个文法产生式转变成递归函数中的一个子句

  3. 用前看符号指导产生式规则的选择

  4. 创建一个match函数,对前看符号进行匹配,如果不匹配,调用syntaxError函数对错误语法进行报错。

  5. 创一个printTree函数,将一个语法树打印出来。

实现C-语言的语法分析器

  1. 完成C-语言的BNF文法到EBNF文法的转换。通过这一转换,消除左递归,提取左公因子,将文法改写为LL(1)文法,以适用于自顶向下的语法分析。规划需要将哪些非终结符写成递归下降函数。

C-语言BNF语法:

EBNF语法:
a) program→declaration-list
b) declaration_list → declaration{ declaration }
c) declaration→var-declaration|fun-declaration
d) var_declaration →type-specifier ID; | type-specifier ID [NUM];
e) type - specifier → int | void
f) fun-declatation→type-specifier ID (params) compound-stmt
g) params→param_list | void
h) param_list→param{, param}
i) param→ type-specifier ID{[ ]}
j) compound-stmt→{ local-declaration statement-list}
k) local-declarations → empty {var- declaration}
l) statement-list→{statement}
m) statement→expression-stmt | compound-stmt | selection-stmt | iteration-stmt | return-stmt
n) expression-stmt→ [expression];
o) selection-stmt→if (expression) statement [else statement]
p) iteration-stmt→while (expression)statement
q) return-stmt→return [expression];
r) expression→ var = expression | simple-expression
s) relop → < = | < | > | > = | = = | ! =
t) var→ID | ID [expression]
u) simple-expression>additive-expression{ relop additive-expression }
v) additive-expression→term{addop term }
w) addop → + | -
x) term→factor{mulop factor }
y) mulop →* | /
z) factor→(expression) | var | call | NUM
aa) call→ID( args )
bb) args→arg-list | empty
cc) arg-list→ expression{, expression}
2. 创建一个树节点,treeNode定义 包括子节点、兄弟节点、所处行号、节点类型、属性、表达式返回类型
3. 定义各类所需的数据类型,有些数据类型在词法分析器中已经完成,可以直接使用。
4. 使用递归下降算法,将每一个文法产生式转变成递归函数中的一个子句

  1. 创建一个match函数,对前看符号进行匹配,如果不匹配,调用syntaxError函数对错误语法进行报错。
  2. 创一个printTree函数,将一个语法树打印出来。
  3. 其他一些非主要函数,继承了上次词法分析器的代码。如字符读取等。而且整个实验是建立在词法分析得基础上的。词法分析的结果对于语法分析是必不可少的

实验结果:

编译原理实验四 C-语言 语法分析程序_第1张图片

C-语言:

测试样例一:
编译原理实验四 C-语言 语法分析程序_第2张图片
测试结果:

编译原理实验四 C-语言 语法分析程序_第3张图片

源码太长了,就不贴上来了。大家需要的可以去下载。
C-语言语法分析程序

你可能感兴趣的:(编译原理)