• 用C语言实现简单的词法分析器


    词法分析器又称扫描器。词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用。词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。


    要实现的词法分析器单词符号及种别码对照表:

    单词符号 # begin if then while do End + - * / : : =
    种别码 0 1 2 3 4 5 6 13 14 15 16 17 18

    单词符号 < <> <= > >= = ; ( ) Letter(letter|digit) digit digit*
    种别码 20 21 22 23 24 25 26 27 28 10 11


    #include<stdio.h>
    #include<string.h>
    char input[200];//存放输入字符串 
    char token[5];//存放构成单词符号的字符串 
    char ch;     //存放当前读入字符 
    int p;       //input[]下标 
    int fg;     //switch标记 
    int num;    //存放整形值 
    
    //二维字符数组,存放关键字 
    char index[6][6]={"begin","if","then","while","do","end"};
    main()
    {
     p=0;
     printf("please intput string(End with '#'):
    ");
    do
    {
     ch=getchar();
     input[p++]=ch;
    }while(ch!='#');
    p=0;
    do
    {
     scaner();
     switch(fg)
     {
      case 11:printf("( %d,%d )   ",fg,num);break;
      case -1:printf("input error
    ");  break;
      default:printf("( %d,%s )   ",fg,token);
     }
    }while(fg!=0);
    getch(); //用于让程序停留在显示页面
    }
    /*词法扫描程序:*/
    scaner()
    {
    	int m=0;//token[]下标 
    	int n;
    	
        //清空token[] 
        for(n=0;n<5;n++)
           token[n]=NULL;
      
        //获取第一个不为0字符 
        ch=input[p++];
        while(ch==' ')ch=input[p++];
      
        //关键字(标识符)处理流程 
        if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))
           {
              while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0'))
                 {
                     token[m++]=ch;
                     ch=input[p++];
                 }
              token[m++]='';
              ch=input[--p];
              fg=10;
              for(n=0;n<6;n++)
                 if(strcmp(token,index[n])==0)//strcmp()比较两个字符串,相等返回0 
                     {
                        fg=n+1;
                        break;
                     }
           }
           
         //数字处理流程 
         else if((ch<='9'&&ch>='0'))
         {
              num=0;
              while((ch<='9'&&ch>='0'))
              {
               num=num*10+ch-'0';
               ch=input[p++];
              }
               ch=input[--p];
               fg=11;
         }
         
         //运算符界符处理流程 
         else
             switch(ch)
              {
                 case '<':
    			     m=0;
    				 token[m++]=ch;
                     ch=input[p++];
                     if(ch=='>')          //产生<> 
                       {
                          fg=21;
                          token[m++]=ch;
                        }
                     else if(ch=='=')     //产生<= 
                       {
                          fg=22;
                          token[m++]=ch;
                       }
                     else
                       {
                          fg=20;
                          ch=input[--p];
                       }
                     break;
    		     case '>':
    			     token[m++]=ch;
                     ch=input[p++];
                     if(ch=='=')        //产生>= 
                       {
                          fg=24;
                          token[m++]=ch;
                       }
                     else               //产生> 
                       {
                          fg=23;
                          ch=input[--p];
                       }
                     break; 
    			 case ':':
    			     token[m++]=ch;
                     ch=input[p++];
                     if(ch=='=')        //产生:= 
                       {
                          fg=18;
                          token[m++]=ch;
                       }
                     else              //产生: 
                       {
                          fg=17;
                          ch=input[--p];
                       }
                     break;
                case '+':fg=13;token[0]=ch;break;
                case '-':fg=14;token[0]=ch;break;
                case '*':fg=15;token[0]=ch;break;
                case '/':fg=16;token[0]=ch;break;
                case ':=':fg=18;token[0]=ch;break;
                case '<>':fg=21;token[0]=ch;break;
                case '<=':fg=22;token[0]=ch;break;
                case '>=':fg=24;token[0]=ch;break;
                case '=':fg=25;token[0]=ch;break;
                case ';':fg=26;token[0]=ch;break;
                case '(':fg=27;token[0]=ch;break;
                case ')':fg=28;token[0]=ch;break;
                case '#':fg=0;token[0]=ch;break;
                default:fg=-1;
            }
    }


  • 相关阅读:
    你认为做好测试计划工作的关键是什么?
    一套完整的测试应该由哪些阶段组成?
    你对测试最大的兴趣在哪里?为什么?
    如何测试一个纸杯?
    黑盒测试和白盒测试各自的优缺点
    在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    测试人员在软件开发过程中的任务
    软件测试分为几个阶段? 各阶段的测试策略和要求是什么?
    软件测试的策略
    软件产品质量特性
  • 原文地址:https://www.cnblogs.com/coderkl/p/4320325.html
Copyright © 2020-2023  润新知