编译原理实验语法分析“简单的算法表达式文法“ 100C

求大神指点迷津,希望能够帮我改改代码,有一个‘a+b+’的式子一直过不去

输入:字符串或者文本文件
输出:“合法表达式”或者“非法表达式”
例如:输入a+b*c-b/d则显示或者输出“合法表达式”,输入aa++--c*则显示或者输出“非法表达式”

#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>

#define nul 0
#define ident 1
#define plus 2
#define times 3
#define lparen 4
#define rparen 5
#define divide 6
#define sub 7

int sym;    //当前的符号
char ch;

FILE* fin;
FILE* fout;

int getsym();
void E();
void T();
void F();
void A();
void B();
void V();

void main()
{
    char filename[20];
    printf("请输入分析的文件名:");
    scanf("%s",filename);
    if((fin=fopen(filename,"r"))==NULL)
    {
        printf("不能打开文件.\n");
        return;
    }
    printf("请输入保存分析结果的文件名:");
    scanf("%s",filename);
    if((fout=fopen(filename,"w"))==NULL)
    {
        printf("不能打开文件.\n");
        return;
    }
    getsym();            //读第一个单词,将单词类别放入sym中

    E();                //开始按E->TA  分析
    if(sym==0)
        printf("合法表达式\n");
    else printf("非法表达式\n");
    fclose(fin);
    fclose(fout);
}

/*
* 词法分析,获取一个符号
*/
int getsym()
{
    ch=fgetc(fin);

    while (ch==' ' || ch==10 || ch==13 || ch==9)  /* 忽略空格、换行、回车和TAB */
        ch=fgetc(fin);

    if (ch==EOF)  sym=0;

    else if (ch>='a' && ch<='z')
        sym = 1;
    else if(ch == '+')
        sym = 2;
    else if (ch == '*')
        sym = 3;
    else if (ch == '/')
        sym = 6;
    else if (ch == '-')
        sym = 7;
    else if (ch == '(')
        sym = 4;
    else if (ch == ')')
        sym = 5;
    else {printf("--词法错\n");exit(0);}
    return 0;
}

void  E()//E-> TE’
{
    T();
    A();
}

void  A()//E’-> +TE’|-TE’|ε
{
    if(sym==2||sym==7)
    {getsym();
    T();
    A();
    }
    else if(sym==0) return;
    else if(sym==5) return;
    else
    {
        printf("语法错3: 缺少运算符+或者-\n");
        fprintf(fout,"语法错3: 缺少运算符+或者-\n");exit(0);}
}

void  T()//T-> FT’
{
    if (sym==1 ||sym==4)
    {
        F();
        B();
    }
    else if(sym==0) return;
    else
    {
        printf("语法错4: 缺少变量或者(\n");
        fprintf(fout,"语法错4: 缺少变量或者(\n");exit(0);}
}

void B()//T’-> *FT’|/FT’|ε
{
    if(sym==3||sym==6)
    {getsym();
    F();
    B();
    }
    else if(sym==0) return;
    else if(sym==2||sym==7||sym==5) return;
    else
    {
        printf("语法错5: 缺少运算符*或者/\n");
        fprintf(fout,"语法错5: 缺少运算符*或者/\n");exit(0);}
}

void F()//F-> V|(E)
{
    if (sym==1)
        V();
    else
    {getsym();
        E();
    if (sym==5)
        getsym();
    else
    {
        printf("语法错4: 缺少)\n");
        fprintf(fout,"语法错4: 缺少)\n");exit(0);}}
}

/*
V->a|...|z
*/
void V()
{   if(sym==1)
        getsym();
    else
    {
        printf("语法错8: 缺变量\n ");
        exit(0);}
}


求大神帮我改改代码,最好有注释,自己写的代码一直有问题

2个回答

感觉你那两个FILE文件指针fin,fout在这里没有正确得使用啊, 首先fin以只读得方式打开文件,所以接着应该是文件进行读写得操作,但是你没有在fin语句
后面进行文件得读写操作,因此应该把getsym(); 放在fin后面,进行了文件得读写操作之后再将其以另外一个名字存放。

m0_37739005
m0_37739005 正解
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