递归下降分析程序

来源:互联网 发布:最新美化照片软件 编辑:程序博客网 时间:2024/05/16 08:35

实验二 递归下降分析程序

一、实验目的

1.通过本次实验,掌握自顶向下语法分析的要求与特点;

2.掌握递归下降语法分析的基本原理和方法;

3.学习程序设计语言的语法分析器的手工编程方法。

 

二、实验内容

将递归下降子程序分析方法运用于算术表达式文法。

 

三、实验原理

递归下降分析法是一种确定的自顶向下语法分析方法,它的基本方法是给文法每一个非终结符号设计一相应的子程序。由于文法的产生式往往是递归的,因而这些子程序也是递归的,也就是说,只要调用第一个产生式,程序就会执行到结束,其他子程序将会在其中被调用。

在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下,我们就可能构造一个不带回溯的自顶向下的分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。

 

四、算法思想

1.分析对象

算术表达式的BNF定义如下:

〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉

〈项〉→〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉

〈因式〉→〈变量〉│(〈算术表达式〉)

〈变量〉→ i

用符号表示为:

        G[E]: E→T|E+T|E-T

              T→F|T*F|T/F

              F→i│(E)

消除左递归后:

       G’[E]: E→TE’

            E’ →+TE’|-TE’|ε

            T→FT’

            T’→*FT’|/FT’|ε

            F →i|(E)

2.设计思路

  为5个非终结符每个分别设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。

产生式的右边指出这个函数的代码结构:

(1)    若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。 

(2)    若是非终结符号,则调用与此非终结符对应的过程。当右部有多个产生式时,

可用选择结构实现。


五、具体实现

#include <bits/stdc++.h>using namespace std; char  inputstream[50];   //存储输入字符串 int  temp=0;      //数组下标 int flag;    //判断输出信息 void t();void e();void e1();void t1();void f();void  e(){cout<<"E->TE'"<<endl;     t();     e1(); } void  e1(){if(inputstream[temp]=='+') {         cout<<"E'->+TE'"<<endl;     temp++;     t();         e1(); }     else if(inputstream[temp]=='-') {         cout<<"E'->-TE'"<<endl;     temp++;     t();         e1(); }    else if (inputstream[temp]!='#'||inputstream[temp]!=')') {             cout<<"T'->^"<<endl;  } else flag=0;}void  t(){cout<<"T->FT'"<<endl; f(); t1();} void t1(){if(inputstream[temp]=='*') {   cout<<"T'->*FT'"<<endl;   temp++; f();   t1(); } else if(inputstream[temp]=='/'){cout<<"T'->/FT'"<<endl;     temp++; f();     t1();}    else if (inputstream[temp]!='#'&&inputstream[temp]!=')'&&inputstream[temp]!='+'&&inputstream[temp]!='-') {       cout<<"T'->^"<<endl;   flag=0;    }}void f(){if(inputstream[temp]=='i'){cout<<"F->i"<<endl; temp++; }else if(inputstream[temp]=='('){cout<<"F->(E)"<<endl; temp++; e();if(inputstream[temp]==')'){cout<<"F->(E)"<<endl; temp++;}else flag=0; }else flag=0; }int  main(){   flag=1;    cout<<"请输入要分析的字符串以#结束(^为空字符):"<<endl;   cin>>inputstream;    e();    if((inputstream[temp]=='#')&&flag)        cout<<"分析成功,是合法算术表达式!"<<endl;    else       cout<<"分析失败,不是合法算术表达式!"<<endl; return 0;} 



原创粉丝点击