资源简介

递归下降语法分析程序要求: 忽略注释; 有出错恢复处理功能; 显示错误格式“第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


评论

共有 条评论