资源简介
递归下降语法分析程序要求:
忽略注释;
有出错恢复处理功能;
显示错误格式“第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报错分析
- 下一篇:数字逻辑课程设计数字密码锁
相关资源
- 编译原理课后习题答案
- 《编译原理》胡元义课后习题解析
- 编译原理学习指导与典型题解析
- 程序设计语言编译原理(陈火旺第3版
- 编译原理第二版清华大学
- 基于LR(0)方法的语法分析程序
- 编译原理~金成植版课后答案~
- 《编译原理(第3版).pdf》
- 编译原理的实验12376
- 西电编译原理大作业
- 编译原理实验指导书 河北工业大学
- 编译原理 词法和语法分析
- 清华大学--编译原理--课件,练习题及
- 编译原理 课件 北航计算机学院
- LL(1)的语法分析程序
- Parsing Techs A Practical Guide pdf
- 编译原理 南京大学计算机系
- 河北工业大学编译原理实验报告及源
- 编译原理陈火旺版共十章ppt讲义
- 编译原理学习指导与习题解析陈英
- 哈工大编译原理的课件
- 清华大学计算机系网络课程之编译原
- 编译原理(第2版)+张素琴+吕映芝清
- 编译原理课程设计 SLR(1)文法
- 编译原理-国防科技大学课件
- 王汝传版编译原理资料
- 编译原理课程设计源代码
- 程序设计语言编译原理(第三版)-陈
- 编译原理——简单计算器的编译器的
- 编译系统透视:图解编译原理.rar
评论
共有 条评论