zoukankan      html  css  js  c++  java
  • 词法分析

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
    int InputDate(char input[]);    
    void PrintDate(char input[]);    
    int NoSign_Number(char a);          
    int NOSign2(char a);              
    int NOSign(char a);                
     
    void main()
    {
    int i,length,flag=0;
    char input[1000];
    length=InputDate(input);
    printf("输入完成! ");
    printf(" 输入内容是: ");
    PrintDate(input);
    printf(" 词法分析:");
    printf(" ------------------ ");
    for(i=0;i<length;i++)
    {
    switch(input[i])
    {
    case 'b':
    if(strncmp("egin",input+i+1,4)==0&&NoSign_Number(input[i-1])&&NoSign_Number(input[i+5]))
    {
    printf("begin 1 ");
    i+=4;
    break;
    }
    goto TT;
    case 'i':
    if(strncmp("f",input+i+1,1)==0&&NoSign_Number(input[i+2])&&NoSign_Number(input[i-1]))
    {
    printf("if 2 ");
    i+=1;
    break;
    }
    goto TT;
    case 't':
    if(strncmp("hen",input+i+1,3)==0&&NoSign_Number(input[i+4])&&NoSign_Number(input[i-1]))
    {
    printf("then 3 ");
    i+=3;
    break;
    }
    goto TT;
    case 'w':
    if(strncmp("hile",input+i+1,4)==0&&NoSign_Number(input[i+5])&&NoSign_Number(input[i-1]))
    {
    printf("while 4 ");
    i+=4;
    break;
    }
    goto TT;
    case 'd':
    if(strncmp("o",input+i+1,1)==0&&NoSign_Number(input[i+2])&&NoSign_Number(input[i-1]))
    {
    printf("do 5 ");
    i+=1;
    break;
    }
    goto TT;
    case 'e':
    if(strncmp("nd",input+i+1,2)==0&&NoSign_Number(input[i+3])&&NoSign_Number(input[i-1]))
    {
    printf("end 6 ");
    i+=2;
    break;
    }
    goto TT;
    case '+':
    printf("+ 13 ");
    break;
    case '-':
    printf("- 14 ");
    break;
    case '*':
    printf("* 15 ");
    break;
    case '/':
    printf("/ 16 ");
    break;
    case ':':
    if(strncmp("=",input+i+1,1)==0)
    {
    printf(":= 18 ");
    i+=1;
    }
    else
    printf(": 17 ");
    break;
    case '<':
    if(strncmp("=",input+i+1,1)==0)
    {
    printf("<= 21 ");
    i+=1;
    }
    else if(strncmp(">",input+i+1,1)==0)
    {
    printf("<> 22 ");
    i+=1;
    }
    printf("< 20 ");
    break;
    case '>':
    if(strncmp("=",input+i+1,1)==0)
    {
    printf(">= 24 ");
    i+=1;
    }
    else
    printf("> 23 ");
    break;
    case '=':
    printf("= 25 ");
    break;
    case '(':
    printf("( 27 ");
    break;
    case ')':
    printf(") 28 ");
    break;
    case '#':
    printf("# 0 ");
    break;
    case '.':
    printf(". ");
    break;
    case ' ':
    printf("");
    break;
    case ' ':
    printf("");
    break;
    TT: default:
    if((input[i]>='a'&&input[i]<='z')||(input[i]>='A'&&input[i]<='Z'))
    {
    while(NOSign(input[i])&&i<length)
    {
    flag=1;
    putchar(input[i]);
    i++;
    }
    if(flag)
    {
    i--;
    flag=0;
    }
    printf(" 10 ");
    }
    else if(input[i]>=48||input[i]<=57)
    {
    while((input[i]>=48||input[i]<=57||input[i]=='.')&&!NoSign_Number(input[i])&&i<length)
    {
    flag=1;
    putchar(input[i]);
    i++;
    }
    if(flag)
    {
    i--;
    flag=0;
    }
    printf(" 11 ");
    }
    break;
    }
    }
    }
    int InputDate(char input[])       //录入输入数据,返回数据长度
    {
    int i;
    printf("输入“****”时结束输入! ");
    printf("请输入:");
    for(i=0;2>1;i++)
    {
    input[i]=getch();
    if(input[i]==' ')
    putchar(' ');
    else if(input[i]==8)
    {
    if(i<=0)
    {
    i-=1;
    putchar(7);
    }else{
    i-=2;
    printf(" ");
    }
    }
    else
    putchar(input[i]);
    if(i>=3&&(input[i]=='*'&&input[i-1]=='*'&&input[i-2]=='*'&&input[i-3]=='*'))
    break;
    }
    input[i-3]='';
    return strlen(input);
    }
    void PrintDate(char input[])      //打印输入数据
    {
    int i;
    for(i=0;input[i]!='';i++)
    if(input[i]==' ')
    putchar(' ');
    else
    putchar(input[i]);
    }
    int NoSign_Number(char a)    //若该符号既不是数字也不是字母,是返回1
    {
    return (a<'a'||a>'z')&&(a<'A'||a>'Z')&&(a<48||a>57);
    }
    int NOSign(char a)  //数字,字母,下划线,返回1
    {
    return (a>=48&&a<=57)||(a>=65&&a>=90)||(a>=97&&a<=122)||(a==95);
    }
    int NOSign2(char a)  //数字,小数点,返回1
    {
    return (a>=33&&a<46&&a==47)||(a>=91&&a<=96)||(a>123&&a<=126);  
    }
  • 相关阅读:
    使用Redis做MyBatis的二级缓存
    MySQL 类型转换
    mysql store procedure 存储过程
    swagger
    redis 持久化
    redis 发布/订阅 模式
    dfs模板
    二叉树
    拓扑排序
    最大公因数(辗转相除法)
  • 原文地址:https://www.cnblogs.com/w304/p/4882324.html
Copyright © 2011-2022 走看看