⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pl.cpp

📁 一个非常好的词法分析程序,加上语法的分析是一个难得一见的好实例
💻 CPP
字号:
// PL.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "PL.h"
#include "Compiler.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

const char strSyntaxErrTip[][70]=
{
	"非法字符",														 //0

	"程序必须以关键字Program开头",									 //1
	"定义程序名的变量名后必须以分号结束",							 //2
	"定义程序名的变量名的第一个字符必须为字母",						 //3
	"定义程序名的变量名的中间字符或为字母或为数字",					 //4
	"遇到意外的文件结束:关键字Program后应有程序名,分号和程序块",	 //5
	"遇到意外的文件结束:程序名后必须有分号和程序块",				 //6
	"遇到意外的文件结束:程序必须有程序块",							 //7

	"定义常量时必须以关键字Const开头",								 //8
	"遇到意外的文件结束:关键字Const后面必须有变量名",				 //9
	"定义常量的变量名的第一个字符必须为字母",						 //10
	"遇到意外的文件结束:必须给常量赋值",							 //11
	"常量赋值符号应为“:=”",										 //12
	"遇到意外的文件结束:常量赋值符号“:=”后应有常量",				 //13
	"Const定义的常量应为整数",										 //14
	"遇到意外的文件结束:定义常量时,“,”后面应该有变量",			 //15

	"遇到意外的文件结束:程序必须有程序体",							 //16
	"遇到意外的文件结束:关键字Var后面必须有变量名",					 //17
	"定义变量的变量名的第一个字符必须为字母",					     //18
	"定义变量的变量名的中间字符或为字母或为数字",					 //19
	"遇到意外的文件结束:定义变量还未结束,“,”后必须有变量",		 //20

	"定义过程名的变量名的第一个字符必须为字母",						 //21
	"定义过程名的变量名的中间字符或为字母或为数字",					 //22
	"遇到意外的文件结束:关键字Procedure后面必须有过程名",			 //23
	"定义过程名后必须加“(”",										 //24
	"写完过程参数后必须加“)”",									 //25
	"遇到意外的文件结束:过程名后无括号和参数",						 //26
	"遇到意外的文件结束:过程名后无参数",							 //27
	"定义过程参数的变量名的第一个字符必须为字母",					 //28
	"定义过程参数的变量名的中间字符或为字母或为数字",				 //29
	"遇到意外的文件结束:过程参数后应有“)”",						 //30
	"定义完过程后必须以分号结束",									 //31
	"遇到意外的文件结束:过程参数还未写完",							 //32
	"遇到意外的文件结束:定义完过程后必须以分号结束",				 //33
	"遇到意外的文件结束:过程无块",									 //34
	"遇到意外的文件结束:另一个过程还未定义",						 //35

	"程序体必须以关键字Begin开头",									 //36
	"遇到意外的文件结束:程序体无语句",								 //37
	"遇到意外的文件结束:程序体应该以关键字End结束",					 //38
	"遇到意外的文件结束:语句后面的分号后面应该还有语句",			 //39
	"程序体应该以关键字End结束",									 //40

	"遇到意外的文件结束:赋值语句没有赋值符号与表达式",				 //41
	"赋值符号应为:=",												 //42
	"遇到意外的文件结束:赋值语句没有表达式",						 //43

	"遇到意外的文件结束:if语句后没有表达式,关键字then和表达式",      //44
	"if语句没有关键字then",											 //45
	"遇到意外的文件结束:if语句后没有关键字then和表达式",			 //46
	"遇到意外的文件结束:if语句的关键字then后没有表达式",			 //47
	"遇到意外的文件结束:if语句的关键字else后面没有表达式",			 //48

	"遇到意外的文件结束:While语句后没有表达式,关键字Do和语句",		 //49
	"遇到意外的文件结束:While语句后没有关键字do和语句",				 //50
	"while语句没有关键字Do",										 //51
	"遇到意外的文件结束:While语句后没有关键字Do",					 //52

	"遇到意外的文件结束:Call语句后过程名",							 //53
	"关键字Call所调用的过程名的第一个字符必须为字母",				 //54
	"关键字Call所调用的过程名的中间字符或为字母或为数字",			 //55
	"遇到意外的文件结束:Call语句后无表达式",						 //56
	"遇到意外的文件结束:Call语句调用过程时'('后面必须有表达式和')'", //57
	"遇到意外的文件结束:Call语句调用过程时后面必须有')'",			 //58
	"Call语句调用过程时后面必须有')'",								 //59

	"遇到意外的文件结束:Read语句后无'('和变量和')'",				 //60
	"Read语句后没有'('",											 //61
	"遇到意外的文件结束:Read语句后无变量和')'",						 //62
	"关键字Read后的变量的第一个字符必须为字母",						 //63
	"关键字Read后的变量的中间字符或为字母或为数字",					 //64
	"遇到意外的文件结束:Read语句无')'",								 //65
	"Read语句没有')'",												 //66
	"遇到意外的文件结束:Read语句中逗号','后无变量",					 //67

	"遇到意外的文件结束:write语句后无'(',表达式和')'",				 //68
	"Write语句没有'('",												 //69
	"遇到意外的文件结束:Write语句后无表达式和')'",					 //70
	"遇到意外的文件结束:Write语句后无')'",							 //71
	"Write语句后没有')'",											 //72
	"遇到意外的文件结束:Write语句中逗号','后无变量",				 //73
	"关键字Write后的变量的第一个字符必须为字母",					 //74
	"关键字Write后的变量的中间字符或为字母或为数字",				 //75

	"遇到意外的文件结束:因子无'(',表达式和')'",						 //76
	"因子后没有')'",												 //77

	"遇到意外的文件结束:表达式后无项",								 //78
	"遇到意外的文件结束:表达式中'+'或'-'后无项",					 //79

	"遇到意外的文件结束:表达式后应有运算符和表达式",				 //80
	"表达式之间无运算符号",											 //81

	"遇到意外的文件结束:关键字Odd应有表达式",						 //82

	"遇到意外的文件结束:项无'(',表达式和')'",						 //83

	"多余的文件尾-程序以程序块结束,程序块后面不应再有程序",			 //84

	"遇到意外的文件结束:源文件为空文件",							 //85
};

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}

	if(argc==1)
	{
		cout<<"\r\n------ 无源文件 ------";
		return nRetCode;
	}

	CCompiler compiler;
	vector<SYNTAXERR> vectorSETemp;
	int nSize;
	int i;

	cout<<"-------- 已启动生成 --------\n\n";
	cout<<"正在编译...\n\n";
	cout<<argv[1]<<"\n\n";

	compiler.Compile(argv[1]);
	vectorSETemp=compiler.GetSyntaxErr();
	nSize=vectorSETemp.size();
	if(!nSize)//无错误
		cout<<argv[1]<<" - 0 错误\n\n\n------------- 完成 -------------\n\n生成: 1 已成功, 0 已失败, 0 已跳过";
	else
	{
		for(i=0;i<nSize;i++)
			printf("错误%d:%s\n\n",i+1,strSyntaxErrTip[vectorSETemp[i].iSyntaxErrCode]);

		printf("\n%s - %d 错误\n\n\n------------- 完成 -------------\n\n生成: 0 已成功, 1 已失败, 0 已跳过",argv[1],nSize);
	}

	return nRetCode;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -