• 词法分析程序实验


    一、词法分析程序的功能

    输入一段字符串,从字符串表示的源程序中识别出具有独立意义的单词符号,根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

    二、符号与种别码对照表

    单词符号

    种别码

    单词符号

    种别码

    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

    三、用文法描述词法规则

    <字母>:A→a|b|c|…|X|Y|Z
    <数字>:B→0|1|2|…|9
    <整数常数>:Z→C|ZC

                       C→0|1|2|...|9
    <标识符>: I→X|IX|ID
    X→a|b|c|…|X|Y|Z|_

    D→0|1|2|...|9
    <关键字>: K→const|var|procedure|begin|end|odd|if|then|call|while|do|read|write
    <运算符>: Y→+|-|*|/|=|#|<|<=|>|>=|!=
    <界符>: J→(|)|,|;|.

    四、c语言源代码和运行结果截图

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    char prog[80]; 
    char token[8]; 
    char ch; 
    int syn,p,m,n; 
    double sum;     
    int count;
    
    int isSignal; 
    
    int isDecimal;
    double decimal; 
    int isExp;  
    int index;  
    int isNegative; 
    double temp;
    int temp2;
    
    void scanner();
    
    char *rwtab[6]={"begin","if","then","while","do","end"};
    
    void main()
    {
        p=0;
        count=0;
        isDecimal=0;
        index=0;
        printf("请输入字符串:
    ");
        do{
            ch=getchar();
            prog[p++]=ch;
        }while(ch!='#'); 
    
        p=0;
        do{
            scanner(); 
            switch(syn)
            {
            case 11:
                if(isDecimal==0)
                {
                    printf("(%2d,%8d)
    ",syn,(int)sum);
                    break;
                }
                else if(isExp==1)
                {
                    printf("(%2d,%10.5e)
    ",syn,sum);
                    isExp=0;
                    isDecimal=0;
                    break;
                }
                else if(isDecimal==1)
                {
                    printf("(%2d,%8.4f)
    ",syn,sum);
                    isDecimal=0;
                    break;
                }
            case -1:
                printf("input error
    ");
                break;
            default:
                printf("(%2d,%8s)
    ",syn,token);
            }
        }while(syn!=0);
    }
    
    void scanner()
    {
        sum=0;
        decimal=0;
        m=0;
    
        for(n=0;n<8;n++)
            token[n]=NULL;
        ch=prog[p++]; 
        while(ch==' ')  
            ch=prog[p++];
    
        if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z')))
        {
            while(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||((ch>='0')&&(ch<='9')))
            {
                token[m++]=ch;
                ch=prog[p++]; 
            }
            token[m++]='';
            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'))
        {
    IsNum:
       if(isSignal==1)
       {
           
       }
            while((ch>='0')&&(ch<='9'))
            {
                sum=sum*10+ch-'0'; 
                ch=prog[p++];
            }
            if(ch=='.')
            {
                isDecimal=1;
                ch=prog[p++];
                while((ch>='0')&&(ch<='9'))
                {
                    
                    temp=(ch-'0')*pow(0.1,++count);
                    decimal=decimal+temp;
                    
                    ch=prog[p++];
                }
                sum=sum+decimal;
            }
            if(ch=='e'||ch=='E')
            {
                isExp=1;
                ch=prog[p++];
                if(ch=='-')
                {
                    isNegative=1;
                    ch=prog[p++];
                }
                while((ch>='0')&&(ch<='9'))
                {
                    
                    index=index*10+ch-'0';
                    ch=prog[p++];
                }
                if(isNegative)
                    sum=sum*pow(0.1,index);
                else
                    sum=sum*pow(10,index);
    
            }
            if(isSignal==1)
            {
                sum=-sum;
                isSignal=0;
            }
            p--;
            syn=11;
        }
    
        else switch(ch)
        {
            case '<':
                m=0;
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='>')
                {
                    syn=21; 
                    token[m++]=ch;
                }
                else if(ch=='=')
                {
                    syn=22;
                    token[m++]=ch;
                }
                else
                {
                    syn=20;
                    p--;
                }
                break;
    
            case '>':
                m=0;
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='=')
                {
                    syn=24;
                    token[m++]=ch;
                }
                else
                {
                    syn=23;
                    p--;
                }
                break;
    
            case ':':
                m=0;
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='=')
                {
                    syn=18;
                    token[m++]=ch;
                }
                else
                {
                    syn=17;
                    p--;
                }
                break;
    
            case '+':
                temp2=prog[p];
                if((temp2>='0')&&(temp2<='9'))
                {
                    isSignal=2;
                    ch=prog[p++];
                    goto IsNum;
                }
                syn=13;
                token[m++]=ch;
                break;
            case '-':
                temp2=prog[p];
                if((temp2>='0')&&(temp2<='9'))
                {
                    isSignal=1;
                    ch=prog[p++];
                    goto IsNum;  
                }
                syn=14;
                token[m++]=ch;
                break;
            case '*':
                syn=15;
                token[m++]=ch;
                break;
            case '/':
                syn=16;
                token[m++]=ch;
                break;
            case '=':
                syn=25;
                token[m++]=ch;
                break;
            case ';':
                syn=26;
                token[m++]=ch;
                break;
            case '(':
                syn=27;
                token[m++]=ch;
                break;
            case ')':
                syn=28;
                token[m++]=ch;
                break;
            case'#':
                syn=0;
                token[m++]=ch;
                break;
            default:
                syn=-1;
        }
    }

     

  • 相关阅读:
    【Java】组合 继承 代理
    《Thinking In Java》笔记之十三章 字符串
    常用Dos命令
    Thinking in Java异常笔记与习题
    php去重 逗号分隔的字符串
    php 连接本地数据库
    vue重载子组件
    小程序更改checked样式
    JavaScript中两个数组的拼接
    FROM_UNIXTIME()时间戳转换函数
  • 原文地址:https://www.cnblogs.com/xuyizhu/p/5924490.html
Copyright © 2020-2023  润新知