6 月 15 日
编译原理实验报告
语法分析实验报告
(一)实验目的
通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所
提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
(二)实验要求
⑴ 选择最有代表性的语法分析方法,如算符优先法、递归子程序法和 LR
分析法
⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)
作为分析对象,并且与所选语法分析方法要比较贴切。
(三)实验原理
递归下降分析法是确定的自上而下分析法,这种分析法要求文法是 LL(1)
文法。它的基本思想是,对文法中的每个终结符编写一个函数(或子程序),每
个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。由于描述语
言的文法常常是递归定义的,因此相应的这组函数(或子程序)必然以相互递归
的方式进行调用。
(四)实验步骤
⑴ 按实习目的和要求,用 C 语言编写一个语法分析程序,同时考虑相应的数据结
构。
⑵ 调试
调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若
干错例。
⑶ 输出
对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。
⑷ 扩充
有余力的同学,可适当扩大分析对象。譬如:
① 算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、
函数调用等等。
② 除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表
达式。③加强语法检查,尽量多和确切地指出各种错误。
(四)语法分析程序的算法思想
主程序示意图如图所示:
调用 scaner 函数读下一格单词符号
调用 S 函数
结束
置初值
(五)程序框架:
#include "stdio.h"
#include "string.h"
char sym;
char str[50];
int count = 0;
void S(void);
void T(void);
void T1(void);
void error(void);
void Scaner(void);
void Scaner(){
sym = str[count++];
}
void T1(){
if(sym == ',')
{
}
Scaner();
S();
T1();
else if(sym != ')')
error();
}
void T(){
S();
T1();
}
void S(){
if(sym == 'a'||sym == '^')
Scaner();
else if(sym == '(')
{
Scaner();
T();
if(sym == ')')
Scaner();
else
error();
}
else
error();
}
void error(){
printf("Error!\n");
}
void main(){
char ch;
int i = 0;
printf("please input the string (以$结束):\n");
scanf("%c,",&ch);
while(ch != '$'){
str[i++] = ch;
scanf("%c",&ch);
}
str[i++] = '$';
str[i] = '\0';
Scaner();
S();
if (sym == '$')
printf("success!\n");
else
printf("Fail!\n");
}
六:实验抓图:
七:实验心得:
通过本次实验,不仅使我编译原理的知识更加巩固,而且可以使理论与实
践相结合,更好的掌握所学知识。我也发现自己的不足之处,以后会多加改正。