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

📄 kld01dlg.cpp

📁 用EVC4.0实现的一种类似于BASIC的编程语言,可以实现基本的编程并可以执行
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// kld01Dlg.cpp : implementation file
//
/*
	单步模式:
	取出一条指令,进入执行,执行后返回值为下条要执行的指令




*/
#include "stdafx.h"
#include "kld01.h"
#include "kld01Dlg.h"
#include "conio.h"
#include "math.h"
#include "InputBox.h"

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

#define ProgramMaxNum		2000			//程序最大行数量
#define MacroMaxNum			200				//宏最大定义数量
#define VarMaxNum			500				//变量最大定义数量
#define ParMaxNum			20				//变量最大定义数量
#define JumpMaxNum			500				//标号最大定义数量
#define CodeTableLength     70				//命令字最大定义个数
#define CommandTableLength	30				//	
#define ParNum				28				//最大参数数量
#define macroParNum			ParNum-1		//宏最大参数数量
#define defineVarNum		2				//内部已定义的变量数量
#define CycShedMaxNum		20				//循环栈最大深度

typedef struct _TRACK
{	
	int		TrackIndex;						//栈指针
	CString TrackContent[100];				//100个点的栈空间
}TRACK;

typedef struct _POSTFIX
{	
	int		PostfixIndex;					//后缀表达式指针
	CString PostfixContent[100];			//100个点的空间
}POSTFIX;

typedef struct _EXPRESSION
{	
	int		ExpressionIndex;				//后缀表达式指针
	CString ExpressionContent[100];			//100个点的空间
}EXPRESSION;

typedef struct _ROBOT4IC
{
	CString codename;						//命令字表
	int code;								//转换后代码
	int parlength;							//命令字后参数实际数量
	CString PAR[ParNum];					//参数存放表
	int N[ParNum];							//数值化参数存放表
	int errline;							//错误发生的行号
	int err;								//错误类型
}ROBOT4IC;

//typedef struct _CODE 
//{
//	CString Table;							//未用
//	int length;
//}CODE;


typedef struct _MACROTABLE
{
	int		macmaxnum;						//宏的定义数量
	int		macsymbol;						//-1:未开始MACRO定义, =0:未记录起始点,=1:未记录结束点
	CString macname[MacroMaxNum];			//宏的名字
	int		parlength[MacroMaxNum];			//所带参数长度
	CString partable[MacroMaxNum][ParNum];	//参变量名表
	int		parstyle[MacroMaxNum][ParNum];	//参变量数据类型
	int		parplace[MacroMaxNum][ParNum];	//参变量对应变量表的位置
	int		macstart[MacroMaxNum];			//宏开始行
	int		macend[MacroMaxNum];			//宏结束行	

}MACROTABLE;

typedef struct _MOVEMENTENABLE				//运动状态字
{
	bool	moveEnable[4];
}MOVEMENTENABLE;

typedef struct _VARTABLE					//变量表
{
	int		varmaxnum;
	CString varname[VarMaxNum];				//变量名
	int		varstyle[VarMaxNum];			//变量类型	0=串	1=INT	2=LONG	3=FLOAT	4=DOUBLE
	CString	varvalueStr[VarMaxNum];			//变量值相应存放
	double	varvalueDouble[VarMaxNum];
}VARTABLE;

typedef struct _CYCSHED 
{
	int		cycmaxnum;						//循环栈当前最大层数
	CString cycname[CycShedMaxNum];			//变量名
	int		cycplace[CycShedMaxNum];		//变量在变量表中存放位置
	int		cyclineno[CycShedMaxNum];		//FOR的当前行号
	double	cycminvalue[CycShedMaxNum];		//循环下限
	double	cycmaxvalue[CycShedMaxNum];		//循环上限
	double	cycstep[CycShedMaxNum];			//步长
	int		cycnext[CycShedMaxNum];			//NEXT下一行对应的行号
}CYCSHED;


typedef struct _PARTABLE					//参量表
{
	int		parmaxnum;						//变量数量
	int		parstyle[ParMaxNum];			//变量类型	0=串	1=INT	2=LONG	3=FLOAT	4=DOUBLE
	CString	parvalueStr[ParMaxNum];			//变量值相应存放
	double	parvalueDouble[ParMaxNum];		//双精度型
}PARTABLE;


typedef struct _JUMPTABLE					//跳转表
{
	int		jumpmaxnum;						//最大数量
	int		jumpsymbol;						//-1:未开始JUMP定义, =0:未记录跳转点
	CString jumpname[JumpMaxNum];			//跳转标号名称
	int		jumpvalue[JumpMaxNum];			//跳转对应行
}JUMPTABLE;

