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

    #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(")");
    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++;
    m++;
    b[k]='';
    }
    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;
    printf(" ");
    }
    }
    if(flag==0)
    {
    printf("(10,%s)",b); //输出标识符
    printf(" ");
    }
    }
    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("(0,#) ");
    break;
    default:
    {
    printf(" 存在字符 '%c',无法继续识别! ",c);
    s=0; //用s=0记录存在非法字符
    break;
    }
    }
    }

  • 相关阅读:
    网络层协议
    交换机原理
    复习
    网络布线和数据转换
    计算机网络参考模型
    Linux常用命令2
    Linux常用命令1
    服务器分类、硬盘分类
    TCP三次握手和断开四次挥手
    向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾。
  • 原文地址:https://www.cnblogs.com/4249ken/p/4889746.html
Copyright © 2011-2022 走看看