• 大小: 7KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-08-14
  • 语言: C/C++
  • 标签: 编译原理  

资源简介

预测分析程序的实现 设计内容及要求: 对文法 G: E->TE' E'->+TE' E'->e T->FT' T'->*FT' T'->e F->(E) F->i 造出 G 的表驱动的预测分析程序, 程序显示输出形如教材中的匹配过程。 (可正确运行,有对应博客记录实验报告)

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
void input_G();  //LL(1)文法输入函数以及VN和VT之间的分离
void Select();
bool Judge_LL1();
void PREDICT();
void analyze(string str);
string char2str(char ch);
///*********函数声明分隔线*******************
string p[100];       //表示产生式
int n_chan;             //产生式的个数
int n_VN;
vector VN;      //终结符集和set_VN存储相同,但向量存储便于随机访问
vector VT;      //非终结符集
set set_VN;     //非终结符集合和VN存储相同,但集合存储便于查找元素和去重
set set_VT;     //终结符集合
string all_left[100];      //产生式所有左部VN
string all_right[100];      //产生式所有右部VN+VN
string S;  //开始VN
map Vn2Num;    //VN映射到FIRST集合下标
map Vt2Num;    //VN映射到FIRST集合下标
set SELECT[100];
vector predict[100];  //预测分析表
string kong = “error“;  //预测分析表空白处填写字符串
int step = 0;  //预测分析过程步骤序数
int main() {
input_G();
    Select();
    PREDICT();
    cout<<“请输入对应以上文法要分析的字符串(如i*i):“;
    string str;
    cin>>str;
    while(str[str.length()-1]!=‘-‘){
        analyze(str);
        cout<        cin>>str;
    }
return 0;
}
///输入合法文法&&分离VT和VN
void input_G(){
    string tmp;   //用于拼接字符串
    string tmp1;
    n_chan = 8;
    p[0] = “E->TE‘“;
    p[1] = “E‘->+TE‘“;
    p[2] = “E‘->e“;
    p[3] = “T->FT‘“;
    p[4] = “T‘->*FT‘“;
    p[5] = “T‘->e“;
    p[6] = “F->(E)“;
    p[7] = “F->i“;
    ///提取非终结符VN的循环
    for(int i=0;i        tmp = ““;
        tmp1 = ““;
        //scanf(“%[^\n]“p[i]);
        //getchar();
        int j=0;
        while(p[i][j]!=‘-‘){
            tmp += p[i][j];  //因为非终结符可能是形如E‘之类的两个字符,所以需要拼接,遇到箭头就结束
            j++;
        }
        j += 2;
        for(;j<(int)p[i].length();j++)
            tmp1 += p[i][j];
        cout<        all_left[i] = tmp;      //存储每个产生式的左部
        all_right[i] = tmp1;    //存储每个产生式的右部
        set_VN.insert(tmp);  //将每行产生式拼接好的非终结符插入到集合中
    }
    n_VN = set_VN.size();   //读取VN个数
    ///提取终结符VT的循环
    for(int i=0;i        int chan_len = p[i].length(); //每个产生式的长度
        for(int j=0;j            if(p[i][j]==‘>‘){
                tmp = ““;
                for(int k=j+1;k“之后的下标
                    tmp1 = p[i][k];
                    if(set_VN.count(tmp1)==0){ //count==0表示该字符不在集合中,即∈VT
                        tmp += p[i][k];           //拼接字符串
                        tmp1 = p[i][k+1];
                        if((k==chan_len-1)||((k                            //判断(已是最后一个字符||后一个字符是VN则之前的字符串是一个VT)
                            set_VT.insert(tmp);
                            tmp = ““;
                        }
                    }
                }
                break;  //本行产生式已扫描结束
            }
    }
    set_VT.erase(“‘“);  //VT集合中删除“‘“和“e“符号

评论

共有 条评论