📄 plxcompile.cs
字号:
error("call 语句无法识别!");
}
}
else
{
/* 空语句 */
}
}
// or/xor表达式语句
void be()
{
bt();
while (sym == orsym || sym == xorsym)
{
if (sym == orsym)
{
getsym();
bt();
gen(fct.OPR, 0, 14);
}
else
{
getsym();
bt();
gen(fct.OPR, 0, 19);
}
}
}
//数学整形表达式
void ae()
{
int addop = -1;
if (sym == minus)
{
addop = sym;
getsym();
at();
gen(fct.OPR, 0, 1);
}
else
{
at();
}
while (sym == minus || sym == plus)
{
addop = sym;
getsym();
at();
if (addop == plus)
{
gen(fct.OPR, 0, 2);
}
else
{
gen(fct.OPR, 0, 3);
}
}
}
//数学乘除求余表达式
void at()
{
af();
int mulop = -1;
while (sym == times || sym == slash || sym == remainder || sym == cifang)
{
mulop = sym;
getsym();
af();
if (mulop == times)
{
gen(fct.OPR, 0, 4);
}
else if (mulop == slash)
{
gen(fct.OPR, 0, 5);
}
else if (mulop == remainder)
{
gen(fct.OPR, 0, 17);
}
else
{
gen(fct.OPR, 0, 18);
}
}
}
//and 布尔表达式
void bt()
{
bf();
while (sym == andsym)
{
getsym();
bf();
gen(fct.OPR, 0, 15);
}
}
//表达式因子
void af()
{
if (sym == ident)
{
int index = position(id);
if (index == 0)
{
error("'%s' 没有定义!");
}
else
{
int kind = (int)table[index].kind;
if (kind == (int)vartype.varInteger)
{
gen(fct.LOD, lev - table[index].level, table[index].adr);
getsym();
}
else if (kind == (int)vartype.varConst)
{
gen(fct.LIT, 0, table[index].val);
getsym();
}
else
{
//error("'%s' 运算式中不可使用!", id);
}
}
}
else
{
if (sym == lparen)
{
getsym();
ae();
if (sym == rparen)
{
getsym();
}
else
{
error("缺乏')'标识符!");
}
}
else if (sym == number)
{
gen(fct.LIT, 0, num);
getsym();
}
else
{
error("不可识别的运算因子!");
}
}
}
//布尔表达式
void bf()
{
if (sym == ident)
{
int index = position(id);
if (index == 0)
{
error("'%s' 标识符未定义!");
}
else
{
if (table[index].kind == vartype.varLogical)
{
gen(fct.LOD, lev - table[index].level, table[index].adr);
getsym();
}
else
{
re();
}
}
}
else if (sym == truesym)
{
getsym();
gen(fct.LIT, 0, 1);
}
else if (sym == falsesym)
{
getsym();
gen(fct.LIT, 0, 0);
}
else if (sym == notsym)
{
getsym();
bf();
gen(fct.OPR, 0, 16);
}
else if (sym == lparen)
{
getsym();
be();
if (sym == rparen)
{
getsym();
}
else
{
error("运算式缺少 ')' 标识符!");
}
}
else
{
re();
}
}
//比较运算表达式
void re()
{
ae();
switch (sym)
{
case eql: getsym();
ae();
gen(fct.OPR, 0, 8);
break;
case gtr: getsym();
ae();
gen(fct.OPR, 0, 12);
break;
case lss: getsym();
ae();
gen(fct.OPR, 0, 10);
break;
case geq: getsym();
ae();
gen(fct.OPR, 0, 11);
break;
case leq: getsym();
ae();
gen(fct.OPR, 0, 13);
break;
case neql: getsym();
ae();
gen(fct.OPR, 0, 9);
break;
default: error("错误的运算符号!"); break;
}
}
// 中间码结构
public enum instruction :int{OPR, LIT, LOD, STO, INT, JMP, JPC, SHO, CAL };
public enum fct : int { OPR, LIT, LOD, STO, INT, JMP, JPC, SHO, CAL };
public struct CODE
{
public fct f;
public int l;
public int a;
public int line;
};
//存储代码的数组和指标
CODE[] code;
int cx;
public string codeSource;
public string result;
///生成代码
void gen(fct _f, int _l, int _a)
{
if (cx < MAX_CODENUMBER)
{
code[cx].f = _f;
code[cx].l = _l;
code[cx].a = _a;
code[cx].line = lineIndex;
cx++;
}
else
{
error("程序长度溢出!");
}
}
/* 虚拟机 */
int[] s; /* 运行栈 */
int t; /* 运行栈指针 */
CODE i; /* 指令寄存器 */
int p; /* PC寄存器 */
int b; /* 基地址寄存器 */
// 虚拟机 */
public void interpret()
{
t = 0;
b = 1;
p = 0;
s[1] = 0;
s[2] = 0;
s[3] = 0;
do
{
i = code[p];
p++;
switch (i.f)
{
case fct.LIT: t++;
s[t] = i.a;
break;
case fct.OPR: switch (i.a)
{
case 0: t = b - 1;
p = s[t + 3];
b = s[t + 2];
break;
//负数
case 1: s[t] = -s[t];
break;
case 2: t--;//加法
s[t] = s[t] + s[t + 1];
break;
case 3: t--;//减法
s[t] = s[t] - s[t + 1];
break;
case 4: t--;//乘法
s[t] = s[t] * s[t + 1];
break;
case 5: t--;//除法
s[t] = s[t] / s[t + 1];
break;
case 17: t--;//求余
while (s[t] >= s[t + 1])
{
s[t] = s[t] - s[t + 1];
}
break;
case 6: break;
case 7: break;
case 8: t--;//等于
s[t] = s[t] == s[t + 1] ? 1 : 0;
break;
case 9: t--;//不等于
s[t] = s[t] != s[t + 1] ? 1 : 0;
break;
case 10: t--;//小于
s[t] = s[t] < s[t + 1] ? 1 : 0;
break;
case 11: t--;//大于等于
s[t] = s[t] >= s[t + 1] ? 1 : 0;
break;
case 12: t--;//大于
s[t] = s[t] > s[t + 1] ? 1 : 0;
break;
case 13: t--;//小于等于
s[t] = s[t] <= s[t + 1] ? 1 : 0;
break;
case 14: t--;//或运算
s[t] = ((s[t]==1) || (s[t + 1]==1))? 1:0;
break;
case 19: t--;//异或
s[t] = (s[t] == s[t + 1]) ? 1 : 0; break;
case 15: t--;//与运算
s[t] = ((s[t] == 1) && (s[t + 1] == 1)) ? 1 : 0;
break;
//非运算
case 16: s[t] = (s[t] == 1) ? 0 : 1;
break;
case 18: t--;//乘方
int tempt = s[t + 1];
int num = s[t];
while (tempt > 1)
{
s[t] = s[t] * num;
tempt--;
}
break;
}
break;
case fct.LOD: t++;
s[t] = s[based(i.l) + i.a];
break;
case fct.STO: s[based(i.l) + i.a] = s[t];
t--;
break;
case fct.CAL: s[t + 1] = based(i.l);
s[t + 2] = b;
s[t + 3] = p;
b = t + 1;
p = i.a;
break;
case fct.INT: t = t + i.a;
break;
case fct.JMP: p = i.a;
break;
case fct.JPC: if (s[t] == 0)
{
p = i.a;
}
t--;
break;
case fct.SHO:
result += s[t] + "\r\n";
t--;
break;
default: break;
}
} while (p != 0);
}
//计算静态链地址
int based(int l)
{
int b1 = b;
int l1 = l;
while (l1 > 0)
{
b1 = s[b1];
l1 = l1 - 1;
}
return b1;
}
// 清空重新初始化
void clear()
{
cc = 0;
ll = 0;
lineIndex = 1;
tx = 0;
cx = 0;
dx = 0;
lev = 0;
errornum = 0;
}
// 屏幕上显示中间码
public void showCode()
{
string[] word = {"OPR",
"LIT",
"LOD",
"STO",
"INT",
"JMP",
"JPC",
"SHO",
"CAL"};
codeSource = "CODE: \r\n";
for (int i = 0; i < cx; i++)
{
codeSource += i + ","+ word[(int)code[i].f]+","+code[i].l+","+code[i].a+"\r\n";
}
}
//开始编译
public void Compiler()
{
clear();
getch();
getsym();
//Console.WriteLine("Compiling......");
Prog();
FileClose();
result = "";
// Console.WriteLine("Succeed");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -