• 递归下降分析程序


    #include<stdio.h>
    #include <string.h>
    void scaner();
    void E();
    void E1();
    void T();
    void T1();
    void F();
    void error();
    char proce[100],ch,token[20];
    int syn,i,j,m,sum=0;
    char *keyword[6]= {"begin","if","then","while","do","end"};
    main()
    {
    i=0;//记录输入多少个字符
    printf("\n 请输入词法分析程序:");
    do{
    ch=getchar();
    proce[i]=ch;
    i++;
    }while (ch!='#');
    i=0;
    do{
    scaner();
    switch(syn)
    {
    case 11: printf("\n(%d,%d)",syn,sum);
    break;
    case -1: printf("\n(%s,#)",token);
    break;
    default: printf("\n(%d,%s)",syn, token);
    }
    }while (syn!=0);

    printf("\n");

    i=0;

    scaner();
    E();
    if (syn==0)
    printf("\n 语法正确. \n");
    else printf("\n 语法失败. \n");

    }
    void scaner()
    {
    for (j=0;j<20;j++)
    token[j]=NULL;//将token赋值为空
    m=0;
    sum=0;
    ch=proce[i];
    i++;
    while (ch==' ')
    {
    ch=proce[i++];
    }
    if (ch>='a'&& ch<='z')
    {while (ch>='a'&& ch<='z'||ch>='0' && ch<='9')
    {
    token[m++]=ch;
    ch=proce[i++];//继续看后面的
    }

    syn=10;i--;//判断为变量
    for (j=0;j<6;j++)
    if(strcmp(token,keyword[j])==0)
    {
    syn=j+1;
    break;
    }//如果有可以匹配的就为关键字
    }
    else
    if(ch>='0' && ch<='9')
    {while (ch>='0' && ch<='9')
    {
    sum=sum*10+(ch-'0');
    ch=proce[i];
    i++;
    }
    syn=11;
    i--;
    }
    else
    switch(ch)
    {
    case '<': token[m]=ch;
    m++;
    ch=proce[i];
    i++;
    if (ch=='>')
    {
    syn=21;
    token[m]=ch;
    m++;
    }
    else if (ch=='=')
    {
    syn=22;
    token[m]=ch;
    m++;
    }
    else
    {
    syn=20;
    i--;
    }
    break;

    case '>': m=0;
    token[m]=ch;
    m++;
    ch=proce[i];
    i++;
    if (ch=='=')
    {
    syn=24;
    token[m]=ch;
    m++;
    }
    else
    {
    syn=23;
    i--;
    }
    break;
    case ':': m=0;
    token[m++]=ch;
    ch=proce[i++];
    if (ch=='=')
    {
    syn=18;
    token[m++]=ch;
    }
    else
    {
    syn=17;
    i--;
    }
    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;
    token[0]=ch;
    }
    }
    void E()
    {
    printf("E ");
    T();
    E1();

    }
    void E1()
    {
    printf("E1 ");
    if (syn==13)
    {
    scaner();
    T();
    E1();
    }
    else {
    if (syn!=28 && syn!=0)
    error();
    }
    }
    void T()
    {
    printf("T ");
    F();
    T1();
    }
    void T1()
    {
    printf("T1 ");
    if (syn==15) {
    scaner();
    F();
    T1();
    }
    else {
    if (syn!=28 && syn!=0 && syn!=13) error();
    }
    }

    void F()
    {
    printf("F ");
    if (syn==27)
    {
    scaner();
    E();
    if(syn==28) scaner();
    else error();
    }
    else if (syn==11 || syn==10)
    scaner();

    }

    void error()
    {
    printf("\n (%d,%s)语法错误! \n",syn, token);
    }

  • 相关阅读:
    Linux
    Linux
    JavaScript
    JavaScript
    Linux
    不可不说的Java“锁”事
    RabbitMQ公共配置
    求一个数字的补码
    项目中Controller的全局异常处理类
    如何较方便给上百张数据库表添加表字段
  • 原文地址:https://www.cnblogs.com/932zdb/p/6188879.html
Copyright © 2020-2023  润新知