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

📄 shiyan2.cpp

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

char src[255];
int codelength, cur_pos;
char token;

int match(char);
void error();
int E();
int T();
int G();
int F();
int S();

int match(char expectedToken)
{
    if(token == expectedToken)
    {
        token = src[cur_pos++];
        return 1;
    }
    else
    {
        error();
        printf("in %dth position expected a '%c', but found '%c' instead\n", cur_pos, expectedToken, token);
        return 0;
    }
}

void error()
{
    printf("invalid input\n");
}

int E()
{
    if( T() == 0) return 0;
    if( G() == 0) return 0;
    return 1;
}

int T()
{
    if( F() == 0) return 0;
    if( S() == 0) return 0;
    return 1;
}

int F()
{
    if(token == '(')
    {
        if( !match('(')) return 0;
        if( !E()) return 0;
        return match(')');
    }
    else if(token == 'i')
    {
        return match('i');
    }
    else
    {
        error();
        printf("expected a '(' or 'i' in the %dth position, but found '%c' instead\n", cur_pos, token);
        return 0;
    }
}

int S()
{
    if(token == '*' || token == '/')
    {
        if(token == '*')
        {
            if( !match('*')) return 0;
        }
        else
        {
            if( !match('/')) return 0;
        }
        if( !F()) return 0;
        if( !S()) return 0;
    }
    return 1;
}

int G()
{
    if(token == '+' || token == '-')
    {
        if(token == '+')
        {
            if( !match('+')) return 0;
        }
        else
        {
            if( !match('-')) return 0;
        }
        if( !T()) return 0;
        if( !G()) return 0;
    }
    return 1;
}

int main()
{
    int i, j, len;
    // 输入的src字符串是以#结束的包括'+'、'-'、'*'、'/'、'('、')'、'i'的字符串 
    while(gets(src) != NULL)
    {
        codelength = strlen(src);
        if(codelength == 0)
        {
            continue;
        }
        cur_pos = 0;
        token = src[cur_pos++];
        if(E())
        {
            if(token != '#' || cur_pos != codelength)
            {
                printf("invalid input\n");
                printf("the input should be terminated by '#' and have no more character after it\n");
            }
            else
            {
                printf("valid input\n");
            }
        }
    }
    return 0;
}

⌨️ 快捷键说明

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