[求助]编写简单的词法分析器时遇到的困难[编译原理]
token用来存放构成单词符号的字符串
sum用来存放整形单词
syn用来存放单词符号的种别码
例如输入
begin x:=9 if x>0 then x:2*x+1/3; end #
输出
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)...........
源程序如下,输出结果不正确,请大家指教
#include<stdio.h>
#include<string.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};//待识别的6个关键字,种别码分别为1,2,3,4,5,6
void scaner();
void main()
{
    p=0;
    printf("Please input string: \n");
    do
    {
        scanf("%s",&ch);
        prog[p]=ch;
        p++;
    }while(ch!='#');
    p=0;
    do
    {
        scaner();
        switch(syn)
        {
        case 11:printf("(11,%s)",token); break;
        case -1:printf("Error!");break;
        default:printf("(%d,%s)",syn,token);
        }
    }while(syn!=0);
}
void scaner()
{
    for(n=0;n<8;n++) token[n]=NULL;
    ch=prog[0];//读取第一个字符
    token[0]=prog[0];
    while(ch==' ')//第一个字符是空格的时候,继续读下一个字符
    {
        p=p+1;
        ch=prog[p];
    }
    //识别字符串和关键字
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
    {
        p=p+1;
        ch=prog[p];//读取第二个字符
        while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
        {
            token[m++]=ch;
            p=p+1;//读取下一个字符
            ch=prog[p];
        }
        if(token[m]=' ')
        {
            p=p-1;
            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转化成int型
            p=p+1;//读取下一个字符
            ch=prog[p];
        }
        if(ch=' ')
        {
            p=p-1;
            ch=prog[p];
        }
        token[m]=sum;
    }
    //识别界符
    else
    {
        switch(ch)
        {
        case '<':p=p+1;
                ch=prog[p];
                if(ch=='>')
                {
                    syn=21;
                    token[m++]=ch;
                }
                else if(ch=='=')
                {
                    syn=22;
                    token[m++]=ch;
                }
                else
                {
                    syn=20;
                    p=p-1;
                    ch=prog[p];
                }
                break;
        case '>':p=p+1;
                 ch=prog[p];
                 if(ch=='=')
                 {
                    syn=24;
                    token[m++]=ch;
                 }
                 else
                 {
                    syn=23;
                    p=p-1;
                    ch=prog[p];
                 }
                 break;
        case ';':p=p+1;
                ch=prog[p];
                if(ch=='=')
                {
                    syn=18;
                    token[m++]=ch;
                }
                else
                {
                    syn=17;
                    p=p-1;
                    ch=prog[p];
                }
                break;
        case '+':syn=13;token[m++]=ch;break;
        case '-':syn=14;token[m++]=ch;break;
        case '*':syn=15;token[m++]=ch;break;
        case '/':syn=16;token[m++]=ch;break;
        case '=':syn=25;token[m++]=ch;break;
        case '(':syn=27;token[m++]=ch;break;
        case ')':syn=28;token[m++]=ch;break;
        case '#':syn=0;token[m++]=ch;break;
        default:syn=-1;
        }
    }
}

 
											





 
	    

