• 词法分析程序的设计与实现


    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>

    /*关键字*/
    char *key[6]={"begin","if","then","while","do","end"};
    char ch;
    char input[800],output[20];
    int syn, sum, p, m, n, i;//种别码syn,整数sum,p识别第一个字符

    void getsym()
    {
    for(int i = 0; i < 8; i++)
    output[i] = NULL;//初始化数组
    ch = input[p++];
    while(ch == ' '){//下标下移
    ch = input[p];
    p++;
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){//判断是否为字母
    m = 0;
    while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
    output[m++] = ch;
    ch = input[p++];
    }
    p--;
    syn = 10;
    for(i=0;i<6;i++)
    if(strcmp(output,key[i]) == 0){//判断关键字是否相同
    syn = i+1;
    break;
    }
    }
    else if(ch>='0'&&ch<='9')
    {
    {
    sum = 0;
    while(ch>='0'&&ch<='9')
    {
    sum=sum*10+ch-'0';
    ch=input[p++];
    }
    }
    p--;
    syn = 11;
    }else switch(ch){
    case '+':output[0]=ch;syn=13;break;
    case '-':output[0]=ch;syn=14;break;
    case '*':output[0]=ch;syn=15;break;
    case '/':output[0]=ch;syn=16;break;
    case ':':
    i = 0;
    output[i++] = ch;
    ch = input[p++];
    if(ch == '='){
    output[i++] = ch;
    syn = 18;
    }else{
    syn = 17;
    p--;
    }
    break;
    case '<':
    i = 0;
    output[i++] = ch;
    ch = input[p++];
    if(ch == '='){
    output[i++] = ch;
    syn = 21;
    }else if(ch == '>'){
    output[i++] = ch;
    syn = 22;
    }else{
    syn = 20;
    p--;
    }
    break;
    case '>':
    i = 0;
    output[i++] = ch;
    ch = input[p++];
    if(ch == '='){
    output[i++] = ch;
    syn = 24;
    }else{
    syn = 23;
    p--;
    }
    break;
    case '=':output[0]=ch;syn=25;break;
    case ';':output[0]=ch;syn=26;break;
    case '(':output[0]=ch;syn=27;break;
    case ')':output[0]=ch;syn=28;break;
    case '#':output[0]=ch;syn=0;break;
    }
    }


    main(){
    p = 0;
    printf("请输入语句:");
    do{
    ch = getchar();
    input[p++] = ch;
    }while(ch != '#');

    p = 0;
    do{
    getsym();
    switch(syn)
    {
    case 11:printf("(%d,%d) ",syn, sum);break;
    default:printf("(%d,%s) ",syn, output);break;
    }
    }while(syn!=0);
    }

  • 相关阅读:
    CF85E Guard Towers(二分答案+二分图)
    CF732F Tourist Reform(边双联通)
    CF949C Data Center Maintenance(建图+强联通分量)
    CF402E Strictly Positive Matrix(矩阵,强联通分量)
    CF209C Trails and Glades(欧拉路)
    POJ1201Intervals(差分约束)
    NOIP2016 天天爱跑步(树上差分)
    CF19E Fairy(树上差分)
    NOIP 2017 小凯的疑惑(同余类)
    POJ 3539 Elevator(同余类BFS)
  • 原文地址:https://www.cnblogs.com/zqy1004/p/11656438.html
Copyright © 2020-2023  润新知