简单递归分析程序
其代码如下:
#include<stdio.h>
#include<string.h>
int syn;
void yucu();//语句串分析程序
void statement();//语句分析
void expression();//表达式分析
void item();//项分析
void factor();//因子分析
char token[1000];//存储字符串
void scanner();//扫描函数
char ch;
int p;
char prog[1000];
int i;
char table[7][10] = { "","begin","if","then","while","do","end" };
int kk;
int main(void) {
p = 0;
printf("\nplease input string :\n");
do {
ch = getchar();
prog[p++] = ch;
} while (ch != '#');
p = 0;
scanner();
if (syn == 1)
{
scanner();
yucu();
if (syn == 6) {
if (!kk) {
printf("success");
}
}
}
else {
printf("应该输入'begin'error");
}
return 0;
}
void yucu() {
statement();
while (syn == 26) {//分号
scanner();
statement();
}
return;
}
void statement()//语句分析函数
{
if (syn == 10) {//标识符
scanner();
if (syn == 18)//赋值
{
scanner();
expression();
}
else {
printf("赋值号错误error");
kk = 1;
}
}
else {
kk = 1; printf("语句错误error");
}
return;
}
void expression() {//表达式分析函数
item();
while(syn == 13 || syn == 14) {
scanner();
item();
}
return;
}
void item()//项函数
{
factor();
while (syn == 15 || syn == 16)
{
scanner();
factor();
}
return;
}
void factor()//因子函数
{
if (syn == 10 || syn == 11) {
scanner();
}
else if (syn == 27) {
scanner();
expression();
if (syn == 28) {
scanner();
}
else {
printf("缺少'('error");
}
}
}
void scanner() {
ch = prog[p++];
while (ch == ' ') {
ch = prog[p++];
}
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ) {
int i = 0;
while (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' && ch <= '9') {
token[i++] = ch;
ch = prog[p++];
}
p--;//由于最后一个字符不会被接纳,需要往前返回一个字符
token[i] = '\0';
for (i = 1; i <= 6; i++)
{
if (strcmp(token, table[i]) == 0)
{
syn = i;
break;
}
}
if (i > 6)syn = 10;//如果没有匹配,说明就不是关键字
}
else if (ch <= '9' && ch >= '0') {
i = 0;
while (ch <= '9' && ch >= '0')
{
token[i++] = ch + 48;//将数字转化成对应字符存储在数组中
ch = prog[p++];
}
p--;//由于最后一个字符不会被接纳,需要往前返回一个字符
token[i] = '\0';
syn = 11;
}
else {
i = 0;
token[i++] = ch;
char ch1;
switch (ch)
{
case '+':
syn = 13;
break;
case '-':
syn = 14;
break;
case '*':
syn = 15;
break;
case '/':
syn = 16;
break;
case ':':
ch1 = prog[p];//尝试判断下一个字符
if (ch1 == '=')
{
token[i++] = ch1;
p++;//成功就得将缓冲区字符前进一个字符
syn = 18;
}
else
syn = 17;
break;
case '<':
ch1 = prog[p];
if (ch1 == '=')
{
syn = 22;
p++;
token[i++] = ch1;
}
else if (ch1 == '>')
{
syn = 21;
p++;
token[i++] = ch1;
}
else
syn = 20;
break;
case '>':
ch1 = prog[p];
if (ch1 == '=')
{
syn = 24;
p++;
token[i++] = ch1;
}
else
syn = 23;
break;
case '=':
syn = 25;
break;
case ';':
syn = 26;
break;
case '(':
syn = 27;
break;
case ')':
syn = 28;
break;
case '#':
syn = 0;
break;
default:
syn = -1;
break;
}
token[i] = '\0';
}
}
其结果如下:
Q.E.D