• 简单词法编译器


    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]='';
                        p=j;
                        break;
                    }
                }
                b[j+1]='';
                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]='';
                        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]='';
                    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]!='';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);
    }
  • 相关阅读:
    leetcode题目19.删除链表的倒数第N个节点(中等)
    Android学习笔记---使用Service模仿下载效果
    Android学习笔记-简单聊天界面的实现
    Android学习笔记-ContentProvider操作
    Android高级-Android操作SQL数据管理,增删改查
    Android高级-正则表达式
    Android高级-SQL语言
    Android学习之路-录音功能实现
    gitee上传下载代码命令
    opencv进行视频播放每帧处理,读取视频失败
  • 原文地址:https://www.cnblogs.com/zzrf/p/5924865.html
Copyright © 2020-2023  润新知