ROBOT4IC	Rbt4IC[ProgramMaxNum];			//程序区定义
JUMPTABLE	JumpTable;						//跳转表
VARTABLE	VarTable;						//变量表
MACROTABLE	MacroTable;						//宏表
PARTABLE	ParTable;						//临时参数表
CYCSHED		CycShed;						//循环栈
ROBOT4IC	RBTCMD;							//命令缓冲定义


TRACK		Track;							//设置堆栈
POSTFIX		Postfix;						//后缀表达式存储区
EXPRESSION	Expression;						//后缀表达式存放
bool		PLAG;							//运算符标志
bool		RUNTTING;						//代码运行标志

CString		temp1,temp2;
int			err,errline,MAXNUM,plag,EXPsymbol;
int			findendmac;
bool		macdefinesymbol;				//是否是立即指令,FALSE=立即,TRUE=宏代码方式	
CString		CommandSAVE;
int			SystemRunMode;					//系统运行模式,0=运行,1=单步	
int			PC;								//PC记数器
bool		BREAKPOINT;						//		

/*命令定义

	REM	  [注释内容]							 注释
	LABEL [转移表号]							 转移表定义
	MACRO [宏名],[参数1],[参数2],...,[参数N]	 宏定义
	ENDMAC										 完成当前宏定义
	JUMP  [转移表号]							 转移到指定的程序行
	JEQ	  [参数1],[参数2],[转移表号]			 相同则转移
	JNE	  [参数1],[参数2],[转移表号]			 不同则转移
	JGT   [参数1],[参数2],[转移表号]			 大于则转移
	JLT   [参数1],[参数2],[转移表号]			 小于则转移
	JGTE  [参数1],[参数2],[转移表号]			 大于等于则转移
	JLTE  [参数1],[参数2],[转移表号]			 小于等于则转移
	JOR   [参数1],[参数2],[转移表号]			 或运算为真则转移
	JAND  [参数1],[参数2],[转移表号]			 与运算为真则转移
	JXOR  [参数1],[参数2],[转移表号]			 异或运算为真则转移
	PRINT [参数1],[参数2],...,[参数N]			 输出
	CSTRING [变量名1],[变量名2],...,[变量名N]	 定义串型变量
	INT	  [变量名1],[变量名2],...,[变量名N]		 定义整型变量
	LONG  [变量名1],[变量名2],...,[变量名N]      定义长整型变量
	FLOAT [变量名1],[变量名2],...,[变量名N]      定义浮点型变量
	DOUBLE[变量名1],[变量名2],...,[变量名N]      定义双精度型变量
	LET	  [变量名],[参数]						 赋值
	MUL	  [变量名],[参数]						 乘法计算
	DIV   [变量名],[参数]						 除法计算
	ADD   [变量名],[参数]						 加法计算
	SUB   [变量名],[参数]						 减法计算
	AND   [变量名],[参数]						 与运算
	XOR   [变量名],[参数]						 异或运算
	OR    [变量名],[参数]						 或运算
	SIN   [变量名],[参数]						 正弦计算
	COS   [变量名],[参数]						 余弦计算
	TAN   [变量名],[参数]						 正切计算
	STRCMP[变量名],[参数]						 比较
	RETURN[参数]								 结束宏并返回值到RETVAL变量中
	LEFT  [变量名],[参数1],[参数2]				 串左截取
	RIGHT [变量名],[参数1],[参数2]				 串右截取
	MID   [变量名],[参数1],[参数2],[参数3]		 串中间截取
	FOR   [变量名],[循环开始值],[循环结束值],[步长]开始一个循环
	NEXT										 循环结束
	TAB											 暂时不用
	UPPER [变量名],[参数]						 串换为大写
	LOWER [变量名],[参数]						 串换为小写
	CALL  [参数]								 调用宏
	EXP	  [变量名],[参数]						 计算串中表达式的值并赋给一个非串变量
	INPUT [参数],[变量名]						 从键盘输入一个参数,该命令将打开一个输入框
*/

CString CodeTable[CodeTableLength]=			//命令名表
	{"CC",	"CF",	"CN",	 "DC",	"DN",	"DS",	"EN",	"ER",	"GH",	"GO",
	"GR",	"GS",	"GT",	"IF",	"LC",   "LABEL","MACRO","ENDMAC","RS",	"JUMP",
	"PO",	"JEQ",	"JNE",	"JGT",	"JLT",	"JGTE",	"JLTE",	"JOR",	"JAND",	"JXOR",
	"PRINT","CSTRING","INT","FLOAT","LONG", "DOUBLE","DN","LET",	"MUL",	"DIV",
	"ADD",	"SUB",	"AND",	"XOR",	"OR",	"SIN",	"COS",	"TAN",	"ATN",	"STRCMP",
	"RETURN","LEFT","RIGHT","MID",	"FOR",	"NEXT",	"REM",	"TAB",	"UPPER","LOWER", 
	"CALL",	"EXP",	"INPUT","BREAK"};
		

