📄 递归下降分析程序.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 + -