新浪博客

实验二  语法分析器的设计与实现

2012-11-15 22:31阅读:
实验二 语法分析器的设计与实现
一、实验目的:
加深对语法分析器工作过程的理解;加强对递归下降法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。
二、实验内容:
在实验1的基础上,用递归下降分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程工具。
三、实验要求:
1. 对语法规则有明确的定义;
2. 编写的分析程序能够进行正确的语法分析;
3. *对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;
4. 实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现*。
四、实验学时:6学时
五、实验步骤:
1. 定义目标语言的语法规则;
2. 根据语法规则输入语句段,用递归下降分析的方法进行语法分析,直到结束;
3. *对遇到的语法错误做出错误处理。
六、实验内容:
1.编程实现给定文法的递归下降分析程序。
E→T|E+T
T→F|T*F
F→(E)|i
2.(参考课本P74)对文法先进行消除左递归。
3.分析程序由一组递归过程组成,文法中每个非终结符对应一个过程几个全局过程和变量:
ADVANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号
SYM,IP当前所指的输入符号
ERROR,出错处理子程序
每个非终结符有对应的子程序的定义,首先在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。
4. 具体实现时:
(1)当遇到终结符,编写: if(当前读到的输入符号=i)
读入下一个输入符号
(2)当遇到非终结符E时,编写语句: 调用E()
(3)当遇到E-->e 编写语句 if(当前读到的输入符号不属于Follow(E))
Error();
(4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一的选择一个候选式进行推导。
例:(1)只含有一个字符的形式:
i
a
(2) 含有‘+’的形式:
i+i
i+i+i
i+
+++
(3) 含有‘*’的形式:
i*i
i*i*i
i*
**
(4) 含有‘(’‘)’的形式:
(i)
()

(i))
(5) 综合形式:
(i+i)*i
(i+i)*(i+i)
i+i*i
i++i*
(*i+
(i+
Iii


#include <iostream>
using namespace std;
char a[80]; // 字符串的存入
char sym; // 单个的判断字符
int i=0; // 字符串下标
void E(); // 功能识别函数
void E2(); // 功能识别函数
void T(); // 功能识别函数
void T2(); // 功能识别函数
void F(); // 功能识别函数
void input(); // 输入函数
void advance(); // 字符串小标进一函数
void main()
{
while(1)
{
input();
advance();
E(); // 从首个推导式E开始
if (sym=='#')
cout<<'success'<<endl;
else
cout<<'fail'<<endl;
i=0; // 重新输入时,下标置0
}
}
void E()
{
T();
E2();
}
void E2()
{
if(sym=='+')
{
advance();
T();
E2();
}
else if (sym != ')' && sym != '#')
{
cout<<'error!'<<endl;
exit(0);
}
}
void T()
{
F();
T2();
}
void T2()
{
if(sym=='*')
{
advance();
F();
T2();
}
else if(sym!='+'&&sym!=')'&&sym!='#')
{
cout<<'error!'<<endl;
exit(0);
}
}

void F()
{
if(sym=='(')
{
advance();
E();
if(sym==')')
advance();
else
{
cout<<'error!'<<endl;
exit(0);
}
}
else if(sym=='i')
{
advance();
}
else
{
cout<<'error!'<<endl;
exit(0);
}
}


void input()
{

cout<<'请输入需识别的句子:';
cin>>a;

}
void advance()
{

sym=a[i];
i++;
}

我的更多文章

下载客户端阅读体验更佳

APP专享