qq_32836541 2017-05-01 14:51 采纳率: 0%
浏览 2513
已结题

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

求大神指点迷津,希望能够帮我改改代码,有一个‘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条回答

  • 内核之道 PostgreSQL领域优质创作者 2017-05-01 15:19
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R