• 0929作业


    1词法分析器的功能 1)输入源程序 2)从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字

    2.

    单词符号

    种别码

    单词符号

    种别码

    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

    3.用文法描述词法规则

    <字母> A a|b|c|……y|z

    <数字> 
    A→1|2|3|4|5|6|7|8|9
    S→A|SA|SA0 
    <整数常数>
    A→1|2|3|4|5|6|7|8|9
    S→A|SA|SA0 
    <标识符>
    A→a|b|c|……y|z
    B→0|1|2|3|4|5|6|7|8|9
    S→A|SB
    <关键字>
    S→if|else|while|do|for|int|char|……
    <运算符>
    S→+|-|x|/|=|#|<|>|<=|>=|:=
    <界符>
    S→(|)|,|;|.

    #include <stdio.h>  
    #include <string.h>  
      
    char prog[80],token[8],ch;  
    int syn,p,m,n,sum;  
    char *rwtab[6]={"begin","if","then","while","do","end"};  
       
    void scaner(void);  
      
    main()  
    {  
        p=0;  
        printf("\n please input a string(end with '#'):\n");  
          
        do{  
                scanf("%c",&ch);  
                prog[p++]=ch;  
        }while(ch!='#');  
          
        p=0;  
        do{  
                scaner();  
                switch(syn)  
                {  
                    case 11:  
                        printf("( %-10d%5d )\n",sum,syn);  
                    break;  
                      
                    case -1:  
                        printf("you have input a wrong string\n");  
                        //getch();  
                        return 0;  
                    break;  
                      
                    default:   
                    printf("( %-10s%5d )\n",token,syn);  
                    break;  
                }  
            }while(syn!=0);  
        //getch();  
        return 0;
     }  
      
    void scaner(void)  
    {    
        sum=0;  
          
        for(m=0;m<8;m++)  
            token[m++]= NULL;  
          
            ch=prog[p++];  
            m=0;  
              
        while((ch==' ')||(ch=='\n'))  
            ch=prog[p++];  
          
        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  
         {   
            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))  
            {  
                token[m++]=ch;  
                ch=prog[p++];  
            }  
              
            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'))  
         {   
            while((ch>='0')&&(ch<='9'))  
            {  
                sum=sum*10+ch-'0';  
                ch=prog[p++];  
            }  
            p--;  
            syn=11;  
        }  
        else   
        {  
            switch(ch)  
            {  
            case '<':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {   
                    syn=22;  
                    token[m++]=ch;  
                }  
                else  
                {    
                    syn=20;  
                    p--;  
                }  
            break;  
      
            case '>':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {  
                    syn=24;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=23;  
                    p--;  
                }  
            break;  
      
            case '+':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='+')  
                {  
                    syn=17;  
                    token[m++]=ch;  
                }  
                else  
                {  
                    syn=13;  
                    p--;  
                }  
            break;  
      
            case '-':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='-')  
                {  
                    syn=29;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=14;  
                    p--;  
                }  
            break;  
      
            case '!':  
                ch=prog[p++];  
                if(ch=='=')  
                {   
                    syn=21;  
                    token[m++]=ch;  
                }  
                else  
                {   
                    syn=31;  
                    p--;  
                }  
            break;  
      
            case '=':  
                token[m++]=ch;  
                ch=prog[p++];  
                if(ch=='=')  
                {  
                    syn=25;  
                    token[m++]=ch;  
                }  
                else  
                {  
                    syn=18;  
                    p--;  
                }  
            break;  
      
            case '*':  
                syn=15;  
                token[m++]=ch;  
            break;  
      
            case '/':  
                syn=16;  
                token[m++]=ch;  
            break;  
      
            case '(':   
                syn=27;  
                token[m++]=ch;  
            break;  
      
            case ')':  
                syn=28;  
                token[m++]=ch;  
            break;  
      
            case '{':   
                syn=5;  
                token[m++]=ch;  
            break;  
      
            case '}':   
                syn=6;  
                token[m++]=ch;  
            break;  
      
            case ';':  
                syn=26;  
                token[m++]=ch;  
            break;  
      
            case '\"':  
                syn=30;  
                token[m++]=ch;  
            break;  
      
            case '#':   
                syn=0;  
                token[m++]=ch;  
            break;  
      
            case ':':  
                syn=17;  
                token[m++]=ch;  
            break;  
      
            default:  
                syn=-1;  
            break;  
            }  
        }  
            token[m++]='\0';  
    }
  • 相关阅读:
    etcd扩展使用
    etcd注册服务
    net core微服务构建方案
    一个简化的插件框架c#
    NSQ消息队列
    c#一些处理解决方案(组件,库)
    c#网络传输
    c#的传输组件dotnetty
    c#网络加密传输
    C++ Boost在Windows和Linux下的编译安装
  • 原文地址:https://www.cnblogs.com/SCJX/p/5924534.html
Copyright © 2020-2023  润新知