zoukankan      html  css  js  c++  java
  • 44-小组词法分析

    #include<stdio.h>
    #include<string.h>
    char input[200];//存放输入字符串
    char token[5];//存放构成单词符号的字符串
    char ch; //存放当前读入字符
    int p; //input[]下标
    int fg; //switch标记
    int num; //存放整形值

    //二维字符数组,存放关键字
    char index[6][6]={"begin","if","then","while","do","end"};
    main()
    {
    p=0;
    printf("please intput string(End with '#'): ");
    do
    {
    ch=getchar();
    input[p++]=ch;
    }while(ch!='#');
    p=0;
    do
    {
    scaner();
    switch(fg)
    {
    case 11:printf(" %d,%d ",fg,num);break;
    case -1:printf("input error "); break;
    default:printf(" %d,%s ",fg,token);
    }
    }while(fg!=0);
    getch(); //用于让程序停留在显示页面
    }
    /*词法扫描程序:*/
    int scaner()
    {
    int m=0;//token[]下标
    int n;

    //清空token[]
    for(n=0;n<5;n++)
    token[n]=NULL;

    //获取第一个不为0字符
    ch=input[p++];
    while(ch==' ')
    ch=input[p++];

    //关键字(标识符)处理流程
    if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))
    {
    while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0')) //(此处ch<=……是否可略去?)
    {
    token[m++]=ch;
    ch=input[p++];
    }
    token[m++]='';
    ch=input[--p];
    fg=10;
    for(n=0;n<6;n++)
    if(strcmp(token,index[n])==0)//strcmp()函数可比较两个字符串,相等时返回0
    {
    fg=n+1;
    break;
    }
    }

    //数字处理流程 (这里不懂)
    else if((ch<='9'&&ch>='0'))
    {
    num=0;
    while((ch<='9'&&ch>='0'))
    {
    num=num*10+ch-'0';
    ch=input[p++];
    }
    ch=input[--p];
    fg=11;
    }

    //运算符界符处理流程
    else
    switch(ch)
    {
    case '<':
    m=0;
    token[m++]=ch;
    ch=input[p++];
    if(ch=='>') //产生<>
    {
    fg=21;
    token[m++]=ch;
    }
    else if(ch=='=') //产生<=
    {
    fg=22;
    token[m++]=ch;
    }
    else
    {
    fg=20;
    ch=input[--p];
    }
    break;
    case '>':
    token[m++]=ch;
    ch=input[p++];
    if(ch=='=') //产生>=
    {
    fg=24;
    token[m++]=ch;
    }
    else //产生>
    {
    fg=23;
    ch=input[--p];
    }
    break;
    case ':':
    token[m++]=ch;
    ch=input[p++];
    if(ch=='=') //产生:=
    {
    fg=18;
    token[m++]=ch;
    }
    else //产生:
    {
    fg=17;
    ch=input[--p];
    }
    break;
    case '+':fg=13;token[0]=ch;break;
    case '-':fg=14;token[0]=ch;break;
    case '*':fg=15;token[0]=ch;break;
    case '/':fg=16;token[0]=ch;break;
    case ':=':fg=18;token[0]=ch;break;
    case '<>':fg=21;token[0]=ch;break;
    case '<=':fg=22;token[0]=ch;break;
    case '>=':fg=24;token[0]=ch;break;
    case '=':fg=25;token[0]=ch;break;
    case ';':fg=26;token[0]=ch;break;
    case '(':fg=27;token[0]=ch;break;
    case ')':fg=28;token[0]=ch;break;
    case '#':fg=0;token[0]=ch;break;
    default:fg=-1;
    }
    }

  • 相关阅读:
    使用FolderBrowserDialog组件选择文件夹
    使用OpenFileDialog组件打开多个文
    使用OpenFileDialog组件打开对话框
    获取弹出对话框的相关返回值
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1139 First Contact (30 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1138 Postorder Traversal (25 分)
    PAT 甲级 1137 Final Grading (25 分)
    PAT 甲级 1137 Final Grading (25 分)
  • 原文地址:https://www.cnblogs.com/skywalkersg/p/4860998.html
Copyright © 2011-2022 走看看