感谢大佬666 2022-10-18 21:45 采纳率: 83%
浏览 60

c语言检查错误,检查错误

img

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _KEY_WORD_END "waiting for your expanding"
typedef struct
{
    int typenum;
    char* word;
} WORD;
 struct {
    char result[8];
    char ag1[8];
    char op[8];
    char ag2[8];
}quad[20];
typedef struct node{    //修改
    WORD  *data;
    struct node* next;
}Node;
char input[255];
char token[255] = "";
int p_input;
int p_token;
char ch;
int kk = 0;
int count=0,k=0;
char* rwtab[] = { "begin", "if", "then", "while", "do", "end", _KEY_WORD_END };
WORD* scaner();
Node* yucu(Node* word);
Node* expression(Node* word);
Node* factor(Node* word);
void lrparser(Node* word);   //(WORD* word);
char *expression(void);
int statement();
int yucu();
char *term(void);
char *factor(void);
int lrparser();
int main()
{
    int over = 1;
    Node* oneword = NULL, * pt = NULL, * p;     //= (WORD*)malloc(sizeof(WORD));
                                                //memset(oneword, 0, sizeof(WORD));
    printf("Enter Your words (end with #):");
    scanf("%[^#]", input);
    p_input = 0;
    printf("Your words:\n%s\n", input);
    while (over < 1000)  //(over < 1000 && over != -1)
    {
        pt = (Node*)malloc(sizeof(Node));
        pt->data = scaner();
        pt->next = NULL;
        if (oneword == NULL) 
            oneword = pt;
        else
            p->next = pt;
        p = pt;
        over = p->data->typenum;
    }
    p = oneword;
    while (p) {
        printf("(%d,%s)", p->data->typenum, p->data->word);
        p = p->next;
    }
    lrparser(oneword);
    //printf("\npress # to exit:");
    //scanf("%[^#]", input);
    return 0;
}
char m_getch()
{
    ch = input[p_input];
    p_input = p_input + 1;
    return (ch);
}
void getbc()
{
    while (ch == ' ' || ch == 10)
    {
        ch = input[p_input];
        p_input = p_input + 1;
    }
}
void concat()
{
    token[p_token] = ch;
    p_token = p_token + 1;
    token[p_token] = '\0';
}
int letter()
{
    if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
        return 1;
    else
        return 0;
}
int digit()
{
    if (ch >= '0' && ch <= '9')
        return 1;
    else
        return 0;
}
int reserve()
{
    int i = 0;
    while (strcmp(rwtab[i], _KEY_WORD_END))
    {
        if (!strcmp(rwtab[i], token))
        {
            return i + 1;
        }
        i = i + 1;
    }
    return 10;
}
void retract()
{
    p_input = p_input - 1;
}
 
char* dtb(char* bstr)
{
    itoa(atoi(bstr), bstr, 2);
    return bstr;
}
 
