• 作业5 词法分析程序的设计与实现


    词法分析程序(Lexical Analyzer)要求:

    - 从左至右扫描构成源程序的字符流

    -  识别出有词法意义的单词(Lexemes

    -  返回单词记录(单词类别,单词本身)

    -  滤掉空格

    -  跳过注释

    -  发现词法错误

    程序结构:

    输入:字符流(什么输入方式,什么数据结构保存)

    处理:

    –遍历(什么遍历方式)

    –词法规则

    输出:单词流(什么输出形式)

    –二元组

    单词类别:

    1.标识符(10)

    2.无符号数(11)

    3.保留字(一词一码)

    4.运算符(一词一码)

    5.界符(一词一码)

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    :

    17

    if

    2

    :=

    18

    then

    3

    <

    20

    while

    4

    <=

    21

    do

    5

    <>

    22

    end

    6

    >

    23

    l(l|d)*

    10

    >=

    24

    dd*

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    char prog[800],token[8];//程序段,单词符号
    char ch,error;
    int syn,p,m,n,sum;//单词符号类型syn,整数sum,p当前要识别程序段第一个字符指针p
    char *word[6]={"begin","if","then","while","do","end"};
    int main(){
     p=0;
     printf(" 请输入程序段:");
     do{
      ch=getchar();
      prog[p++]=ch;
     } while(ch!='#');
     p=0;
     
     do{ 
      ch=prog[p++];
     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 '#':
       for(int i=0;i<8;i++)
        token[i]=NULL;
       syn=0;token[0]=ch;
       break;
      default:
       if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
        m=0;
        while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
         token[m++]=ch;
         ch=prog[p++];
        }
        token[m++]='';
        p--;
        syn=10;
        for(int i=0;i<6;i++){
         if(strcmp(word[i],token)==0){
          syn=i+1;
          break;
         }
        }
     
       }else if((ch>='0'&&ch<='9')){
        sum=0;
        while(ch>='0'&&ch<='9'){
         sum=sum*10+(ch-'0');
         ch=prog[p++];
        }
        p--;
        syn=11;
        
       }else if(ch==' '){
        ch=prog[p];
        syn=100;
        
       }else{
        int n=p-1;
        syn=-1;
        error=prog[n];
     
       }
       break;
      
      }
      switch(syn){
       case 100:
        break;
       case 11:
        printf(" (%d,%d)",syn,sum);
        break;
       case -1:
        printf(" 无'%c'符号!",error);
        break;
       default:
        printf(" (%d,%s)",syn,token);
        break;
      }
     }while(syn!=0);
    }

    2、测试结果

  • 相关阅读:
    2020Python作业——类与对象
    图文存储常识:单机、集中、分布式、云、云原生存储
    宜泊科技加入阿里云原生合作伙伴计划,共建智慧停车新生态
    dubbogo 3.0:牵手 gRPC 走向云原生时代
    千万商家的智能决策引擎AnalyticDB如何助力生意参谋双十一
    我在阿里云做前端代码智能化
    网络病毒源的排查(2005年3月22日维护记录)
    在页面中控制媒体流的起播点和播放长度
    注意服务器系统日期对防病毒软件的影响
    修改SQL SERVER虚拟服务器IP的问题
  • 原文地址:https://www.cnblogs.com/momo-er/p/11651353.html
Copyright © 2020-2023  润新知