标题:新手小白 求教大神c语言写词法分析的代码的功能的实现
只看楼主
书半生
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-6
结帖率:0
已结贴  问题点数:20 回复次数:6 
新手小白 求教大神c语言写词法分析的代码的功能的实现
#include<stdio.h>
#include<string.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum,e;
char * rwtab[6]={"function","if","then","while","do","endfunc"};
scaner();
main()
{
    p=0;
    printf("\n please input string:\n");
    do{
        scanf("%c",&ch);
        prog[++p]=ch;
    }
    while(ch!='#');
    p=0;
    do
    {
        scaner();
        switch(syn)
        {
       case 11:printf("\n(%d,%d)",syn,sum);
       break;
        case-1:printf("\n erron");
            break;
        default:printf("\n(%d,%s)",syn,token);
        }
    }
    while(syn!=0);
    return 0;
}
scaner()
{
    for(n=0;n<8;n++)token[n]=NULL;
    ch=prog[++p];
    while(ch!='#')ch=prog[++p];
        if(ch>='a'&&ch<='z')
        {
            m=0;
            while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9')
            {
                token[m++]=ch;
                ch=prog[++p];
            }
            token[m]='\0';
            ch=prog[--p];
            syn=10;
            for(n=0;n<6;n++)
                if(strcmp(token,rwtab[n])==0)
                {
                    syn=n+1;
                    break;
                }
            }
            else
                if(ch>='0'&&ch<='9')
                {
                    sum=0;
                    while(ch>='0'&&ch<='9')
                    {
                        sum=sum*10+ch-'0';
                        ch=prog[++p];
                    }
                    ch=prog[--p];
                    syn=11;
                }
                if(ch=='.')   //有小数点
                {
                 e=-1;
                 ch=prog[p++];
                 if(ch>='0'&&ch<='9')
                 {
                   while(ch>='0'&&ch<='9')
                   {
                       sum=sum+(ch-'0')*pow(10,e--);
                       ch=prog[p++];
                   }
                 }
                }
                else
                    switch(ch)
                {
                    case'<':m=0;
                        token[m++]=ch;
                        ch=prog[++p];
                        if(ch=='=')
                        {
                            syn=22;
                            token[m+1]=ch;
                        }
                        else
                        {
                            syn=20;ch=prog[--p];
                        }
                        break;
                    case'>':m=0;token[m++]=ch;
                        ch=prog[++p];
                        if(ch=='=')
                        {
                            syn=24;
                            token[m++]=ch;
                        }
                        else
                        {
                            syn=23;
                            ch=prog[--p];
                        }
                        break;
   
                    case'=':m=0;
                        token[m++]=ch;
                        ch=prog[++p];
                        if(ch=='=')
                        {
                            syn=25;
                            token[m++]=ch;
                        }
                        else
                        {
                            syn=18;
                            ch=prog[--p];
                        }
                        break;
                    case'!':m=0;token[m++]=ch;
                        ch=prog[++p];
                        if(ch=='=')
                        {
                            syn=22;token[m++]=ch;
                        }
                        else
                            syn=-1;
                        break;
                    case'+':syn=13;token[0]=ch;break;
                    case'-':syn=14;token[0]=ch;break;
                    case'*':syn=15;token[0]=ch;break;
                    case'/':syn=16;token[0]=ch;break;
                    case';':syn=26;token[0]=ch;break;
                    case'(':syn=27;token[0]=ch;break;
                    case')':syn=28;token[0]=ch;break;
                    case'#':syn=0;token[0]=ch;break;
                    default:syn=-1;
                }
                return 0;
}

————————————————————————————————————————
这个代码我们老师要求改成能够识别小数和实数的科学计数部分 大于1位的整数不能以0开头 且诸如1.或.1的形式是错误的 请问我该怎么改这个代码啊 求教大神讲解一下 万分感谢
搜索更多相关主题的帖子: function include please c语言 
2016-05-06 13:11
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:20 
你这个程序本来的功能是怎样的,能举例不
2016-05-06 13:26
书半生
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-6
得分:0 
回复 2楼 grmmylbs
本来的功能就是就是输入了数字之后,它会输出你输入的数字和相应的syn  现在就是要在这基础上改一下 最后能实现输入任意字符串 能够识别里面的小数或者实数
2016-05-06 13:36
书半生
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-6
得分:0 
回复 2楼 grmmylbs
能不能帮帮忙 实在没办法了 教教我也好啊 万分感谢
2016-05-06 17:51
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:0 
关键是看不懂你这程序到底实现了什么功能,你需要实现什么。让你举个例子也没有。
2016-05-06 17:52
书半生
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-6
得分:0 
回复 5楼 grmmylbs
就是 本来的程序功能是这样的
实验参考资料.pdf (76.46 KB)
实验一 这个就是个例子
 但是现在要求是要修改代码使它最后能在输入的字符串中识别实数或者小数的科学技术部分中 大于1位的整数不能以0开头 而且类似1. 或 .1这样的形式是错误的


QQ图片20160506181253.png (33.38 KB)
2016-05-06 18:19
书半生
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-6
得分:0 
最后比如输入这种字符串
要能识别实数或者小数的科学技术部分中 大于1位的整数不能以0开头 而且类似1. 或 .1这样的形式是错误的
2016-05-06 18:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-464459-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018709 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved