首页 > 代码库 > 简单词法编译器

简单词法编译器

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);}

 

简单词法编译器