当前位置:   article > 正文

【编译原理09】递归下降法分析简单符号串_输入一个符号串,用递归下降分析方法进行语法分析,判断该符号串是否是文法的句子,

输入一个符号串,用递归下降分析方法进行语法分析,判断该符号串是否是文法的句子,

Problem Description

若有文法G[S]:
S→pA | qB,
A→cAd | a
B→dB|b
编写递归下降法的语法分析程序,判断文法G所能接受的串。
Input 输入多行由终止符构成的符号串,输入EOF结束。
Output 判断每行输入的符号串在语法结构上是否合法,如果是合法的语法结构,输出"syntax correct";否则输出"syntax error"。

Sample Input
pccadd#
pccdda#
Sample Output
syntax correct
syntax error

C++代码实现

#include "iostream"

using namespace std;

string str;
int flag=1;

void S(string string1);//1.开始符S
void A(string string1);//2.非终结符A
void B(string string1);//3.非终结符B

void S(string s){
    str = s;
    if(str[0]=='p'){
        str = s.substr(1,s.length());
        A(str);
    }
    if (str[0]=='q'){
        str = s.substr(1,s.length());
        B(str);
    }
}

void A(string s){
    str = s;
    if (str[0]=='c'){
        str = s.substr(1,s.length());
        A(str);
        if(str[0]=='d')
            str = str.substr(1,str.length());
        //else flag = 0;
    }
    else if (s[0]=='a'){
        str = str.substr(1,str.length());
    } else flag=0;

}

void B(string s){
    str = s;
    if (str[0]=='d'){
        str = s.substr(1,s.length());
        B(str);
    }
    else if (str[0]=='b'){
        str = str.substr(1,str.length());
    } else flag=0;

}

int main(){
    while (cin>>str&&str!="EOF"){
        S(str);
        if (str[0]=='#'&&flag==1)cout<<"syntax correct"<<endl;
        else cout<<"syntax error"<<endl;
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
//stack方式
#include <iostream>
#include <stack>
using namespace std;

string S;
int f(string s){
    //cout<<s.length()<<endl;
    int i,j;
    if(s[0]=='p'){
        if(s[1]=='a')return 1;
        else{
            for(i=1;i<s.length();i++){
                if(s[i]=='c')continue;
                if(s[i]=='a'){
                    for(j=i+1;j<i+i;j++){
                        if(s[j]=='d')continue;
                    }
                    if(j+1==s.length())return 1;
                    else return -1;
                }
                else return -1;
            }
        }
    }
    else if(s[0]=='q'){
        int i=0;
        if(s[1]=='b')return 1;
        else{
            for(i = 1;i<=s.length()-3;i++){
                if(s[i]=='d')continue;
                else return-1;
            }
            if(s[i]=='b'&&s[i+1]=='#')return 1;
            else return -1;
        }
    }
    else{
        return -1;
    }
}

int main()
{
    while(cin>>S&&S!="EOF"){
        if(f(S)==1)cout<<"syntax correct"<<endl;
        else cout<<"syntax error"<<endl;
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/644568
推荐阅读
相关标签
  

闽ICP备14008679号