实验二:语法分析实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

一、实验目的:

加深对语法分析器工作过程的理解;加强对递归下降法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序

对简单的程序段进行语法翻译。

二、实验内容:

在实验1的基础上,用递归下降分析法编制语法分析程序,语法分析程序的实

现可以采用任何一种编程工具。

三、实验要求:

1. 对语法规则有明确的定义;

2. 编写的分析程序能够进行正确的语法分析;

3. *对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保

证顺利完成语法分析过程;

4. 实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序

的工作过程,说明错误处理的实现*。

四、实验学时:6学时

五、实验步骤:

1. 定义目标语言的语法规则;

2. 根据语法规则输入语句段,用递归下降分析的方法进行语法分析,直到结束;

3. *对遇到的语法错误做出错误处理。

六、实验内容:

1.编程实现给定文法的递归下降分析程序。

E→T|E+T

T→F|T*F

F→(E)|i

2.(参考课本P74)对文法先进行消除左递归。

E→TE'

E'→+TE' | ε

T→FT'

T'→*FT' | ε

F→(E) | i

3.分析程序由一组递归过程组成,文法中每个非终结符对应一个过程几个全局过程和变量: ADV ANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号

SYM,IP当前所指的输入符号

ERROR,出错处理子程序

每个非终结符有对应的子程序的定义,首先在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。

4. 具体实现时几点提示:

(1)当遇到终结符,编写:if(当前读到的输入符号=i)

读入下一个输入符号

(2)当遇到非终结符E时,编写语句:调用E()

(3)当遇到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

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"<

else

cout<<"fail"<

i=0; // 重新输入时,下标置0 }

}

void E()

{

T();

E2();

}

void E2()

{

if(sym=='+')

{

advance();

T();

E2();

}

else if (sym != ')' && sym != '#') {

cout<<"error!"<

exit(0);

}

}

void T()

{

F();

T2();

}

void T2()

{

if(sym=='*')

{

advance();

F();

T2();

}

else if(sym!='+'&&sym!=')'&&sym!='#') {

cout<<"error!"<

exit(0);

}

}

void F()

{

if(sym=='(')

{

advance();

E();

if(sym==')')

advance();

else

{

cout<<"error!"<

}

}

else if(sym=='i') {

advance();

}

else

{

相关文档
最新文档