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

📄 define.h

📁 一个非常好的词法分析程序,加上语法的分析是一个难得一见的好实例
💻 H
字号:
#include "stdafx.h"

#ifndef _DEFINE_
#define _DEFINE_

//单词属性
enum LEXPROPERTY{KeyWord,Id,Const,OprSym,BndSym,IllegalChar};//关键字,变量,常量,运算符,界符,非法字符

#pragma pack(push,1)

//由词和属性构成的属性对
struct LEXPROPERTYVS
{
	int nStrPos;		   //该字符串在要编译的字符串中的位置
	int nStrLen;		   //该字符串的长度
	LEXPROPERTY lpProperty;//该字符串的属性
	char *szStr;		   //字符串
};

//语法错误对应的结构体
struct SYNTAXERR
{
	int iSyntaxErrCode;//语法错误代码
	int iLine;		   //该错误所在的行数
};

#pragma pack(push,1)

//语法错误编号
#define SE_ILLEGALCHAR			   0//非法的字符

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

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

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

#define SE_ID_PROCNAMEFIRST       21//定义过程名的变量名的第一个字符必须为字母
#define SE_ID_PROCNAMEMID	      22//定义过程名的变量名的中间字符或为字母或为数字
#define SE_FE_PROCNONAME          23//遇到意外的文件结束:关键字Procedure后面必须有过程名
#define SE_PROCLSYMBOL		      24//定义过程名后必须加'('
#define SE_PROCRSYMBOL		      25//写完过程参数后必须加')'
#define SE_FE_NOPROCSYMARG        26//遇到意外的文件结束:过程名后无括号和参数
#define SE_FE_PROCNOARG		      27//遇到意外的文件结束:过程名后无参数
#define SE_ID_PROCARGNAMEFIRST    28//定义过程参数的变量名的第一个字符必须为字母
#define SE_ID_PROCARGNAMEMID      29//定义过程参数的变量名的中间字符或为字母或为数字
#define SE_FE_PROCNORSYM          30//遇到意外的文件结束:过程参数后应有')'
#define SE_PROCEND				  31//定义完过程后必须以分号结束
#define SE_FE_PROCAGRNOEND		  32//遇到意外的文件结束:过程参数还未写完
#define SE_FE_PROCEND			  33//遇到意外的文件结束:定义完过程后必须以分号结束
#define SE_FE_PROCNOBLOCK		  34//遇到意外的文件结束:过程无块
#define SE_FE_PROCNOPROC		  35//遇到意外的文件结束:另一个过程还未定义

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

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

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

#define SE_FE_WHILENOLEXPDOSTATE  49//遇到意外的文件结束:while语句后没有表达式,关键字do和语句
#define SE_FE_WHILENODOSTATE      50//遇到意外的文件结束:while语句后没有关键字do和语句
#define SE_NODO					  51//while语句没有关键字do
#define SE_FE_WHILENOSTATE        52//遇到意外的文件结束:while语句后没有关键字do

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

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

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

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

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

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

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

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

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

#define SE_FE_NOCODE			  85//遇到意外的文件结束:源文件为空文件

//变量命名错误编号
#define ID_FIRSTERR 0//变量的第一个字符必须为字母
#define ID_MIDERR   1//变量的中间字符或者是字母或者是数字

//遇到意外的文件结束
#define FILEEND -2

#endif

⌨️ 快捷键说明

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