LL(1)语法分析c++实现

文法:
E->TD
D->+TD|ε
T->FC
C->*FC|ε
F->i
LL(1)分析表:
LL(1)语法分析c++实现_第1张图片
测试示例:
LL(1)语法分析c++实现_第2张图片

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;

typedef struct
{
    char data[10];
    int top;
    int num;
} message;//栈内元素对象 
void create(message*& m)
{
    m = (message*)malloc(sizeof(message));
    m->top = -1;
    m->num = 0;
}
void push(message*& m, char i)//进栈操作 
{
    if (m->top < 10)
    {
        m->top++;
        m->data[m->top] = i;
        m->num++;
    }
    else
        cout << "栈满";
}
char pop(message*& m)//出栈操作 
{
    char i;
    if (m->top != -1)
    {
        i = m->data[m->top];
        m->top--;
        m->num--;
        return i;
    }
    else
        cout << "栈空";
}
void getStr(char str[])//将输入的以$结尾的字符串 保存于字符串数组中 
{
    int j = 0;
    while (true)
    {
        cin >> str[j];
        if (str[j] == '$')
            break;
        else
            j++;
    }
}
void output(message* m, char* j)//用于输出符号栈与输入串的代码 
{
    int countj = 0;
    for (int i = 0; i < m->num; i++) {
        cout << m->data[i];
    }
    cout << "\t\t";
    while (*j != '$')
    {
        cout << *j;
        j++;
        countj++;
    }
    cout << "$";
    while (countj != 0)
    {
        j--;
        countj--;
    }
}
int main()
{
    string b[5][6] = { {"DT","","","DT","SYNCH","SYNCH"},//对应分析表 
    {"","DT+","","","#","#"},
    {"CF","SYNCH","","CF","SYNCH","SYNCH"},
    {"","#","CF*","","#","#"},
    {"i","SYNCH","SYNCH","(E)","SYNCH","SYNCH"} };
    int i = -1;
    message* m;
    create(m);
    cout << "输入字符串,字符串以$结尾。" << endl;
    char str[20];
    getStr(str);//获取字符串 
    char* j = str;
    push(m, '$');//'$'进栈 
    push(m, 'E');//'s'进栈 
    cout << "*************************************符号串分析过程*************************************" << endl;
    cout << "符号栈m\t\t输入串str[j]\t\t产生式b[][]" << endl;
    while (true) {
        //终结符时的判断 
        if (m->data[m->top] == 'i' || m->data[m->top] == '+' || m->data[m->top] == '*' || m->data[m->top] == '(' || m->data[m->top] == ')' || m->data[m->top] == '#' || m->data[m->top] == '$')
        {
            if (m->data[m->top] == *j)
            {
                if (m->data[m->top] == '$')//设定终结条件 
                {
                    output(m, j);//用于输出符号栈与输入串的代码 
                    cout << "           " << endl;
                    cout << "ok";
                    break;
                }
                else
                {
                    output(m, j);//用于输出符号栈与输入串的代码 
                    cout << endl;
                    j++;
                    pop(m);
                }
            }
            else
            {
                cout << "不是一个句子";
                break;
            }
        }
        else{
            output(m, j);//用于输出符号栈与输入串的代码 
            int m1 = -1;
            int n = -1;
            switch (*j)
            {
            case 'i':n = 0; break;
            case '+':n = 1; break;
            case '*':n = 2; break;
            case '(':n = 3; break;
            case ')':n = 4; break;
            case '$':n = 5; break;
            }
            switch (m->data[m->top])
            {
            case 'E' :
                m1 = 0;
                break;
            case 'D':
                m1 = 1;
                break;
            case 'T':
                m1 = 2;
                break;
            case 'C':
                m1 = 3;
                break;
            case 'F':
                m1 = 4;
                break;
            default:
                break;
            }
            if (b[m1][n] == "#")
            {
                cout << "     ";
                cout << "\t\t" << m->data[m->top] << "->" << "空" << endl;//输出产生式(给非终结符赋空值的表达式统一用‘#’表达)
                pop(m);
            }
            else
            {
                cout << "     ";
                cout << "\t\t" << m->data[m->top] << "->" << b[m1][n] << endl;//输出产生式
                pop(m);
                int k = b[m1][n].size();
                if (b[m1][n] != "")
                {
                    char c[20] = "0";
                    strcpy(c, b[m1][n].c_str());//将String转化为 char[] 
                    for (int j = 0; j < k; j++)
                    {
                        push(m, c[j]);
                    }
                }
                else
                {
                    cout << "不是一个句子";
                    break;
                }
            }
        }
    }
}

说明:
设计一个栈:符号栈,内含top属性,记录栈顶符号的下标,num属性,记录栈中符号总数,char数组,线性存储符号。编写它的进出栈操作函数。Main方法里面定义string类型的二维数组,用于存储LL(1)分析表,只存推导式右边的部分,并且逆序存储。初始化:输入待检测的语句串,定义char类型指针指向语句串串首,用于记录验证的位置。将 , E 入 栈 。 开 始 分 析 : 最 外 层 w h i l e 循 环 , 以 出 错 或 者 栈 顶 符 号 为 ,E入栈。开始分析:最外层while循环,以出错或者栈顶符号为 Ewhile,作为结束条件,中间循环先判断栈顶符号是否为终结符号,是的话与char类型指针所指的字符对比,相等的话把栈顶符号pop出去,并且char指针自增,判断栈有没有空,空了的话在、结束,没空的话continue。如果栈顶符号不是终结符号,查LL(1)分析表,如果分析表的那一项不为空,则先pop栈顶符号,再push分析表里的符号。如果为空,报错。

你可能感兴趣的:(LL(1)语法分析c++实现)