WORD* scaner()
{
    WORD* myword = (WORD*)malloc(sizeof(WORD));
    memset(myword, 0, sizeof(WORD));
    myword->typenum = 10;
    myword->word = " ";
    p_token = 0;
    m_getch();
    getbc();
    if (letter())
    {
        while (letter() || digit())
        {
            concat();
            m_getch();
        }
        retract();
        myword->typenum = reserve();
        myword->word = (char*)malloc(33);
        strcpy(myword->word, token); 
        //myword->word = token;
        return (myword);
    }
    else if (digit())
    {
        while (digit())
        {
            concat();
            m_getch();
        }
        retract();
        myword->typenum = 11;
        myword->word = (char*)malloc(33);
        strcpy(myword->word, dtb(token));
        //myword->word = dtb(token);
        //lrparser(myword);
        return (myword);
    }
    else
        switch (ch)
        {
        case '=':
            m_getch();
            if (ch == '=')
            {
                myword->typenum = 39;
                myword->word = (char*)"==";
                return (myword);
            }
            retract();
            myword->typenum = 21;
            myword->word = (char*)"=";
            return (myword);
            break;
        case '+':
            myword->typenum = 22;
            myword->word = (char*)"+";
            return (myword);
            break;
        case '-':
            myword->typenum = 23;
            myword->word = (char*)"-";
            return (myword);
            break;
        case '*':
            myword->typenum = 24;
            myword->word = (char*)"*";
            return (myword);
            break;
        case '/':
            myword->typenum = 25;
            myword->word = (char*)"/";
            return (myword);
            break;
        case '(':
            myword->typenum = 26;
            myword->word = (char*)"(";
            return (myword);
            break;
        case ')':
            myword->typenum = 27;
            myword->word = (char*)")";
            return (myword);
            break;
        case '[':
            myword->typenum = 28;
            myword->word = (char*)"[";
            return (myword);
            break;
        case ']':
            myword->typenum = 29;
            myword->word = (char*)"]";
            return (myword);
            break;
        case '{':
            myword->typenum = 30;
            myword->word = (char*)"{";
            return (myword);
            break;
        case '}':
            myword->typenum = 31;
            myword->word = (char*)"}";
            return (myword);
            break;
        case ',':
            myword->typenum = 32;
            myword->word = (char*)",";
            return (myword);
            break;
        case ':':
            myword->typenum = 33;
            myword->word = (char*)":";
            return (myword);
            break;
        case ';':
            myword->typenum = 34;
            myword->word = (char*)";";
            return (myword);
            break;
        case '>':
            m_getch();
            if (ch == '=')
            {
                myword->typenum = 37;
                myword->word = (char*)">=";
                return (myword);
            }
            retract();
            myword->typenum = 35;
            myword->word = (char*)">";
            return (myword);
            break;
        case '<':
            m_getch();
            if (ch == '=')
            {
                myword->typenum = 38;
                myword->word = (char*)"<="</span>;
                return (myword);
            }
            retract();
            <span class="hljs-function">myword->typenum = 36;
            myword->word = (char*)"<";
            return (myword);
            break;
        case '!':
            m_getch();
            if (ch == '=')
            {
                myword->typenum = 40;
                myword->word = (char*)"!=";
                return (myword);
            }
            retract();
            myword->typenum = 41;
            myword->word = (char*)"!";
            //myword->typenum = -1;
            //myword->word = (char*)"ERROR";
            return (myword);
            break;
        case '\0':
            myword->typenum = 1000;
            myword->word = (char*)"OVER";
            return (myword);
            break;
        default:
            myword->typenum = 0;
            //myword->typenum = -1;
            myword->word = (char*)"ERROR";
            return (myword);
        }
}
void lrparser(Node* word)
{
    Node* w = word;
    if (w->data->typenum == 1) //begin
    {
        w = w->next;
        w = yucu(w);
        if (w->data->typenum == 6) //end
        {
            printf("success\n");
        }
        else if (w->data->typenum == 0) 
        {
            printf("中文符号错误\n");
        }
        else //缺end
        {
            if (kk != 1)
            {
                printf("缺end错误\n");
                kk = 1;
            }
        }
    }
    else
    {
        printf("begin错误\n");
        kk = 1;
    }
}
 
Node* statement(Node* word)
{
    Node* w = word;
    if (w->data->typenum == 10)
    {
        
        w = w->next;
        if (w->data->typenum == 21) 
            //(word->typenum == 18)
        {
            w = w->next;
            w = expression(w);
        }
        else{
            printf("fuzhi error!\n");
            kk = 1;
        }
    }else{
        printf("yuju error!\n");
        kk = 1;
    }
    return w;
}
 
Node* yucu(Node* word)
{
    Node* w = word;
    w = statement(w);
    while (w->data->typenum == 34) 
        //(w->data->typenum == 26)
    {
        w = w->next;
        w = statement(w);
    }
    return w;
}
Node* term(Node* word)
{
    Node* w = word;
    w = factor(w);
    while (w->data->typenum == 23 || w->data->typenum == 24) {
        w = w->next;
        w = factor(w);
    }
    return w;
}
Node* expression(Node* word)
{
    Node* w = word;
    w = term(w);
    while (w->data->typenum == 22 || w->data->typenum == 23)
        //(w->data->typenum == 13 || w->data->typenum == 14)
    {
        w = w->next;
        w = term(w);
    }
    return w;
}
 
Node* factor(Node* word)
{
    Node* w = word;
    if (w->data->typenum == 10 || w->data->typenum == 11)
        w = w->next;
    else if (w->data->typenum == 26){
        w = w->next;
        w = expression(w);
        if (w->data->typenum == 27)
            w = w->next;
        else
        {
            printf("error!\n");
            kk = 1;
        }
    }
    else{
        printf("biaoda error!\n");
        kk = 1;
    }
    return w;
}

