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

    1.词法分析程序的功能

    I:对字符串表示的源程序

    P:根据词法规则从左到右进行扫描和分解

    O:识别出一个一个具有独立意义的单词符号以供语法分析之用

    E:发现语法错误,则返回出错信息

    2.符号与种别码的对照表

    3.词法规则

    4.代码与运行结果截图

    #include<stdio.h>
    #include<string.h>
    void scaner();
    main()
    {
        int p=0,row=1;
        char prog[80],token[8],ch;  
        int syn,m,n,sum;  
        char *rwtab[6]={"begin","if","then","while","do","end"}; 
        printf("词法分析
    ");
        printf("请输入一段程序(以#结束):");
        do{
            scanf("%c",&ch);
            prog[p++]=ch;
        }while(ch!='#');
        printf("词法分析结果如下:");
        do{  
                scaner(ch,prog,token);  
                switch(syn)  
                {  
                    case 11:  
                        printf("( %-10d%5d )
    ",sum,syn);  
                    break;  
                    case -1:  
                        printf("you have input a wrong string
    ");   
                        return 0;  
                    break;   
                    default:   
                    printf("( %-10s%5d )
    ",token,syn);  
                    break;  
                }  
            }while(syn!=0);  
    }
    void scaner(char ch, char prog[80],char token[8],)  
    {    
        int sum=0;  
        for(m=0;m<8;m++)  
            token[m++]= NULL;  
            ch=prog[p++];  
            m=0;     
        while((ch==' ')||(ch=='
    '))  
            ch=prog[p++];
        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  
         {   
            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))  
            {  
                token[m++]=ch;  
                ch=prog[p++];  
            }  
              
            p--;  
            syn=10;  
      
            for(n=0;n<6;n++)  
            if(strcmp(token,rwtab[n])==0)  
            {   
                syn=n+1;  
                break;  
            }  
         }  
         else if((ch>='0')&&(ch<='9'))  
         {   
            while((ch>='0')&&(ch<='9'))  
            {  
                sum=sum*10+ch-'0';  
                ch=prog[p++];  
            }  
            p--;  
            syn=11;  
        }  
        else   
        {  
            switch(ch)  
            {  
            case '<':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {   
                    syn=22;  
                    token[m++]=ch;  
                }  
                else  
                {    
                    syn=20;  
                    p--;  
                }  
            break;  
            case '>':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {  
                    syn=24;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=23;  
                    p--;  
                }  
            break;  
            case '+':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='+')  
                {  
                    syn=17;  
                    token[m++]=ch;  
                }  
                else  
                {  
                    syn=13;  
                    p--;  
                }  
            break;  
      
            case '-':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='-')  
                {  
                    syn=29;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=14;  
                    p--;  
                }  
            break;  
      
            case '!':  
                ch=prog[p++];  
                if(ch=='=')  
                {   
                    syn=21;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=31;  
                    p--;  
                }  
            break;  
      
            case '=':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {  
                    syn=25;  
                    token[m++]=ch;  
                }  
                else  
                {  
                    syn=18;  
                    p--;  
                }  
            break;  
      
            case '*':  
                syn=15;  
                token[m++]=ch;  
            break;  
      
            case '/':  
                syn=16;  
                token[m++]=ch;  
            break;  
      
            case '(':   
                syn=27;  
                token[m++]=ch;  
            break;  
      
            case ')':  
                syn=28;  
                token[m++]=ch;  
            break;  
      
            case '{':   
                syn=5;  
                token[m++]=ch;  
            break;  
      
            case '}':   
                syn=6;  
                token[m++]=ch;  
            break;  
      
            case ';':  
                syn=26;  
                token[m++]=ch;  
            break;  
      
            case '"':  
                syn=30;  
                token[m++]=ch;  
            break;  
      
            case '#':   
                syn=0;  
                token[m++]=ch;  
            break;  
      
            case ':':  
                syn=17;  
                token[m++]=ch;  
            break;  
      
            default:  
                syn=-1;  
            break;  
            }  
        }
        token[m++]='';  
    }  
  • 相关阅读:
    MySQL Binlog信息查看
    MySQL Binlog和Relaylog生成和清理
    MySQL Binlogbinlog_format参数
    Maven的核心概念及安装
    Maven工程约定目录结构
    解决 internal/modules/cjs/loader.js:983 throw err; ^ Error: Cannot find module ‘express‘ 报错问题
    Linux之开机、重启和用户登录注销等操作
    Linux之系统文件概述
    Linux之基本指令
    express的基本使用
  • 原文地址:https://www.cnblogs.com/swxvico/p/5923832.html
Copyright © 2011-2022 走看看