• 大小: 196KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-08-21
  • 语言: C/C++
  • 标签: 编译原理  C++  

资源简介

本资源使用C++实现了语法分析器,内容包括C++源代码与exe文件、input.txt和程序运行说明文档。该资源的文字版信息请访问博客《编译原理实践:C++实现语法分析器(学习笔记)》(https://blog.csdn.net/weixin_40589192/article/details/106933125)。

资源截图

代码片段和文件信息

#include 
#include           /*包含库所用的某些宏和变量*/
#include          /*包含库*/
#include          /*包含字符串处理库*/
#define _KEY_WORD_END “waiting for your expanding“
                            /*定义关键字结束标志*/
using namespace std;

typedef struct              /*单词二元组*/
{
int categoryCode;       /*单词种别*/
char *value;            /*单词自身的值*/
}WORD;

/*词法分析部分*/
char inputBuffer[10000];    /*输入缓冲区*/
char wordBuffer[1000] = ““; /*单词缓冲区*/
int inputBufferIndex;       /*输入缓冲区下标*/
int wordBufferIndex;        /*单词缓冲区下标*/
char ch;                    /*当前读入字符*/
char *rwtab[] = {“begin“ “void“ “int“ “char“ “main“ “if“ “scanf“ “printf“ “while“ “for“ “return“ “end“ _KEY_WORD_END};
                            /*关键字数组*/
WORD* scaner();             /*声明词法分析函数,获得一个单词*/
char getChar();             /*声明字符读取函数,从输入缓冲区读取一个字符*/
void removeBlankSymbol();   /*声明去掉空格和\t函数*/
void concatWord();          /*声明拼接单词函数*/
int isLetter();             /*声明判断是否字母函数*/
int isDigit();              /*声明判断是否数字函数*/
int retriveKeyword();       /*声明检索关键字数组函数,在字符数组rwtab中检索*/
void retractChar();         /*声明回退字符函数,回退一个字符*/
char* digitToBinary();      /*声明将十进制转换成二进制函数*/
char* changeWordFormation();/*声明更改单词的输出形式函数*/

/*语法分析部分*/
void lrparser();            /*声明语法分析函数*/
void statementString();     /*声明语句串分析函数*/
void statement();           /*声明语句分析函数*/
void expression();          /*声明(等号右边的)表达式分析函数*/
void term();                /*声明项分析函数*/
void factor();              /*声明因子分析函数*/

void isLexicalError();      /*声明检测词法错误函数*/
bool isLineBreak();         /*声明检测换行符函数*/

WORD *oneWord = new WORD;    /*存放一个单词*/
int rowNumber = 1;           /*记录当前行数*/
bool lexicalError = false;   /*检测是否有词法错误*/
bool syntacticError = false; /*检测是否有语法错误*/

int main()
{
    freopen(“input.txt““r“stdin);
    freopen(“output.txt““w“stdout);

inputBufferIndex = 0;                     // 初始化输入缓冲区下标

scanf(“%[^#]s“ inputBuffer);             // 读入源程序字符串到缓冲区,以#结束,允许多行输入,#会读成‘\0‘
printf(“Your words(must start with ‘begin‘ and end with ‘end‘):\n\n“);
printf(“---------------------------------\n“);
    printf(“%s\n“ inputBuffer);
    printf(“---------------------------------\n\n“);
    printf(“The result of syntactic analysis:\n\n“);

    oneWord = scaner(); // 获得一个新单词
    lrparser();

if(lexicalError == true && syntacticError == true)
{
    printf(“\nPlease correct the above lexical errors and syntactic errors for syntactic analysis!\n“);
}
else
{
        if(lexicalError == true)
        {
            printf(“\nPlease correct the above lexical errors for syntactic analysis!\n“);
        }
        else if(syntacticError == true)
        {
            printf(“\nPlease correct the above syntactic errors for syntactic analysis!\n“);
        }
}
return 0;
}

/*语法分析部分*/

/*语法分析函数*/
void lrparser()
{
    while(isLineBreak()); // 判断是否存在换行
    if(oneWord -> categoryCode != 1) // ‘begin‘的种别码
    {
    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件         79  2020-06-23 22:29  编译原理实践:C++实现语法分析器\input.txt

     文件      28089  2019-11-23 01:49  编译原理实践:C++实现语法分析器\syntacticParser.cpp

     文件     949095  2019-11-23 01:40  编译原理实践:C++实现语法分析器\syntacticParser.exe

     文件        548  2019-11-23 01:48  编译原理实践:C++实现语法分析器\程序运行说明文档.txt

     目录          0  2020-06-23 22:29  编译原理实践:C++实现语法分析器

----------- ---------  ---------- -----  ----

               977811                    5


评论

共有 条评论