📄 assembler.h
字号:
#ifndef ASSEMBLER_H
#define ASSEMBLER_H
#include "structs.h"
#include "errors.h"
#include <string>
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <list>
#include <stack>
#include <cmath>
using namespace std;
class Assembler
{
public:
Assembler();
~Assembler();
void Parser( FILE* SourceFileName );
int SyntacticAnalysis( FILE* SourceFileName );
int Scanner( int, FILE* );
int Deduction( int );
char ReadOneChar( FILE* SourceFileName ); //读取下一个不是空白符或制表符的字符
void InitTwoTables();
void InitRegsAlias();
void GenFiles();
void ShutFiles();
int WriteProg(); //将指令写入程序文件
int AddNormalSegID();//如果最近采用的是27号产生式,则IDNAME是指令标号,顺序保存到标号表SEGID
//如果标号有重复则错误退出, return 21;否则正确退出,return 0;
int AddStartSegID(); //如果最近采用的是15号产生式,则IDNAME是起始指令标号,保存到标号表SEGID的最前面
//如果标号有重复则错误退出, return 21;否则正确退出,return 0;
int ConstructCMD(); // 将当前单词翻译为二进制码,存入CMD,如果翻译失败则return 10;退出
int ConstructCOMMANDS(); //将CMD按照指令顺序保存到指令链COMMANDS,如果失败则return 10;退出
int StoreVar(); //将变量标识符保存到VAR,如果失败则return 23;退出
int AddBackID(); //将待回填的标号保存起来,保存到BACKTABLE中
int BackWrite(); //在WriteProg()中首先调用该回填函数,完成指令,再写程序文件
char* DecToBin(int); //将0~31转化为二进制填入一个5bits的字符串中
char* HexToBin(char); //将一位十六进制数转化为二进制填入一个4bits的字符串中
int AddrToInt(char*); //将由四位十六进制的ADDR转化为十进制,使得用ORG设置指令(数据)地址时方便
int SegNameToAddr(char*); //由SEGID的名称来取出其地址
int VarNameToAddr(char*); //由VAR的名称来取出其地址
bool StrCmp(char*, char*); //比较两个字符串,如果相同则返回true,否则返回false
void ErrorProcess(int); //翻译错误处理
void ErrorLex(); //词法错误处理,注意当前的TOKEN就是出错的地方,这可以用No_TxtLine来标识
void DeleteFiles(); //程序不成功,就把已建的两个.mif文件删除掉
private:
// 预测分析表
int ForcastTable[CountOfVN][CountOfVT];
//语法规则表
int SyntacticRules[NumOfRule][DepthOfRule];
//寄存器编号与别名对应表
char* RegsAlias[32][2];
FILE* DataFile;
FILE* ProgramFile;
My_Token TOKEN;
list<My_Var> VAR;
list<My_SegID> SEGID;
list<My_CMD> COMMANDS;
list<My_Back> BACKTABLE;
stack<int> STACK;
int No_Com; //指令行编号
int No_Var; //变量行编号
char CMD[32]; //暂存指令,32位
// int rv; //Scanner的返回值,作为ErrorLex的入口参数 改为: 直接用STACK.top()作为ErrorLex的入口参数
int No_TxtLine; //输入文件(汇编源程序)的行号,主要用于识错时
bool CodeUnitUsed[RamSize];
bool DataUnitUsed[RamSize]; // 这两个用来指示哪些代码(或数据)单元已被占用,false表示未被占用,true表示已被占用
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -