资源简介
递归下降语法分析程序要求:
忽略注释;
有出错恢复处理功能;
显示错误格式“第xx行出现xxx错误”

代码片段和文件信息
#include
#include
#include
#include
#define _KEY_WORDEND “waiting for your expanding“
using namespace std;
typedef struct //词的结构,二元组形式(单词种别,单词自身的值)
{
int typenum; //单词种别
char * word;
}WORD;
WORD* oneword = new WORD;
char input[255];
char token[255] = ““;
int p_input; //指针
int p_token;
int kk;//标记是否已经出错,如果整个程序判断到最后没有出错,输出Success
int flag=0;//标记括号数目,falg=0左右括号匹配,flag>0左括号多了,flag<0右括号多了
bool print_flag=true;//标志是否已经检测出缺少右括号的错误
int row=1;//定义行数,每次读取一个回车则为换行
int error_row = 0;//标志总共几个错误
char ch;
char * rwtab[] = { “begin““if““then““while““do““end““int““main““else““float““double““return““cout“_KEY_WORDEND };
WORD * scanner();//扫描获取到每个单词的种别码
int Irparser();//程序的判断
int yucu();//语句串的分析
int statement();//语句的分析
int expression();//表达式的判断
int term();//项的分析
int factor();//因子的分析
char m_getch();
int main()
{
//以“#”结束
p_input=0;
printf(“---语法分析程序开始---\n“);
printf(“读取到的源程序如下:\n“);
/*do
{
scanf(“%c“&ch);
input[p_input++]=ch;
}while(ch!=‘#‘);*/
FILE *fp=NULL;
fp = fopen(“error_data.txt““r“);
if(fp == NULL)
{
printf(“Not found file!“);
return 0;
}
while((input[p_input]=getc(fp))!=EOF)
{
putchar(input[p_input]);
p_input++;
}
printf(“\n“);
p_input=0;
kk=0;
oneword = scanner();
Irparser();
printf(“\n“);
printf(“===以上是程序分析结果===\n“);
printf(“总共%d行,其中有%d个错误\n“rowerror_row);//输出行数以及错误个数
printf(“========================\n“);
printf(“---语法分析程序结束---\n“);
return 0;
}
//从输入缓冲区读取一个字符到ch中
char m_getch()
{
ch = input[p_input];
p_input++;
return ch;
}
//去掉空白符号,不包括回车
void getbc()
{
while (ch == ‘ ‘)
{
ch = input[p_input];
p_input++;
}
}
//拼接单词
void concat()
{
token[p_token] = ch;
p_token++;
token[p_token] = ‘\0‘;
}
//判断是否字母
int letter()
{
if (ch >= ‘a‘&&ch <= ‘z‘ || ch >= ‘A‘&&ch <= ‘Z‘)
return 1;
else
return 0;
}
//判断是否数字
int digit()
{
if (ch >= ‘0‘&&ch <= ‘9‘)
return 1;
else
return 0;
}
//检索关键字表格
int reserve()
{
int i = 0;
while(strcmp(rwtab[i] _KEY_WORDEND))
{
if (!strcmp(rwtab[i] token))
return i + 1;
i++;
}
return 10;//如果不是关键字,则返回种别码10
}
//回退一个字符
void retract()
{
p_input--;
}
//词法扫描程序
WORD * scanner()
{
WORD * myword = new WORD;
myword->typenum = 10; //初始值
myword->word = ““;
p_token = 0; //单词缓冲区指针
m_getch();
getbc();//去掉空白
if (letter())//判断读取到的首字母是字母
{
//如int
while (letter() || digit())
{
concat(); //连接
m_getch();
}
retract(); //回退一个字符
myword->typenum = reserve();//判断是否为关键字,返回种别码
myword->word = token;
return myword;
}
else if (digit()) //判断读取到的单词首字符是数字
{
while (digit()) //所有数字连接起来
{
concat();
m_getch();
}
retract();
//数字单词种别码统一为20,单词自身的值为数字本身
myword->typenum = 20;
myword->word = tok
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 16039 2018-05-10 22:58 递归下降语法分析程序(代码+说明文档)\main.cpp
文件 84978 2018-07-10 14:58 递归下降语法分析程序(代码+说明文档)\说明文档.docx
目录 0 2018-07-10 14:58 递归下降语法分析程序(代码+说明文档)
----------- --------- ---------- ----- ----
101017 3
- 上一篇:关于gps漂移引起的ekf报错分析
- 下一篇:数字逻辑课程设计数字密码锁
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 递归下降分析器分析普通的四则运算
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 广东工业大学汇编实验二用表格形式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- LL(1)文法的递归下降分析程序例题
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
评论
共有 条评论