感谢大佬666 2022-10-12 16:28 采纳率: 83%
浏览 91
已结题

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

运行不了,有会的吗?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WORD_END "waiting for your expanding"
typedef struct{
    int typenum;
    char * word;
}WORD;
char input[255];
char token[255]="";
int p_input;
int p_token;
char ch;
int kk=0;
char * rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};
WORD *scaner();
int main(){
    int over=1;
    WORD* oneword=new WORD;
    printf("Enter Your words (end with #):");
    scanf("%[^#]s",input);
    p_input=0;
    printf("Your words:\n%s\n",input);
        
    while(over<1000&&over!=-1){
        oneword=scaner();
        if(oneword->typenum<1000)
        printf("(%d,%s)",oneword->typenum,oneword->word);
        over =oneword->typenum;
    }
    printf("\npress # to exit:");
    scanf("%[^#]s",input);
}
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=new 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=token;
                return(myword);
        } else if(digit()){
            while(digit()){
                concat();
                m_getch();
            }
                retract();
                myword->typenum=11;
                myword->word =(char *)malloc(16); 
                myword->word=dtb(token);
    
                return(myword);
        }else switch(ch){
            case '=': m_getch();
            if(ch=='='){
                myword->typenum=39;
                myword->word="==";
                return(myword);
            }
                retract();
                myword->typenum=21;
                myword->word="=";
                return(myword);
                break;
            case '+':    myword->typenum=22;
                        myword->word="+";
                        return(myword);
                break;
            case '-':    myword->typenum=23;
                        myword->word="-";
                        return(myword);
                break;
            case '*':    myword->typenum=24;
                        myword->word="*";
                        return(myword);
                break;
            case '/':    myword->typenum=25;
                        myword->word="/";
                        return(myword);
                break;
            case '(':    myword->typenum=26;
                        myword->word="(";
                        return(myword);
                break;
            case ')':    myword->typenum=27;
                        myword->word=")";
                        return(myword);
                break;
            case '[':    myword->typenum=28;
                        myword->word="[";
                        return(myword);
                break;
            case ']':    myword->typenum=29;
                        myword->word="]";
                        return(myword);
                break;
            case '{':    myword->typenum=30;
                        myword->word="{";
                        return(myword);
                break;
            case '}':    myword->typenum=31;
                        myword->word="}";
                        return(myword);
                break;
            case ',':    myword->typenum=32;
                        myword->word=",";
                        return(myword);
                break;
            case ':':    myword->typenum=33;
                        myword->word=":";
                        return(myword);
                break;
            case ';':    myword->typenum=34;
                        myword->word=";";
                        return(myword);
                break;
            case '>': m_getch();
            if(ch=='='){
                    myword->typenum=37;
                        myword->word=">=";
                        return(myword);
            }
                retract();
                myword->typenum=35;
                myword->word=">";
                return(myword);
                break;
            case '<': m_getch();
            if(ch=='='){
                    myword->typenum=38;
                        myword->word="<="</span>;
                        return(myword);
            }
                retract();
                <span class="hljs-function">myword->typenum=36;
                myword->word="<";
                return(myword);
                break;    
            case '!': m_getch();
            if(ch=='='){
                    myword->typenum=40;
                        myword->word="!=";
                        return(myword);
            }
                retract();
                myword->typenum=-1;
                myword->word="ERROR";
                return(myword);
                break;
            case '\0': myword->typenum=1000;
                        myword->word="OVER";
                        return(myword);
            break;
            default: 
                myword->typenum=-1;
                myword->word="ERROR";
                return(myword);
            
                
        }
}
void lrparser(WORD* word){
        WORD* w; 
        if(word->typenum==1){
            w=scaner();
            w=yucu(w);
            if(w->typenum==6){
                w=scaner();
                if(w->typenum==0&&(kk==0)){
                    free(w);
                    printf("success\n");
                }
            }else{
                if(kk!=1){
                    printf("lack of end error!\n");
                    kk=1;
                }
            }
        
        
        }
            else{
                free(word);
                printf("begin error!\n");
                kk=1;
            }
                return;
} 
WORD* yucu(WORD* word){
WORD* w;
w= statement();
    while(w->typenum==26){
        w=scaner();
    w=statement(w);
    }
    return w;
}

WORD* statement(WORD* word){
    WORD* w;
    if(word->typenum==10){
        w=scaner();
        if(word->typenum==18){
            w=scaner();
            w=expression(w);
        }else{
            printf("fuzhi error!\n");
            kk=1;
        }
    }
    else{
        printf("yuju error!\n");
        kk=1;
    }
    return w; 
}

WORD* expression(WORD* word){
    WORD* w;
w=    term();
    while(w->typenum==13||w->typenum==14){
        w=scaner();
        w=term(w); 
    }
    return w;
}
WORD* item(WORD* word){
    WORD* w;
   w= factor();
    while(w->typenum==15||w->typenum==16){
      w=scaner();
        w=factor(w); }
            return w;
}
WORD* factor(WORD* word){
      WORD* w;
    if(word->typenum==10||word->typenum==11)
         w=scaner();
    else if(w->typenum==27)
    {
    w=scaner();
    w=expression(w);
    if(w->typenum==28)
        w=scaner();
        else{
            printf("error!\n");
            kk=1;
        }    
        
    }
    else{
            printf("biaoda error!\n");
            kk=1;
    }
    return w;
}



  • 写回答

3条回答 默认 最新

  • qzjhjxj 2022-10-12 16:56
    关注

    代码里第183 187行是什么意思?2022.10.13 整体修改如下,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define _KEY_WORD_END "waiting for your expanding"
    typedef struct
    {
        int typenum;
        char* word;
    } WORD;
    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;
    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);
    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*)"<=";
                    return (myword);
                }
                retract();
                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;
    }
    
    //输入示例1:
    //begin a = 9; x = (23+3); b = a + x end #
    //输出示例:
    //(1,begin)(10,a)(21,=)(11,1001)(34,;)(10,x)(21,=)(26,()(11,10111)(22,+)(11,11)(27,))(0,ERROR)(0,ERROR)(10,b)(21,=)(10,a)(22,+)(10,x)(6,end)(1000,OVER)中文符号错误
    
    //输入示例2:
    //begin a: = 9; x = (23+3); b = a + x end #
    //输出示例:
    //(1,begin)(10,a)(33,:)(21,=)(11,1001)(34,;)(10,x)(21,=)(26,()(11,10111)(22,+)(11,11)(27,))(34,;)(10,b)(21,=)(10,a)(22,+)(10,x)(6,end)(1000,OVER)fuzhi error!
    
    //输入示例3:
    //begin a = 9; x = (23+3); b = a + x end #
    //输出示例:
    //(1,begin)(10,a)(21,=)(11,1001)(34,;)(10,x)(21,=)(26,()(11,10111)(22,+)(11,11)(27,))(34,;)(10,b)(21,=)(10,a)(22,+)(10,x)(6,end)(1000,OVER)success
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月21日
  • 已采纳回答 10月13日
  • 创建了问题 10月12日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)