int codelength[CodeTableLength]=			//参数长度表,-表示可变参数
	{1,		1,		1,		1,		1,		1,		1,		1,		1,		1,
	1,		1,		1,		1,		1,		1,		-27,	0,		0,		1,
	-6,		3,		3,		3,		3,		3,		3,		3,		3,		3,
	-27,	-27,	-27,	-27,	-27,	-27,	2,		2,		2,		2,
	2,		2,		2,		2,		2,		2,		2,		2,		2,		2,
	-1,		3,		3,		4,		4,		0,		-27,	-27,	-2,		-2,
	-17,	2,		-2,		0};

CString CommandTable[CodeTableLength]=			//立即命令表
	{"CC",	"CF",	"CN",	 "DC",	"DN",	"DS",	"EN",	"ER",	"GH",	"GO",
	"GR",	"GS",	"GT",    "LC",  "RS",	"PO",	"DN",	"STRCMP","VAR",	"HELP",
	"/?"};
		

int Commandlength[CodeTableLength]=			//参数长度表,-表示可变参数
	{1,		1,		1,		1,		1,		1,		1,		1,		1,		1,
	1,		1,		1,		1,		-1,		1,		1,		1,		-27,	0,
	0};

CString DataTemp[ParNum+1]={"","","","","","","","","","","","","","","","","",""};
CString DataCmd[ParNum+1]={"","","","","","","","","","","","","","","","","",""};
CString defineVar[2]={"GI00","RETVAL"};		//内部保留变量表
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	CString	m_commandhelp;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	m_commandhelp = _T("REM    [注释内容]                             注释\r\n");
	m_commandhelp+=_T("LABEL  [转移表号]                             转移表定义\r\n");				  
	m_commandhelp+=_T("MACRO  [宏名],[参数1],[参数2],...,[参数N]     宏定义\r\n");
	m_commandhelp+=_T("ENDMAC                                        完成当前宏定义\r\n");
	m_commandhelp+=_T("JUMP   [转移表号]                             转移到指定的程序行\r\n");
	m_commandhelp+=_T("JEQ    [参数1],[参数2],[转移表号]             相同则转移\r\n");
	m_commandhelp+=_T("JNE    [参数1],[参数2],[转移表号]             不同则转移\r\n");
	m_commandhelp+=_T("JGT    [参数1],[参数2],[转移表号]             大于则转移\r\n");
	m_commandhelp+=_T("JLT    [参数1],[参数2],[转移表号]             小于则转移\r\n");
	m_commandhelp+=_T("JGTE   [参数1],[参数2],[转移表号]             大于等于则转移\r\n");
	m_commandhelp+=_T("JLTE   [参数1],[参数2],[转移表号]             小于等于则转移\r\n");
	m_commandhelp+=_T("JOR    [参数1],[参数2],[转移表号]             或运算为真则转移\r\n");
	m_commandhelp+=_T("JAND   [参数1],[参数2],[转移表号]             与运算为真则转移\r\n");
	m_commandhelp+=_T("JXOR   [参数1],[参数2],[转移表号]             异或运算为真则转移\r\n");
	m_commandhelp+=_T("PRINT  [参数1],[参数2],...,[参数N]            输出\r\n");
	m_commandhelp+=_T("CSTRING[变量名1],[变量名2],...,[变量名N]      定义串型变量\r\n");
	m_commandhelp+=_T("INT    [变量名1],[变量名2],...,[变量名N]      定义整型变量\r\n");
	m_commandhelp+=_T("LONG   [变量名1],[变量名2],...,[变量名N]      定义长整型变量\r\n");
	m_commandhelp+=_T("FLOAT  [变量名1],[变量名2],...,[变量名N]      定义浮点型变量\r\n");
	m_commandhelp+=_T("DOUBLE [变量名1],[变量名2],...,[变量名N]      定义双精度型变量\r\n");
	m_commandhelp+=_T("LET    [变量名],[参数]                        赋值\r\n");
	m_commandhelp+=_T("MUL    [变量名],[参数]                        乘法计算\r\n");
	m_commandhelp+=_T("DIV    [变量名],[参数]                        除法计算\r\n");
	m_commandhelp+=_T("ADD    [变量名],[参数]                        加法计算\r\n");
	m_commandhelp+=_T("SUB    [变量名],[参数]                        减法计算\r\n");
	m_commandhelp+=_T("AND    [变量名],[参数]                        与运算\r\n");
	m_commandhelp+=_T("XOR    [变量名],[参数]                        异或运算\r\n");
	m_commandhelp+=_T("OR     [变量名],[参数]                        或运算\r\n");
	m_commandhelp+=_T("SIN    [变量名],[参数]                        正弦计算\r\n");
	m_commandhelp+=_T("COS    [变量名],[参数]                        余弦计算\r\n");
	m_commandhelp+=_T("TAN    [变量名],[参数]                        正切计算\r\n");
	m_commandhelp+=_T("STRCMP [变量名],[参数]                        比较\r\n");
	m_commandhelp+=_T("RETURN [参数]                                 结束宏并返回值到RETVAL变量中\r\n");
	m_commandhelp+=_T("LEFT   [变量名],[参数1],[参数2]               串左截取\r\n");
	m_commandhelp+=_T("RIGHT  [变量名],[参数1],[参数2]               串右截取\r\n");
	m_commandhelp+=_T("MID    [变量名],[参数1],[参数2],[参数3]       串中间截取\r\n");
	m_commandhelp+=_T("FOR    [变量名],[循环开始值],[循环结束值],[步长]开始一个循环\r\n");
	m_commandhelp+=_T("NEXT                                          循环结束\r\n");
	//m_commandhelp+=_T("TAB                                           暂时不用\r\n");
	m_commandhelp+=_T("UPPER  [变量名],[参数]                        串换为大写\r\n");
	m_commandhelp+=_T("LOWER  [变量名],[参数]                        串换为小写\r\n");
	m_commandhelp+=_T("CALL   [参数]                                 调用宏\r\n");
	m_commandhelp+=_T("EXP    [变量名],[参数]                        计算串中表达式的值并赋给一个非串变量\r\n");
	m_commandhelp+=_T("INPUT  [参数],[变量名]                        从键盘输入一个参数,该命令将打开一个输入框");

	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	DDX_Text(pDX, IDC_COMMANDHELP, m_commandhelp);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKld01Dlg dialog

