简单词法编译器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单词法编译器相关的知识,希望对你有一定的参考价值。

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

 

以上是关于简单词法编译器的主要内容,如果未能解决你的问题,请参考以下文章

编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器词法分析

简单词法编译器

编译原理词法分析 java简单实现

Java 实现《编译原理》简单词法分析功能

编译原理实验:实验一 简单词法分析程序设计(必修)(Python实现)