• 0916 词法分析程序


    #include<stdio.h>
    #include<string.h>
    void Fenxi(char c,char b);
    void word(char a[]);
    void number(char a[]);
    int i; //定义全局变量i
    int s=1; //用来记录是否存在非法字符
    main(){
    char a[50];
    printf("请输入源程序:");
    gets(a);
    printf("您要分析的源程序为:");
    printf("%s",a);
    printf(" ");
    for(i=0;(a[i]!='')&&(i<50)&&s==1;i++)
    {
    if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
    word(a);
    else if(a[i]>='0' && a[i]<='9')
    number(a);
    else
    Fenxi(a[i],a[i+1]);
    }
    printf(" ");
    }

    void number(char a[]) //对数字字符进行扫描分析
    {
    char b[50];
    int m,k=0,t;
    m=i;
    while(a[m]>='0' && a[m]<='9')
    {
    b[k]=a[m]; //用数组b存放数组a中的数字
    k++;
    m++;
    }
    i=m-1;
    printf("(11,");
    for(t=0;t<k;t++)
    printf("%c",b[t]);
    printf(")");
    }

    void word(char a[]) //对字母字符进行扫描分析,并识别保留字
    {
    int k=0,m,flag=0,t;
    char b[50];
    char *key[6]={"begin","if","then","while","do","end"};
    m=i;
    while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
    {
    b[k]=a[m];
    k++;
    b[k]='';
    m++;
    }
    i=m-1;
    for(t=0;t<6;t++)
    {
    if(strcmp(b,key[t])==0) //将数组b与关键字进行比较
    {
    printf("(%d,%s)",t+1,key[t]); //输出关键字
    flag=1;
    }
    }
    if(flag==0)
    {
    printf("(10,%s)",b); //输出标识符
    }
    }
    void Fenxi(char c,char b) //对特殊字符进行扫描分析
    {
    switch(c){
    case ' ':
    break;
    case '+':
    printf("(13,+)");
    break;
    case '-':
    printf("(14,-)");
    break;
    case '*':
    printf("(15,*)");
    break;
    case '/':
    printf("(16,/)");
    break;
    case ':':
    if(b=='=')
    {
    i++;
    printf("(18,:=)");
    }
    else
    printf("(17,:)");
    break;
    case '<':
    if(b=='>')
    {
    i++;
    printf("(21,<>)");
    }
    else if(b=='=')
    {
    i++;
    printf("(22,<=)");
    }
    else
    printf("(20,<)");
    break;
    case '>':
    if(b=='=')
    {
    printf("(24,>=)");
    i++;
    }
    else
    printf("(23,>)");
    break;
    case '=':
    printf("(25,=)");
    break;
    case ';':
    printf("(26,;)");
    break;
    case '(':
    printf("(27,()");
    break;
    case ')':
    printf("(28,))");
    break;
    case '#':
    printf("(20,#)");
    break;
    default:
    {
    printf(" 存在字符 '%c',无法继续识别! ",c);
    s=0; //用s=0记录存在非法字符
    break;
    }
    }
    }

  • 相关阅读:
    bzoj2143 飞飞侠
    Codeforces 543.B Destroying Roads
    Codeforces 666.B World Tour
    bzoj2441 [中山市选2011]小W的问题(debug中)
    bzoj2329 [HNOI2011]括号修复
    一些新发现的好东西
    < meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" />的作用
    js经典代码技巧学习之一:使用三元运算符处理javascript兼容
    《javascript高级程序设计》笔记4.1.4:检测类型
    页面关闭和刷新事件
  • 原文地址:https://www.cnblogs.com/xjy-gg/p/4827868.html
Copyright © 2020-2023  润新知