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

    #include<stdio.h>
    #include<string.h>
    char prog[80],token[8];
    char ch;
    char *rwtab[6]={"begin","if","then","while","do","end"};
    int syn,m=0,row,sum=0,p=0,n;
    main()
    {

    printf("please input source code and end of #: ");
    do{
    ch=getchar();
    prog[p++]=ch;
    }while(ch!='#');
    printf("scan Results: ");
    p=0;
    do
    {
    scaner_source_code();
    switch(syn)
    {
    case 11:printf("<%d,%d> ",syn,sum);
    break;
    case -1:printf("Error in row<<%d>> ",row);
    break;
    case -2: row=row++;
    break;
    default: printf("<%d,%s> ",syn,token);
    break;
    }
    }while (syn!=0);

    return 0;
    }
    scaner_source_code()
    {
    //共分为三大块,分别是标示符、数字、符号,对应下面的 if else if 和 else
    for(n=0;n<8;n++)
    token[n]=NULL;
    ch=prog[p++];
    while(ch==' ')
    {
    ch=prog[p++];
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是标示符或者变量名
    {
    m=0;
    while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
    {
    token[m++]=ch;
    ch=prog[p++];
    }
    token[m++]='';
    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')) //数字
    {
    sum=0;
    while((ch>='0'&&ch<='9'))
    {
    sum=sum*10+ch-'0';
    ch=prog[p++];
    }
    p--;
    syn=11;
    if(sum>32767)
    syn=-1;
    }
    else switch(ch) //其他字符
    {
    case':':m=0;
    token[m++]=ch;
    ch=prog[p++];
    if(ch=='=')
    {
    syn=18;
    token[m++]=ch;
    }
    else
    {
    syn=17;
    p--;
    }
    case'<':m=0;
    token[m++]=ch;
    ch=prog[p++];
    if(ch=='=')
    {
    syn=21;
    token[m++]=ch;
    }
    else if(ch=='>')
    {
    syn=22;
    token[m++]=ch;
    }
    else
    {
    syn=20;
    p--;
    }
    break;
    case'>':m=0;
    token[m++]=ch;
    ch=prog[p++];
    if(ch=='=')
    {
    syn=24;
    token[m++]=ch;
    }
    else
    {
    syn=23;
    p--;
    }
    break;
    case'+':syn=13;token[0]=ch;break;
    case'-':syn=14;token[0]=ch;break;
    case'*':syn=15;token[0]=ch;break;
    case'/':syn=16;token[0]=ch;break;
    case'=':syn=25;token[0]=ch;break;
    case';':syn=26;token[0]=ch;break;
    case'(':syn=27;token[0]=ch;break;
    case')':syn=28;token[0]=ch;break;
    case'#':syn=0;token[0]=ch;break;
    default: syn=-1;break;
    }
    }

  • 相关阅读:
    结构化编程:确定迭代循环控制for
    为什么就业难,因为信息化的威力
    结构化编程:单支条件选择控制
    C/C++ 标准输入输出重定向
    C语言中用scanf连续输入两个字符类型的问题
    void value not ignored as it ought to be
    不要做浮躁的嵌入式系统工程师
    INI配置文件的格式
    Linux 下串口编程入门
    时钟周期及秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)之间转换
  • 原文地址:https://www.cnblogs.com/LwF39/p/4882374.html
Copyright © 2011-2022 走看看