⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 递归下降分析程序.c

📁 这里以开始定义的PASCAL语言子集的源程序作为词法分析程序的输入数据。在词法分析中
💻 C
字号:
/*
  给定文法G,产生式如下:(L为开始符号)
  L -> ()|(E)
  E -> A|L|E,A|E,L
  A -> a|b|...|z
*/
/*
    消除左递归后,生成式如下:
    L ->() | (E)
    E -> AR | LR
    R -> ,AR | ,LR | ε
    A -> a|b|...|z

    将不含左递归的生成式转化成递归下降分析程序即可.
*/

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

char ch;

void L(void);
void E(void);
void A(void);
void R(void);


void getnc(void)
{
  do
  {
    ch = getchar();
  } while (ch == ' ' || ch == '\n');
}

void error(void)
{
  puts("\nNo.");
  exit(0);
}

void L()
{
  if (ch == '(')
  {
    getnc();
    if (ch == ')')
      getnc();
    else
    {
      E();
      if (ch != ')')
        error();
      getnc();
    }
  }
  else
    error();
}

void E()
{
  /*这里有个小麻烦:
    在生成式中有E -> AR | LR , 这时,必需判断下一步是要调A()还是要调L().
    由于L -> () | (E),即 L 的第一个字符一定是'(',所以,如果ch == '('则调用 L()
    否则调用A(). 在R()函数中有相同的情况,不再赘述.
  */
  if (ch == '(')
    L();
  else
    A();
  R();
}

void R()
{
  if (ch == ',')
  {
    getnc();
    if (ch == '(')
      L();
    else
      A();
    R();
  }
}

void A()
{
  if (ch >= 'a' && ch <= 'z')
    getnc();
  else
    error();
}

void main()
{
  getnc();
  L();
  if (ch != '$')
    error();
  else
    puts("\nYes.");
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -