zoukankan      html  css  js  c++  java
  • 词法分析程序

    一、词法分析程序功能:
    词法分析器的功能为输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等
    (1) 关键字 是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。
    (2) 标识符 用来表示各种名字,如变量名,数组名,过程名等等。
    (3) 常数 常数的类型一般有整型、实型、布尔型、文字型等。
    (4) 运算符 如+、-、*、/等等。
    (5) 界符 如逗号、分号、括号、等等。

    二、符号与种别码对照表

    
    

    三、代码实现:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define SIZE 100
    char prog[SIZE],ch,token[8];
    int p=0,syn,n,i;
    char *keyword[6]={"begin","then","if","while","do","end"};//定义关键字数组
    void scaner();
    void main()
    {
        int select=-1;
        p=0;
        printf("请输入源程序字符串(以'#'结束):
    ");
        do
        {
            ch=getchar();
            prog[p++]=ch;
        }while(ch!='#');
        p=0;    
        do
        {
            scaner();
            switch(syn)
            {
            case -1:printf("词法分析 出错
    ");break;
            default :printf("<%d,%s>
    ",syn,token);break;
            }    
        }while(syn!=0);
        printf("词法分析 成功
    ");    
        getchar();    
    }
    void scaner()
    {    
        for(n=0;n<8;n++)
        {token[n]='';}
        n=0;
        ch=prog[p++];
        while(ch==' ')
        {ch=prog[p++];}    
        if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
        {
            do{
                token[n++]=ch;
                ch=prog[p++];
            }while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'));
            syn=10;        
            for(n=0;n<6;n++)//在六个关键字中对比
            {
                if(strcmp(token,keyword[n])==0)
                    syn=n+1;
            }
            p--;
        }
        else if(ch>='0'&&ch<='9')//判断输入的是否为整数常数
        {
            p--;
            do
            {
                token[n++]=prog[p++];
                ch=prog[p];
            }while(ch>='0'&&ch<='9');
            syn=11;    
            return;
        }
        else
        {
            switch(ch)
            {
            case '+':syn=13;token[0]=ch;break;
            case '-':syn=14;token[0]=ch;break;
            case '*':syn=15;token[0]=ch;break;
            case '/':syn=16;token[0]=ch;break;
            case ':':syn=17;token[0]=ch;
                ch=prog[p++];
                if(ch=='='){token[1]=ch;syn++;}
                else p--;
                break;
            case '<':syn=20;token[0]=ch;
                ch=prog[p++];
                if(ch=='>'){token[1]=ch;syn++;}
                else if(ch=='='){token[1]=ch;syn=syn+2;}
                else p--;
                break;
            case '>':syn=23;token[0]=ch;
                ch=prog[p++];
                if(ch=='='){token[1]=ch;syn++;}
                else p--;
                break;
            case '=':syn=25;token[0]=ch;break;
            case ';':syn=26;token[0]=ch;break;
            case '(':syn=27;token[0]=ch;break;
            case ')':syn=28;token[0]=ch;break;
            case '#':syn=0;token[0]=ch;break;            
            default: printf("词法分析出错! 请检查是否输入非法字符
    ");syn=-1;break;            
            }
        }
    }

    四、程序运行结果截图:

    
    
  • 相关阅读:
    6、Django模板语法
    django 使用form验证用户名和密码
    django 用户登陆的实现 构造类的方式
    django 登陆增加除了用户名之外的手机和邮箱登陆
    django xadmin的全局配置
    django xadmin app models 注册
    django之xadmin
    django后台数据管理admin设置代码
    django的所有app放在一个文件夹下便于管理
    django重写用户模型
  • 原文地址:https://www.cnblogs.com/171-LAN/p/5924836.html
Copyright © 2011-2022 走看看