zoukankan      html  css  js  c++  java
  • 第五次作业 词法分析程序的设计与实现

     

    词法分析程序(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[20];//程序段,单词符号 
    char ch;
    int syn,p,n,sum,s,i;
    char *word[6]={"begin","if","then","while","do","end"};
    void compile(){
        for(int i=0;i<20;i++){
          token[i]=NULL;
        }
        ch=prog[p++];
          
        while(ch == ' '){
            ch=prog[p];
            p++;
        }
        if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){//判断字母 ,标识符 
             s=0;
            while((ch>='0' && ch<='9')||(ch>='a' && ch<='z')||(ch>='A'&&ch<='Z')){
                token[s++]=ch;
                ch=prog[p++];
            }
            p--;
            syn=10;
            for(int n=0;n<6;n++){//保留字 
                if(strcmp(word[n],token)==0){//比较关键字 
                    syn=n+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 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=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;
            case':':
                    i=0;
                    token[i++]=ch;
                    ch=prog[p++];
                    if(ch=='='){
                        token[i++]=ch;
                        syn=18;
                    }else {
                        syn=17;
                        p--;
                    }break;
            case'<':
                    i=0;
                    token[i++]=ch;
                    ch=prog[p++];
                    if(ch=='='){
                        token[i++]=ch;
                        syn=21;
                    }else if(ch=='>'){
                         token[i++]=ch;
                         syn=22;
                    }else{
                        syn=20;
                        p--;
                    }break;
            case'>':
                    i=0;
                    token[i++]=ch;
                    ch=prog[p++];
                    if(ch=='='){
                        token[i++]=ch;
                        syn=24;
                    }else{
                        syn=23;
                        p--;
                        
                    }break;
                    
             case'
    ':syn=-2;break;
                 
               default:
                    syn=-1;
                    break;    
        }
       
    } 
    
    
    
    int main(){
       p=0;
       int l=1;
        printf("请输入源程序(以#结束):");
        do{
            ch=getchar();
            prog[p++]=ch;
        
        }while (ch!='#');
        
        printf("
    (%s)
    ",prog);
        p=0;
        
        do{
        
        compile();
        switch(syn){
            case 11:printf("
    <%d,%d>",syn,sum);break;
            
            case -2:l+=1;break;
            
            case -1:printf("在第%d行有错误!",l);break;
            
            default:printf("
    <%d,%s>",syn,token);break;
        }
     }while(syn!=0);
    }

    运行截图:

  • 相关阅读:
    jQuery自定义插件
    jQuery基础入门学习
    jQuery事件机制
    css实现块级元素的水平居中的2种常用方法
    文本编辑的css常用属性
    js的事件的绑定
    js正则表达式(常用)
    汇编初入门debug实操
    JAVA新手笔记 Intent对象和Bundle对象
    OS X运行AFNI的AlphaSim提示libgomp.1.dylib找不到的解决办法
  • 原文地址:https://www.cnblogs.com/cndl/p/11650585.html
Copyright © 2011-2022 走看看