📄 interpretor.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Text.RegularExpressions;
using System.Threading;
namespace CmmInterpretor
{
class Interpretor
{
public Interpretor()
{
//初始化程序
CurLevel = 0; //当前层次
IDLst = new ArrayList(); //初始化标识符列表
ValueLst = new ArrayList(); //初始化值列表
ValueLstIndex = 0; //初始化值列表索引
LastInputID = ""; //显示最后一条输入语句的标识符
isTmpStopped = false; //判断是否临时中断程序 (等待用户输入)
hasFinished = false; //判断是否已完成
}
//初始化程序段,进行词法分析检查
public void InitInterpretor(ref string sourceCode,ref TextBox resultTextBox)
{
this.ResultBox = resultTextBox;
bool isRemark = false;
wordAnalysis.RemoveRemark(ref sourceCode, ref isRemark);
sourceCode = Regex.Replace(sourceCode, @"[\t\n\r]", " ").ToString();
//判断词法错误
wordAnalysis.ErrorNum = 0;
string[] words = wordAnalysis.GetWords(sourceCode);
foreach (string word in words)
wordAnalysis.GetWordType(word);
int errWordNum = wordAnalysis.ErrorNum;
if (errWordNum > 0)
{
DialogResult response =
MessageBox.Show("该代码有" + Convert.ToString(errWordNum)
+ "个词法错误。继续分析?",
"确定", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
ResultBox.Text += "代码有"
+ Convert.ToString(errWordNum) + "个词法错误。"
+ "点击“词法分析”可了解具体内容。\r\n\r\n";
if (response == System.Windows.Forms.DialogResult.No)
{
hasFinished = true;
return;
}
}
}
//生成中间代码
public void CreateMidCode(ref string sourceCode, ref TextBox resultTextBox)
{
InitInterpretor(ref sourceCode,ref resultTextBox);
CodeNum = 1;
while (true)
{
CMMStatement curSt = grammerAnalysis.SeparateFirstStatement(ref sourceCode);
if (curSt.Type == NULLST)
break;
else
CodeSt(curSt);
}
}
//生成单条语句的中间代码
public void CodeSt(CMMStatement st)
{
grammerAnalysis.AnalyzeStatement(ref st);
switch (st.Type)
{
case NULLST:
printMidCode("END","null","null","null");
break;
case EMPTY:
break;
case COMPLEX:
CodeComplex(st);
break;
case DECLARE:
CodeDeclare(st);
break;
case ASSIGN:
CodeAssign(st);
break;
case INPUT:
CodeInput(st);
break;
case OUTPUT:
CodeOutput(st);
break;
case SELECT:
CodeSelect(st);
break;
case LOOP:
CodeLoop(st);
break;
case ELSE_BR:
case ERROR:
default:
break;
}
}
//声明语句
public void CodeDeclare(CMMStatement st)
{
printMidCode("FIND","tmp",st.Els[0],"IDLst");
printMidCode("JUMP",Convert.ToString(CodeNum+2),"tmp","null");
printMidCode("JUMP",Convert.ToString(CodeNum+2),"null","null");
printMidCode("DCL", st.Els[0], "IDLst", "null");
if (!st.Els[3].Equals(NOTASS))
{
printMidCode("COUNT","tmp","tmpExp","null");
printMidCode("=",st.Els[0],"tmp","null");
}
}
//复合语句
public void CodeComplex(CMMStatement st)
{
//复合语句元素0:括号间的内容
string cmpsts = st.Els[0];
while (true)
{
CMMStatement curSt = grammerAnalysis.SeparateFirstStatement(ref cmpsts);
if (curSt.Type == NULLST)
break;
else
CodeSt(curSt);
}
}
//赋值语句判断
public void CodeAssign(CMMStatement st)
{
printMidCode("COUNT","tmp","tmpExp","null");
printMidCode("=",st.Els[0],"tmp","null");
}
//输入语句判断
public void CodeInput(CMMStatement st)
{
printMidCode("RRAD",st.Els[0],"null","null");
}
//输出语句判断
public void CodeOutput(CMMStatement st)
{
printMidCode("COUNT","tmp","tmpExp","null");
printMidCode("WRT","tmp","null","null");
}
//选择语句
public void CodeSelect(CMMStatement st)
{
printMidCode("COUNT","tmpLeft","tmpExpLeft","null");
printMidCode("COUNT","tmpRight","tmpExpRight","null");
printMidCode("CMP","tmp","tmpLeft","tmpRight");
printMidCode("JUMP",Convert.ToString(CodeNum+3),"tmp","null");
CodeSt(new CMMStatement(st.Els[1]));
printMidCode("JUMP",Convert.ToString(CodeNum+2),"tmp","null");
CodeSt(new CMMStatement(st.Els[2]));
}
//循环语句
public void CodeLoop(CMMStatement st)
{
printMidCode("COUNT","tmpLeft","tmpExpLeft","null");
printMidCode("COUNT","tmpRight","tmpExpRight","null");
printMidCode("CMP","tmp","tmpLeft","tmpRight");
printMidCode("JUMP",Convert.ToString(CodeNum+3),"tmp","null");
CodeSt(new CMMStatement(st.Els[1]));
printMidCode("JUMP",Convert.ToString(CodeNum-3),"tmp","null");
}
//运行全部代码进行分析
public void RunAllCode(ref string sourceCode, ref TextBox resultTextBox)
{
InitInterpretor(ref sourceCode,ref resultTextBox);
RunCode(ref sourceCode);
}
//运行代码
public void RunCode(ref string sourceCode)
{
//解释运行
while (true)
{
if (hasFinished || IsTmpStopped)
break;
CMMStatement curSt = grammerAnalysis.SeparateFirstStatement(ref sourceCode);
if (curSt.Type == NULLST)
hasFinished = true;
else
ExecuteSt(curSt);
}
}
//输入语句中断后继续运行
public void GoOnRunCode(ref string sourceCode, string inputString)
{
isTmpStopped = false;
CMMStatement lastSt = new CMMStatement(LastInputID + "=" + inputString + ";");
ExecuteSt(lastSt);
RunCode(ref sourceCode);
}
//执行语句
public void ExecuteSt(CMMStatement st)
{
grammerAnalysis.AnalyzeStatement(ref st);
switch (st.Type)
{
case NULLST:
case EMPTY:
break;
case COMPLEX:
ExecuteComplex(st);
break;
case DECLARE:
ExecuteDeclare(st);
break;
case ASSIGN:
ExecuteAssign(st);
break;
case INPUT:
ExecuteInput(st);
break;
case OUTPUT:
ExecuteOutput(st);
break;
case SELECT:
ExecuteSelect(st);
break;
case LOOP:
ExecuteLoop(st);
break;
case ELSE_BR:
case ERROR:
ExecuteError(st);
break;
default:
break;
}
}
//执行声明语句
public void ExecuteDeclare(CMMStatement st)
{
string varId = st.Els[0]; //变量id
int varType = 0; //变量类型
if (st.Els[1].Trim().Equals("int"))
varType = INTG;
else if (st.Els[1].Trim().Equals("real"))
varType = REAL;
string varArrLength = st.Els[2]; //数组长度
string varValue = st.Els[3]; //初始化的值
foreach (Variable var in IDLst)
{
if (var.VID.Equals(varId))
{
ExecuteError(st, "变量" + varId + "已声明");
return;
}
}
Variable newVar = new Variable(varId, varType);
newVar.VLevel = CurLevel;
newVar.VIndex = ValueLstIndex;
if (varArrLength.Equals(NOTARR)) //非数组
{
newVar.VArrLength = 1;
if (varValue.Equals(NOTASS)) //未赋值
{
ValueLst.Add(null);
ValueLstIndex++;
}
else //已赋值
{
ArthmExp valueExp = new ArthmExp(varValue);
if (varType == INTG)
{
int assValue = 0;
if (valueExp.GetValue(IDLst, ValueLst, ref assValue))
{
ValueLst.Add(assValue);
ValueLstIndex++;
}
else
ExecuteError(st,
"表达式类型与变量类型不一致或者标识符尚未声明");
}
else if (varType == REAL)
{
double assValue = 0.0;
if (valueExp.GetValue(IDLst, ValueLst, ref assValue))
{
ValueLst.Add(assValue);
ValueLstIndex++;
}
else
{
int assIntValue = 0;
if (valueExp.GetValue(IDLst, ValueLst, ref assIntValue))
{
ResultBox.Text += "(提示) > 执行 '" + st.Con
+ "' 时,已将右侧整型赋值强制转化为实型\r\n";
assValue = (double)assIntValue;
ValueLst.Add(assValue);
ValueLstIndex++;
}
else
ExecuteError(st,
"表达式类型与变量类型不一致或者标识符尚未声明");
}
}
}
}
else //数组
{
ArthmExp arrLengthExp = new ArthmExp(varArrLength);
int arrLength = 0;
if (arrLengthExp.GetValue(IDLst, ValueLst, ref arrLength))
{
if (arrLength > 0)
{
newVar.VArrLength = arrLength; //数组长度
for (int i = 0; i < arrLength; i++)
{
ValueLst.Add(null);
}
ValueLstIndex += arrLength;
}
else
ExecuteError(st,
"数组长度应为大于0的整型常量");
}
else
{
ExecuteError(st,
"数组长度应为大于0的整型常量");
}
}
IDLst.Add(newVar);
}
//执行复合语句
public void ExecuteComplex(CMMStatement st)
{
string cmpsts = st.Els[0];
RunCode(ref cmpsts);
hasFinished = false;
}
//执行赋值语句
public void ExecuteAssign(CMMStatement st)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -