zoukankan      html  css  js  c++  java
  • 作业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、测试结果

  • 相关阅读:
    为什么 PHP 程序员应该学习使用 Swoole
    如何优雅的使用和理解线程池
    Redis 数据结构-字符串源码分析
    MySQL多版本并发控制机制(MVCC)-源码浅析
    Spring事务用法示例与实现原理
    J2Cache 和普通缓存框架有何不同,它解决了什么问题?
    Spring Aop之Cglib实现原理详解
    Python中字符串拼接的N种方法
    使用Fiddler抓取到的“姐夫酷”API接口
    [Android]Space控件的应用场景
  • 原文地址:https://www.cnblogs.com/momo-er/p/11651353.html
Copyright © 2011-2022 走看看