zoukankan      html  css  js  c++  java
  • 2016.9.30词法分析程序 108

    单词符号

    种别码

    单词符号

    种别码

    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 TOken[10];//分开进行比较 
    char ch;
    
    char r1[]={"begin"};
    char r2[]={"if"};
    char r3[]={"then"};
    char r4[]={"while"};
    char r5[]={"do"};
    char r6[]={"end"};
    
    
    char A[10000];//输入的所有值 
    int syn,row;
    int n,m,p,sum,j;
    static int i = 0;
    void scaner();
    
    main()
    { 
        row = 0 ;
        p = 0 ;
        printf("请输入字符串:(#为结束)\n");
        do
        {
            scanf("%c",&ch);
            A[p]=ch;
            p++;
        }//输入值到数组A【】中,以#结束 
        while(ch!='#');
        do
        {
            scaner();//进入函数进行判定 
            switch(syn)
            {
            case 11: printf("(%d,%d)\n",syn,sum); break;//如果是11,那么就是数字 
            case 0: printf("(%d,%c)\n",syn,TOken[0]);break;//如果是0,那么是# 结束 
            case -2: row=row++;break;
            case -1:break;
            default: printf("(%d,%s)\n",syn,TOken);break;//否则,就是变量名、关键词 
            }
        }
        while (syn!=0);
    }
    
    
    void scaner()
    {
        for(n=0;n<7;n++) 
            TOken[n]=0;//每次循环完就清零 
        ch=A[i];
        while(ch==' '||ch=='\n')//如果字符是空格或者回车,跳过 
        {
            i++;
            ch=A[i];
        }
        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;m++;
                i++;ch=A[i];
            }
            TOken[m]='\0';//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2...... 
            if(strcmp(TOken,r1)==0){syn=1;}
            else if(strcmp(TOken,r2)==0){syn=2;}
            else if(strcmp(TOken,r3)==0){syn=3;} 
            else if(strcmp(TOken,r4)==0){syn=4;}
            else if(strcmp(TOken,r5)==0){syn=5;}
            else if(strcmp(TOken,r6)==0){syn=6;}
            else{syn=10;}    //变量名 
        }
        else if((ch>='0'&&ch<='9')) //数字 
        {
            sum=0;
            while((ch>='0'&&ch<='9'))
            {
                sum=sum*10+ch-'0';//显示其数字sum 
                i++;
                ch=A[i];
            }
            syn=11;
        }
        else switch(ch) //其他字符 
        {
    case'<':
        m=0;
        TOken[m]=ch;
        m++;
        i++;
        ch=A[i];
        if(ch=='=')
        {
            syn=21;
            TOken[m]=ch;
            m++;
            i++;
        }
        else if(ch=='>') 
        {
            syn=22;
            TOken[m]=ch;
            m++;
            i++;
        }
        else
        {
            syn=20;
        }break;
    case'>':
        m=0;
        TOken[m]=ch;
        m++;
        i++;
        ch=A[i];
        if(ch=='=')
        {
            syn=24;
            TOken[m]=ch;
            m++;
            i++;
        }
        else
        {
            syn=23;
        }break;
    case':':
        m=0;
        TOken[m]=ch;
        m++;
        i++;
        ch=A[i];
        if(ch=='=')
        {
            syn=18;
            TOken[m]=ch;
            m++;
            i++;
        }
        else
        {
            syn=17;
        }break; 
    case'+':syn=13;TOken[0]=ch;i++;break; 
    case'-':syn=14;TOken[0]=ch;i++;break;
    case'*':syn=15;TOken[0]=ch;i++;break;
    case'/':syn=16;TOken[0]=ch;i++;break; 
    case'=':syn=25;TOken[0]=ch;i++;break;
    case';':syn=26;TOken[0]=ch;i++;break;
    case'(':syn=27;TOken[0]=ch;i++;break;
    case')':syn=28;TOken[0]=ch;i++;break; 
    case'#':syn=0;TOken[0]=ch;i++;break; 
    case'\n':syn=-2;break;
    default:syn=-1;
        }
    }

     

  • 相关阅读:
    flush logs
    slave-skip-errors,sql_slave_skip_counter
    稀饭
    table
    profiles
    索引使用规范
    innodb_rollback_on_timeout
    mysql账号管理
    跨库复制
    linux.sh
  • 原文地址:https://www.cnblogs.com/yxbdbolgs/p/5924947.html
Copyright © 2011-2022 走看看