简单词法编译器

1.词法分析程序的功能:

词法分析器所输出单词符号常常表示成如下的二元式:

(单词种别,单词符号的属性值)

单词种别通常用整数编码。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种。运算符可采用一符一种的方法。界符一般用一符一种的方法。对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息。单词符号的属性是指单词符号的特性或特征。
2.符号和种别码的对照表:

3.用文法描述词法规则:

程序设计语言中的几类单词可用下述规则描述:

1.增长的趋势:a^2n,aa aaaa aaaaaa........

                        b^2n,bb bbbb bbbbbb.......

 2.循环规律:A->aa  A->Aaa

                     B->bb B->Bbb

 3.S->A|B

     A->aa|Aaa // 意思是aa为开头,循环不断增加aa

     B->bb|Bbb // 意思是bb为开头,循环不断增加bb

 

4.已完成的代码:

#include<stdio.h>
#include<string.h>
char one[9][10]={"begin","if","then","while","do","end","main","int","char"};
int number;

int fenxi(char a[],int p)
{
    char b[10];
    int i=0,j=1,q;
    do{
        b[0]=a[i];
        if((b[0]>='a'&&b[0]<='z')||(b[0]>='A'&&b[0]<='Z'))
        {
            for(j=1;j<10;j++)
            {
                b[j]=a[j];
                if(b[j]==' ')
                {
                    b[j]='\0';
                    p=j;
                    break;
                }
            }
            b[j+1]='\0';
            puts(a);
            puts(b);
            for(j=0;j<9;j++)
                if(strcmp(b,one[j])==0)
                {
                    printf("(%d,%s)",j+1,b);
                    q=0;
                    return p;
                }
                else
                    q=1;
            if(q==1)
            {
                printf("(10,%s)",b);
            }
            return p;
        }
        if((b[0]>=0)&&(b[0]<=9))
        {
            for(j=1;j<10;j++)
            {
                b[j]=a[j];
                if(b[j]==' ')
                {
                    b[j]='\0';
                    p=j;
                    break;
                }
            }
            printf("(11,%s)",b);
            return p;
        }
        if((b[0]=='+')||(b[0]=='-')||(b[0]=='*')||(b[0]=='/')||(b[0]=='=')||(b[0]=='(')||(b[0]==')')||(b[0]=='#'))
        {
            if(a[1]!=' ')
                p=1;
            else
                p=2;
            switch(b[0])
            {
            case '+':j=13;break;
            case '-':j=14;break;
            case '*':j=15;break;
            case '/':j=16;break;
            case '=':j=25;break;
            case ';':j=26;break;
            case '(':j=27;break;
            case ')':j=28;break;
            case '#':j=0;break;
            }
            printf("(%d,%s)",j,b);
            return p;
        }
        if((b[0]==':')||(b[0]=='>')||(b[0]=='<'))
        {
            puts(a);
            if((a[1]!='=')&&(a[1]!='>')&&a[1]!='<')
            {
                switch(b[0])
                {
                case ':':j=17;break;
                case '<':j=20;break;
                case '>':j=23;break;
                }
                printf("(%d,%s)",j,b);
                return p;
            }
            else
            {
                b[1]=a[1];
                b[2]='\0';
                p=2;
                if((b[0]==':')&&(b[1]=='='))j=18;
                else if((b[0]=='<')&&(b[1]=='='))j=21;
                else if((b[0]=='>')&&(b[1]=='='))j=24;
                else if((b[0]=='<')&&(b[1]=='>'))j=22;
                printf("(%d,%s)",j,b);
                return p;
            }
        }


    }while(0);
}
void maopao(char a[],int p)
{
    int i;
    for(i=0;a[p+i]!='\0';i++)
        a[i]=a[p+i+1];
}


main()
{
    char a[100];
    int p;
    printf("ÇëÊäÈëÒ»¶Î³ÌÐò£º");
    gets(a);
    do{
        p=fenxi(a,p);
        maopao(a,p);
    }while(a[0]!='\o');

    printf("%d",p);
}

 

posted @ 2016-09-30 20:45  风丶轻轻  阅读(367)  评论(0编辑  收藏  举报