• 大小: 13KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: C/C++
  • 标签: fundamentals  

资源简介

编译原理的LL(1)文法判断代码,可以在codeblocks上无碍运行(凑字数用:祝大家学习进步天天开心)

资源截图

代码片段和文件信息

#include
using namespace std;
#define MAX 100
struct state
{
    char sta;//状态
    string f[MAX];// 产生式
    int num;//产生式个数
};
struct  grammer
{
    string VT ;//终结符
    string VN;//非终结符
    struct state states[MAX];//产生式
    char S;//开始符
    int tnum ;//终结符个数2
    int nnum ;//非终结符 个数
    string vns;//能推出空串的非终结符
};
struct  grammer gram;//定义一个文法
string First[MAX];//first集合
string Follow[MAX];//follow集合
string FolChild[MAX];//follow[A]的子集序列
string Select[MAX][MAX];//select 集合 非终结符 产生式
int position(char astring s);//根据终态a查找a在有限状态集中的位置
void receiveGra();//接收文法
void calculateFirst();//计算FIRST集合
void calculateFollow();//计算FOLLOW集合
void calculateSelect();//计算select集合
int isallvn(string a);
int judge();//判断
void printGra();//输出文法

int main()
{
    receiveGra();
    calculateFirst();
    calculateFollow();
    calculateSelect();
    printGra();
    return 0;
}
void receiveGra() //接受文法
{
    gram.tnum = 0;
    gram.nnum = 0;
    cout<<“请输入开始符:“<    cin>>gram.S;
    cout<<“请输入产生式以#结束(空串以^代替):“<    string temp;
    while(1)
    {
        cin>>temp;
        if(temp[0]==‘#‘)
            break;
        int j = position(temp[0]gram.VN);//找到状态的位置
        if(j<0) //未出现过
        {
            gram.VN+=temp[0];
            gram.states[gram.nnum].sta = temp[0];
            for(int m = 3; m                gram.states[gram.nnum].f[0]+=temp[m];
            gram.states[gram.nnum].num = 1;

            gram.nnum++;
        }
        else  //出现过
        {
            int n = gram.states[j].num;
            for(int m = 3; m                gram.states[j].f[n]+=temp[m];
            gram.states[j].num++;
        }
        if(temp[3]==‘^‘)
            if(position(gram.states[j].stagram.vns)<0)
                gram.vns+=gram.states[j].sta;//能推出空串的非终结符
    }
    for(int i = 0; i    {
        struct state st = gram.states[i];
        for(int j = 0; j        {
            string a = st.f[j];
            for(int p = 0; p            {
                if(position(a[p]gram.VN)<0)
                    if(position(a[p]gram.VT)<0) gram.VT+=a[p];
            }
        }
    }
    cout<<“输入结束!“<
}
void calculateFirst() //计算FIRST集合 对每个非终结符计算first
{
    struct state st;
    for(int i = 0; i    {

        int flag = 0;//标志
        st = gram.states[i];
        if(position(st.stagram.VT)<0)
        {
            // cout<            for(int j = 0; j            {
                string temp = st.f[j];

                if(position(temp[0]gram.VT)!=-1) //遇到终结符
                {
                    if(position(temp[0]First[i])<0)
                    {
                        First[i]+=temp[0];
                        flag = 1;
                    }
                }
                else
                {
  

评论

共有 条评论