| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 308 人关注过本帖
标题:词法分析程序,但是老输不出分析的结果
只看楼主 加入收藏
新月飞鸟
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-10-22
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:5 
词法分析程序,但是老输不出分析的结果
程序代码:
[local]2[/local]#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char prog[80], token[8];
char ch;
int syn, p, m, n, sum=0;
char * rwtab[6]={"begin","if","then","while","do","end"};

void scaner()
{

 
         //分别是标示符、数字、符号,对应下面的 if   else if  和 else

    for(n=0;n<8;n++) token[n]=NULL;//初始化
    ch=prog[p++];//读下一个 字符
    while(ch==' ')
    ch=prog[p++];
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))  //ch是字母字符,可能是关键字或者变量名
    {
        m=0;
        while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//ch为字母字符或数字字符
        {
            token[m++]=ch;
            ch=prog[p++];
        }
        token[m++]='\0';
        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'))  //ch是数字字符
        {
                    sum=0;
                    while((ch>='0'&&ch<='9'))
                    {
                    sum=sum*10+ch-'0';
                    ch=prog[p++];
                    }
           
            p--;//回退一个字符
            syn=11;
            if(sum>32767)
            syn=-1;
        }

    else switch(ch)   //其他字符
  
    {
        case'<':m=0;token[m++]=ch;
            ch=prog[p++];
            if(ch=='>')
            {
                syn=21;
                token[m++]=ch;
            }
            else if(ch=='=')
            {
                syn=22;
                token[m++]=ch;
            }
            else
            {
                syn=23;
                p--;
            }
            break;
        case'>':m=0;token[m++]=ch;
            ch=prog[p++];
            if(ch=='=')
            {
                syn=24;
                token[m++]=ch;
            }
            else
            {
                syn=20;
                p--;
            }
            break;
        case':':m=0;token[m++]=ch;
            ch=prog[p++];
            if(ch=='=')
            {
                syn=18;
                token[m++]=ch;
            }
            else
            {
                syn=17;
                p--;
            }
            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=25;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;
        case'\n':syn=-2;break;
        default: syn=-1;break;
    }
}

void main()
{

   FILE *fin=fopen("in.txt","r");
   FILE *fout=fopen("out.txt","w");
   p=0;
   printf("程序如下:\n");
   while(!feof(fin)&&ch!='#')
    {
        ch=fgetwc(fin);
        prog[p]=ch;
        printf("%c",prog[p]);
        p++;
    }
    printf("\n********************词法分析如下*********************\n"); 

    p=0;
    do{
        scaner();
        switch(syn)
        {
            case 11: printf("%d","%d",syn,sum); break;
            case -1: printf("error"); break;
            default: printf("%c","%d",syn,token); 
   
        }
    }
    while (syn!=0);
    fclose(fin);
    fclose(fout);
}


in.rar (456 Bytes)
搜索更多相关主题的帖子: include 
2012-12-11 16:57
深藏依旧
Rank: 2
等 级:论坛游民
帖 子:45
专家分:93
注 册:2012-12-8
收藏
得分:0 
编译的时候没错 只是说明没有语法错误,并不代表没有逻辑错误。你采用跟踪法去看一下那块有逻辑错误

厚积薄发
2012-12-11 21:12
深藏依旧
Rank: 2
等 级:论坛游民
帖 子:45
专家分:93
注 册:2012-12-8
收藏
得分:15 
我试了一下你这块应该有逻辑错误,程序运行到这就运行不了了
while(!feof(fin)&&ch!='#')
     {
         ch=fgetwc(fin);
         prog[p]=ch;
         printf("%c",prog[p]);
         p++;
     }
你分析一下看是不是有逻辑问题

厚积薄发
2012-12-11 21:20
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:5 
耐心调试一下

编译原理的作业吧  后面还有语法分析器呢

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-12-12 10:07
新月飞鸟
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-10-22
收藏
得分:0 
回复 3楼 深藏依旧
但是奇怪的是while循环里可以把prog数组打印出来,while循环外我设立了个for循环打印prog数组就不行了。原因应该是文件里的数据没有传给数组,但我始终不知道怎么解决
2012-12-13 22:21
新月飞鸟
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-10-22
收藏
得分:0 
回复 4楼 mmmmmmmmmmmm
恩呢~~编译原理的实验呢
2012-12-13 22:23
快速回复:词法分析程序,但是老输不出分析的结果
数据加载中...
 
   



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

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