void emit(char * result,char * ag1,char * op,char * ag2)
{
    strcpy(quad[count].result,result);
    strcpy(quad[count].ag1,ag1);
    strcpy(quad[count].op,op);
    strcpy(quad[count].ag2,ag2);
    count++;
    return;
}

char *newtemp(void)
{
    char *p;
    char m[8];
    p=(char *)malloc(8);
    k++;
    itoa(k,m,10);
    strcpy(p+1,m);
    p[0]='t';
    return(p);
} 
int lrparser()
{
    int schain=0;
kk=0;
    if(syn==1)
    {
        scaner();
    
        schain=yucu();
        if(syn==6)
        {
            scaner();
            if((syn==0)&&(kk==0))
                printf("sucess");
        }
        else
        {
            if(kk!=1) printf("缺少end!");
            kk=1;
        }
    return (schain);
}
int yucu(){
    int schain=0;
    schain=statement();
    while(syn!=6&&p!=length-1&&syn!=0)
    {
        if(syn!=26)
            scaner();
        while(syn==26)     //26==;
        {
            scaner();
            if (syn!=0&&syn!=6)
            {
                schain=statement();
            }
            
        }
    }
    return (schain);
}
int statement()
{
    int schain=0;
    char tt[8],eplace[8];
switch(syn){
case 10:
        strcpy(tt,token);
        scaner();
        if(syn==18)  //:= 18
        {
            scaner();
            strcpy(eplace,expression());
            emit(tt,eplace," "," ");
            schain=0;
        
    }
    else
    {
        printf("赋号值错误!\n");
        kk=1;
    }
    return (schain);
    break;}
}
 char * expression()
{
    char *tp,*ep2,*eplace,*tt;
    tp=(char *)malloc(12);/*分配空间*/
    ep2=(char *)malloc(12);
    eplace=(char *)malloc(12);
    tt =(char *)malloc(12);
    strcpy(eplace,term ());/*调用term分析产生表达式计算的第一项eplace*/
    while(syn==13||syn==14)
    {
        if(syn==13)
        {    
            tt[0]='+';
            tt[1]='\0';
        }
        else if(syn==14)
        {    
            tt[0]='-';
            tt[1]='\0';
        }
        scaner();
        strcpy(ep2,term());/*/调用term分析产生表达式计算的第二项ep2/*/
        strcpy(tp,newtemp());/*/调用newtemp产生临时变量tp存储计算结果/*/
        emit(tp,eplace,tt,ep2);/*/生成四元式送入四元式表/*/
        strcpy(eplace,tp);
        //term();
    }
    return (eplace);
}
char *term(void)
{
    char *tp,*ep2,*eplace,*tt;
    tp=(char *)malloc(12);/*分配空间*/
    ep2=(char *)malloc(12);
    eplace=(char *)malloc(12);
    tt =(char *)malloc(12);
    strcpy(eplace,factor());
    while(syn==15||syn==16)
    {
        if(syn==15)
        {    
            tt[0]='*';
            tt[1]='\0';
        }
        else if(syn==16)
        {    
            tt[0]='/';
            tt[1]='\0';
        }
        scaner();
        strcpy(ep2,factor());
        strcpy(tp,newtemp());    //tp为临时变量
        emit(tp,eplace,tt,ep2);    //将三地址代码送到四元式表
        strcpy(eplace,tp);
        //factor();
    }
    return (eplace);
}
char * factor(void)
{
    char *fplace;
    fplace=(char *)malloc(12);
    strcpy(fplace, " ");
    if(syn==10)
    {
        strcpy(fplace,token);
        scaner();
    }
    else if (syn==11)
    {
        itoa(sum,fplace,10);
        scaner();
    }
    else
        if(syn==27)   //(   27
        {
            scaner();
            fplace=expression();
            if(syn==28)scaner();
            else
            {
                printf("')' 出错!\n");
                kk=1;
            }
        }
        else
        {
            printf("'(' 出错!错误!\n");
            kk=1;
        }
        return (fplace);
}


  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-18 23:06
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 10月18日

悬赏问题

  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 使用Java milo连接Kepserver服务端报错?
  • ¥15 用ADS设计一款的射频功率放大器
  • ¥15 怎么求交点连线的理论解?
  • ¥20 软件开发方法学习来了
  • ¥15 微信小程序商城如何实现多商户收款 平台分润抽成