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

📄 interpretor.cs

📁 关于CMM语言的解释器
💻 CS
📖 第 1 页 / 共 2 页
字号:
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 + -