CKld01Dlg::CKld01Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CKld01Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CKld01Dlg)
	m_edit = _T("");
	m_f = _T("");
	m_list1 = -1;
	m_jump = _T("");
	m_macronum = 0;
	m_CommandMode = _T("");
	m_defMacroIndex = _T("");
	m_var = 0;
	m_open_file = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CKld01Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CKld01Dlg)
	DDX_Control(pDX, IDC_LIST3, m_varIndex);
	DDX_Control(pDX, IDC_LIST2, m_jumpIndex);
	DDX_Control(pDX, IDC_LIST4, m_defMacro);
	DDX_Control(pDX, IDC_LIST1, m_list2);
	DDX_Text(pDX, IDC_EDIT1, m_edit);
	DDX_Text(pDX, IDC_EDIT2, m_f);
	DDX_LBIndex(pDX, IDC_LIST1, m_list1);
	DDX_LBString(pDX, IDC_LIST2, m_jump);
	DDX_Text(pDX, IDC_EDIT4, m_macronum);
	DDX_Text(pDX, IDC_EDIT3, m_CommandMode);
	DDX_LBString(pDX, IDC_LIST4, m_defMacroIndex);
	DDX_Text(pDX, IDC_EDIT5, m_var);
	DDX_Text(pDX, IDC_EDIT6, m_open_file);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CKld01Dlg, CDialog)
	//{{AFX_MSG_MAP(CKld01Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_RUN, OnRun)
	ON_BN_CLICKED(IDC_OPENFILE, OnOpenfile)
	ON_BN_CLICKED(IDC_SAVEFILE, OnSavefile)
	ON_BN_CLICKED(IDC_NEW, OnNew)
	ON_BN_CLICKED(IDC_CLEARF, OnClearf)
	ON_LBN_SELCHANGE(IDC_LIST4, OnSelchangeList4)
	ON_BN_CLICKED(IDC_RUNSELECTMACRO, OnRunselectmacro)
	ON_WM_TIMER()
	ON_EN_SETFOCUS(IDC_EDIT2, OnSetfocusEdit2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKld01Dlg message handlers

BOOL CKld01Dlg::OnInitDialog()  /*初始化*/
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	macdefinesymbol =0;
	JumpTable.jumpmaxnum=0;
	VarTable.varmaxnum =0;
	ParTable.parmaxnum =0;
	MacroTable.macmaxnum=0;
	MacroTable.macsymbol=-1;
	CycShed.cycmaxnum=0;
	m_CommandMode="单模块方式";
	CommandSAVE.Empty();
	BREAKPOINT=false;
	UpdateData(false);
	
	//m_list2
	// TODO: Add extra initialization here
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CKld01Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();

⌨️ 快捷键说明

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