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

📄 ll(1).cpp

📁 编译原理的实习
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define MaxSize 100
char E[]="TG";
char G1[]="+TG";      
char G2[]="-TG";      
char G3[]="e";        
char T[]="FS";        
char S1[]="*FS";      
char S2[]="/FS";      
char S3[]="e";        
char F1[]="(E)";      
char F2[]="i";        
char input[10];
int j=0,temp;

typedef struct
{
    char stack[MaxSize];
    int top;
}stacktype;

void initstack(stacktype *S)
{
    S->stack[0]='#';
    S->stack[1]='E';
    S->top=1;
}

void reversepush(stacktype *S,char x[])
{
    int n;
    n=strlen(x);
    if (S->top==MaxSize) 
        printf("栈上溢出!\n");
    else
        for(n=n-1;n>=0;n--)                    //产生式反向入栈
        {
            S->top++;
            S->stack[S->top]=x[n];  
        }
}

void pop(stacktype *S)
{
    if (S->top==-1) 
        printf("栈下溢出!\n");
    else 
        S->top--;
}

char re_top_value(stacktype *S)
{
    return(S->stack[S->top]);   
}

void display(stacktype *S)
{
    int i;
    for (i=0;i<=S->top;i++)
        printf("%c",S->stack[i]);
    printf("\t");
}

void print(int pos)
{
    temp=pos;
    for(pos;pos<=10;pos++)
        printf("%c",input[pos]);
    printf("\n");
    pos=temp;
}

main()
{
    int i=0,flag=0;
    char a;
    stacktype st;
    printf("初始化符号栈...\n");
    initstack(&st);
    printf("OK!\n");
    printf("请输入符号串(10个以内),以“#”结束!\n");
    do
    {
        scanf("%c",&input[i]);
        i++;
    }while(input[i-1]!='#');
    printf("符号栈\t剩余字符串\n");
    display(&st);
    print(j);
    while(1)
    {
        if(((a=re_top_value(&st))=='#')&&input[j]=='#')
        {
            printf("结束!\n");
            if(flag==0)
                printf("表达式正确!");
            else 
                printf("表达式有错误!错误原因:缺少变量!\n");
            exit(0);
        }
        if((input[j]==(a=re_top_value(&st)))&&input[j]!='#')
        {
            pop(&st);
            j++;
            display(&st);
            print(j);   	
        }
        if(input[j]!=(a=re_top_value(&st)))
        {
            if(a=='E'&&(input[j]=='('||input[j]=='i'))
        	{
                pop(&st);
                reversepush(&st,E);
                display(&st);
                print(j);
        	}
            if(a=='E'&&(input[j]=='#'))
        	{
                pop(&st);
                display(&st);
                print(j);
        	}
            if(a=='T'&&(input[j]=='('||input[j]=='i'))
        	{
                pop(&st);
                reversepush(&st,T);
                display(&st);
                print(j);
        	}
            if(a=='T'&&(input[j]==')'||input[j]=='+'||input[j]=='-'||input[j]=='#'))
        	{
                pop(&st);
                display(&st);
                printf("本处有错误!\n");
                flag=1;
                print(j);
        	}
            if(a=='G'&&input[j]=='+')
        	{
                pop(&st);
                reversepush(&st,G1);
                display(&st);
                print(j);
        	}
            if(a=='G'&&input[j]=='-')
        	{
                pop(&st);
                reversepush(&st,G2);
                display(&st);
                print(j);
        	}
            if(a=='G'&&(input[j]=='#'||input[j]==')'))
        	{
                pop(&st);
                display(&st);
                print(j);
        	}
            if(a=='F'&&input[j]=='(')
        	{
                pop(&st);
                reversepush(&st,F1);
                display(&st);
                print(j);
        	}
            if(a=='F'&&input[j]=='i')
        	{
                pop(&st);
                reversepush(&st,F2);
                display(&st);
                print(j);
        	}
            if(a=='F'&&(input[j]==')'||input[j]=='+'||input[j]=='-'||input[j]=='*'||input[j]=='/'||input[j]=='#'))
        	{
                pop(&st);
                display(&st);
                printf("本处有错误!\n");
                flag=1;
                print(j);
        	}
            if(a=='S'&&input[j]=='*')
        	{
                pop(&st);
                reversepush(&st,S1);
                display(&st);
                print(j);
        	}
            if(a=='S'&&input[j]=='/')
        	{
                pop(&st);
                reversepush(&st,S2);
                display(&st);
                print(j);
        	}
            if(a=='S'&&(input[j]=='#'||input[j]==')'||input[j]=='+'||input[j]=='-'))
        	{
                pop(&st);
                display(&st);
                print(j);
        	}
            if((a=='('||a==')')&&input[j]!=a)
        	{
                printf("表达式错误!错误原因:括号不匹配!分析中断!\n");
                if(flag==1)
                    printf("缺少变量!\n");
                exit(0);
        	}
            if(a=='E'&&(input[j]==')'||input[j]=='+'||input[j]=='-'||input[j]=='*'||input[j]=='/'))
        	{
                printf("表达式错误,分析中断!\n");
                exit(0);
        	}
            if(a=='T'&&(input[j]=='*'||input[j]=='/'))
        	{
                printf("表达式错误,分析中断!\n");
                exit(0);
        	}
            if(a=='G'&&(input[j]=='i'||input[j]=='('||input[j]=='*'||input[j]=='/'))
        	{
                printf("表达式错误,分析中断!\n");
                exit(0);
        	}
            if(a=='S'&&(input[j]=='i'||input[j]=='('))
        	{
                printf("表达式错误,分析中断!\n");
                exit(0);
        	}
        }
    }
}

⌨️ 快捷键说明

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