⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shiyan3.cpp

📁 这是一个编译器的课程实验里面包含了
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char src[255];
char stack[255];

int codelength;
int stack_top;
int cur_pos;

char Act[5][8][5] = {
    {"TG", "", "", "", "", "", "TG", ""},
    {"FS", "", "", "", "", "", "FS", ""},
    {"", "#", "", "", "+TG", "-TG", "", "#"},
    {"", "#", "*FS", "/FS", "#", "#", "", "#"},
    {"(E)", "", "", "", "", "", "i", ""}
                    };

int toN(char ch)
{
    switch(ch)
    {
        case '(': return 0;
        case ')': return 1;
        case '*': return 2;
        case '/': return 3;
        case '+': return 4;
        case '-': return 5;
        case 'i': return 6;
        case '$': return 7;
        case 'E': return 10;
        case 'T': return 11;
        case 'G': return 12;
        case 'S': return 13;
        case 'F': return 14;
        default: return -1;
    }
}

void init()
{
    codelength = strlen(src);
    src[codelength] = '$';
    src[++codelength] = '\0';
    stack_top = 0;
    stack[stack_top++] = '$';
    stack[stack_top++] = 'E';
    stack[stack_top] = '\0';
    cur_pos = 0;
}

void error()
{
    printf("error!\n");
}

int isTerminal(char ch)
{
    if(ch == '(' || ch == ')' || ch == '*' || ch == '/' ||
       ch == '+' || ch == '-' || ch == 'i' || ch == '$')
    {
        return 1;
    }
    return 0;
}

int entry(char ch1, char ch2)
{
    if(strlen(Act[toN(ch1) % 10][toN(ch2)]) == 0) return 0;
    return 1;
}

void stack_push(char ch1, char ch2)
{
    int len, i, d1, d2;
    d1 = toN(ch1) % 10;
    d2 = toN(ch2);
    len = strlen(Act[d1][d2]);
    if(Act[d1][d2][0] == '#')
    {
        printf("%c-> ε\n", ch1);
        stack[stack_top] = '\0';
        return;
    }
    for(i = len - 1; i >= 0; i--)
    {
        stack[stack_top++] = Act[d1][d2][i];
    }
    stack[stack_top] = '\0';
    printf("%c->%s\n", ch1, Act[d1][d2]);
}

void LL1_Analysis()
{
    char ch1, ch2;
    while(stack[stack_top - 1] != '$')
    {
        ch1 = stack[stack_top - 1];
        ch2 = src[cur_pos];
        if(ch2 == ' ' || ch2 == '\t') continue;
        printf("%-20s%-20s   ", stack, src + cur_pos);
        if(isTerminal(ch1) && ch1 == ch2)
        {
            stack_top--;
            stack[stack_top] = '\0';
            printf("匹配\n");
            cur_pos++;
        }
        else if(!isTerminal(ch1) && isTerminal(ch2) && entry(ch1, ch2))
        {
            stack_top--;
            stack_push(ch1, ch2);
        }
        else
        {
            break;
        }
    }
    if(stack[stack_top - 1] == '$' && src[cur_pos] == '$')
    {
        printf("%-20s%-20s   ", stack, src + cur_pos);
        printf("接受\n");
        return;
    }
    else
    {
        error();
    }
}

int main()
{
    while(gets(src) != NULL)
    {
        if(strlen(src) == 0) continue;
        init();
        LL1_Analysis();
    }
    system("pause");
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -