📄 recursivedescent.cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#include "iostream.h"
#include "vector.h"
/******************************************递归下降分析实验********************************************/
RD::RD()
{
RD::pass = true;
RD::yylineno = 1; //初始化当前行数为第一行
}
RD::~RD(){}
bool RD::isalnum(char a) //是否为合法的标识符
{
return ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z') || (a >= '0' && a <= '9'));
}
bool RD::match(int symbol) //比较,判断是否有与之相匹配的字符
{
int c;
if(RD::ch == '+') c = PLUS; //是+与PLUS 相匹配,类别号就为2
if(RD::ch == '-') c = SUB;
if(RD::ch == '*') c = TIMES;
if(RD::ch == '/') c = DIV;
if(RD::ch == '(') c = LP;
if(RD::ch == ')') c = RP;
if(RD::ch == '\n') //回车
{
RD::ch = fgetc(fp);
RD::yylineno ++; //当前所在行数加一
}
if(RD::ch == EOF) c = EOF; //文件结束
if(isalnum(RD::ch)) c = NUM_OR_ID; //标识符或数字
if(c == symbol) return true;
else return false;
}
void RD::advance() //读取下一个字符
{
RD::ch = fgetc(fp);
if(ch != EOF) printf("当前分析字符:%c\n", RD::ch);
else printf("文件结束!\n");
}
void RD::E() //E -> TE'
{
RD::T();
RD::E_P();
}
void RD::E_P() //E' -> ATE' | &
{
if(RD::A())
{
RD::T();
RD::E_P();
}
}
void RD::T() //T -> FT'
{
RD::F();
RD::T_P();
}
void RD::T_P() //T' -> MFT' | &
{
if(RD::M())
{
RD::F();
RD::T_P();
}
}
bool RD::A() //A -> + | -
{
if(! match(EOF)) //当文件未结束时
{
if(match(PLUS)) //如果读入的是 " + "
{
RD::advance();
return true;
}
if(match(SUB)) //如果读入的是 " - "
{
RD::advance();
return true;
}
}
return false; //文件结束
}
void RD::F() //F -> (E) | i
{
if(! match(EOF))
{
if(match(NUM_OR_ID)) RD::advance(); //F -> i
else if(match(LP)) //F -> (E)
{
RD::advance();
RD::E();
if(match(RP)) RD::advance(); //读取完(时应要读取),否则输入串出错
else
{
fprintf(stderr, "第 %d 行: 未找到可以匹配的括号!\n", yylineno);
RD::pass = false;
return; //如果出错则跳出,程序中止
}
}
else
{
fprintf(stderr, "第 %d 行: 缺少数字或标识符\n", yylineno); //既无标识符又无左括号,则出错
RD::pass = false;
return; //如果出错则跳出,程序中止
}
}
}
bool RD::M() //M -> * | /
{
if(! match(EOF))
{
if(match(TIMES)) //如果读入的是 " * "
{
RD::advance();
return true;
}
if(match(DIV)) //如果读入的是 " / "
{
RD::advance();
return true;
}
}
return false;
}
void main()
{
RD rd;
if((rd.fp = fopen("input2.txt", "r")) == NULL) //读取input1 或input2
{
cout << "Error on open input.txt!" << endl;
return;
}
rd.ch = fgetc(rd.fp);
printf("当前分析字符:%c\n", rd.ch);
rd.E();
if(rd.pass == true) cout << "编译通过!" << endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -