编译原理上机报告
名 称: 编写递归下降语法分析器
学 院: 信息与控制工程学院
专 业: 计算机科学与技术
班 级: 计算机1401班
姓 名: 叶达成 年 月
一、上机目的
通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标:
1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。
2、掌握词法分析的实现方法。
3、上机调试编出的词法分析程序。
二、基本原理和上机步骤
递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。
递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。
每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。
自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。
无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。
无左递归:既没有直接左递归,也没有间接左递归。
无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。
如果一个文法不含回路(形如P⇒+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。
三、上机结果
测试数据:
(1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#
(2)输出结果:i+i*i#为合法符号串
(3)输入一符号串如i+i*#,要求输出为“非法的符号串”。
程序清单:
#include
#include
char str[50];
int index=0;
void E();
void X();
void T();
void Y();
void F();
int main()
{
int len;
int m; /*递归分析*/ //E->TX; //X->+TX | e //T->FY //Y->*FY | e //F->(E) | i
printf("请输入要测试的次数:");
scanf("%d",&m);
while(m--)
{
}
void E()
{
{
if(str[index]=='+')
{
} }
void T()
{
{
} }
void F()
{
if(str[index]=='i')
{
{
index++; E(); if(str[index]==')') { { printf("\n非法的符号串!\n"); index++; }else index++; } else if (str[index]=='(') F(); Y(); } if(str[index]=='*') { index++; F(); Y(); void Y() index++; T(); X(); T(); X();} void X() printf("请输入字符串(长度):\n"); scanf("%s",str); len=strlen(str); //str[len]='#'; str[len+1]='\0'; E(); printf("%s为合法符号串!\n",str); strcpy(str,""); index=0; } return 0;
else
{
}
} } exit (0); } printf("非法的符号串!\n"); exit(0);
屏幕截图:
四、讨论与分析
通过本次实验对递归下降词法分析器的结构,过程有了更进一步的了解,通过学习书本和试验原理书上的内容,对它的工作原理,具体实行步骤有了进一步的掌握,由于本次试验是测试性试验,所以要求输出的结果是成功与否,输入一个句型,进过分析,判断它是否合法,主要内容在于其判断过程中。本次试验不光提高了自己的编程能力,同时提高了对递归下降的了解。
编译原理上机报告
名 称: 编写递归下降语法分析器
学 院: 信息与控制工程学院
专 业: 计算机科学与技术
班 级: 计算机1401班
姓 名: 叶达成 年 月
一、上机目的
通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标:
1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。
2、掌握词法分析的实现方法。
3、上机调试编出的词法分析程序。
二、基本原理和上机步骤
递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。
递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。
每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。
自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。
无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。
无左递归:既没有直接左递归,也没有间接左递归。
无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。
如果一个文法不含回路(形如P⇒+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。
三、上机结果
测试数据:
(1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#
(2)输出结果:i+i*i#为合法符号串
(3)输入一符号串如i+i*#,要求输出为“非法的符号串”。
程序清单:
#include
#include
char str[50];
int index=0;
void E();
void X();
void T();
void Y();
void F();
int main()
{
int len;
int m; /*递归分析*/ //E->TX; //X->+TX | e //T->FY //Y->*FY | e //F->(E) | i
printf("请输入要测试的次数:");
scanf("%d",&m);
while(m--)
{
}
void E()
{
{
if(str[index]=='+')
{
} }
void T()
{
{
} }
void F()
{
if(str[index]=='i')
{
{
index++; E(); if(str[index]==')') { { printf("\n非法的符号串!\n"); index++; }else index++; } else if (str[index]=='(') F(); Y(); } if(str[index]=='*') { index++; F(); Y(); void Y() index++; T(); X(); T(); X();} void X() printf("请输入字符串(长度):\n"); scanf("%s",str); len=strlen(str); //str[len]='#'; str[len+1]='\0'; E(); printf("%s为合法符号串!\n",str); strcpy(str,""); index=0; } return 0;
else
{
}
} } exit (0); } printf("非法的符号串!\n"); exit(0);
屏幕截图:
四、讨论与分析
通过本次实验对递归下降词法分析器的结构,过程有了更进一步的了解,通过学习书本和试验原理书上的内容,对它的工作原理,具体实行步骤有了进一步的掌握,由于本次试验是测试性试验,所以要求输出的结果是成功与否,输入一个句型,进过分析,判断它是否合法,主要内容在于其判断过程中。本次试验不光提高了自己的编程能力,同时提高了对递归下降的了解。