📄 kld01dlg.cpp
字号:
// 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 + -