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

📄 casl.y.bak

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 BAK
📖 第 1 页 / 共 3 页
字号:
                                }
                                g_tempCode.type = CASL_JNZ;
                                g_tempCode.operand1.type = EA_OPERAND;
                                g_tempCode.operand1.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand1.OperandVal.eaOperand.address = g_currentEAAddress;
                                g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
JZESTMT: LBLSTMT JZE EA

                            {
                                                                            
                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_JZE;
                                g_tempCode.operand1.type = EA_OPERAND;
                                g_tempCode.operand1.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand1.OperandVal.eaOperand.address = g_currentEAAddress;
                                g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
STACKSTMT: PUSHSTMT | POPSTMT

PUSHSTMT: LBLSTMT PUSH EA

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_PUSH;
                                g_tempCode.operand1.type = EA_OPERAND;
                                g_tempCode.operand1.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand1.OperandVal.eaOperand.address = g_currentEAAddress;
                                g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
POPSTMT: LBLSTMT POP GR

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_POP;
                                g_tempCode.operand1.type = REG_OPERAND;
                                g_tempCode.operand1.OperandVal.regOperand.regNumber = g_iCurrentRegNumber;
                                g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
PROCSTMT: CALLSTMT | RETSTMT

CALLSTMT: LBLSTMT CALL EA

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_CALL;
                                g_tempCode.operand1.type = EA_OPERAND;
                                g_tempCode.operand1.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand1.OperandVal.eaOperand.address = g_currentEAAddress;
                                g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
RETSTMT: LBLSTMT RET

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_RET;
                                g_tempCode.operand1.type = EMPTY_OPERAND;
                                //g_tempCode.operand1.OperandVal.regOperand.regNumber = g_iCurrentRegNumber;
                                g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
MACROSTMT: EXITSTMT | INSTMT | OUTSTMT

EXITSTMT: LBLSTMT EXIT

INSTMT: LBLSTMT IN LABEL ',' LABEL

OUTSTMT: LBLSTMT OUT LABEL ',' LABEL
%%
#include "Lex.yy.c"


    int yyerror(char *s)
	{
	   
	   printf("%s\n",s); return 0;
	 }

int main()
{
   FILE * fp;
   size_t i = 0;
   size_t uiSize = 0;

   //进行编译器初始化工作
   if (CaslUtil::CASL_UTIL_OP_OK != CaslUtil::CaslCompilerInitialize())
   {
       cerr << "error during the initialization of the Casl compiler!!!" << endl;
       return -1;
   }

   fp = fopen("test.casl", "r");
   if (NULL != fp)
   {
	yyin = fp;     
   }
   else
   {
	yyin = stdin;
   }

   yyparse();


   //--------------输出生成的中间代码表 begins------------------------------------
   cout << "//--------------输出中间代码表-----------------------------" << endl;
   uiSize = g_vecIntermediateCode.size();
   for (i = 0; i < uiSize; i++)
   {
        cout << "指令: " << g_szInstructionName[g_vecIntermediateCode[i].type] << " ";
        //-----------输入操作数1-------------------------------------
        cout << "操作数1: " << g_szOperandTypeName[g_vecIntermediateCode[i].operand1.type] << "--";
        if (REG_OPERAND == g_vecIntermediateCode[i].operand1.type)
        {
            cout << g_vecIntermediateCode[i].operand1.OperandVal.regOperand.regNumber;
        }
        else if (EA_OPERAND == g_vecIntermediateCode[i].operand1.type)
        {
            cout << g_vecIntermediateCode[i].operand1.OperandVal.eaOperand.regNumber << "+" ;
            if (LABEL_EA_ADDRESS == g_vecIntermediateCode[i].operand1.OperandVal.eaOperand.address.type)
            {
                cout << g_vecIntermediateCode[i].operand1.OperandVal.eaOperand.address.addressVal.labelAddress.strLabelName;
            }
            else if (DEC_EA_ADDRESS == g_vecIntermediateCode[i].operand1.OperandVal.eaOperand.address.type)
            {
                cout << g_vecIntermediateCode[i].operand1.OperandVal.eaOperand.address.addressVal.decAddress;
            }
            
        }
        else if (EMPTY_OPERAND == g_vecIntermediateCode[i].operand1.type)
        {
            cout << "empty Operand";
        }
        else
        {
            cout << "unknown operand type" ;
        }
        cout << " ";
        //-----------输入操作数2-------------------------------------
        cout << "操作数2: " << g_szOperandTypeName[g_vecIntermediateCode[i].operand2.type] << " ";
        if (REG_OPERAND == g_vecIntermediateCode[i].operand2.type)
        {
            cout << g_vecIntermediateCode[i].operand2.OperandVal.regOperand.regNumber;
        }
        else if (EA_OPERAND == g_vecIntermediateCode[i].operand2.type)
        {
            cout << g_vecIntermediateCode[i].operand2.OperandVal.eaOperand.regNumber << "+" ;
            if (LABEL_EA_ADDRESS == g_vecIntermediateCode[i].operand2.OperandVal.eaOperand.address.type)
            {
                cout << g_vecIntermediateCode[i].operand2.OperandVal.eaOperand.address.addressVal.labelAddress.strLabelName;
            }
            else if (DEC_EA_ADDRESS == g_vecIntermediateCode[i].operand2.OperandVal.eaOperand.address.type)
            {
                cout << g_vecIntermediateCode[i].operand2.OperandVal.eaOperand.address.addressVal.decAddress;
            }
            
        }
        else if (EMPTY_OPERAND == g_vecIntermediateCode[i].operand2.type)
        {
            cout << "empty Operand";
        }
        else
        {
            cout << "unknown operand type" ;
        }
        cout << endl;
   }
   //--------------输出生成的中间代码表 ends------------------------------------
   
   //--------------输出变量表  begins-------------------------------------------
   cout << "//--------------输出变量表-----------------------------" << endl;
   uiSize = g_vecVariable.size();
   for (i = 0; i < uiSize; i++)
   {
        cout << g_vecVariable[i].strLabelName << " " ;
        cout << g_vecVariable[i].iSpaceCnt;
        cout << endl;
   }
   //--------------输出变量表  ends-------------------------------------------

   //--------------输出标号表  begins----------------------------------------
   cout << "//--------------输出标号表-----------------------------" << endl;
   LabelMap::iterator itMap = g_mapLabel.begin();
   for (; itMap != g_mapLabel.end(); itMap++)
   {
       cout << itMap->second << endl;
   }
   //--------------输出标号表  ends-------------------------------------------
   //输出常量表
   cout << "//--------------输出常量表-----------------------------" << endl;
   uiSize = g_vecConst.size();
   for (i = 0; i < uiSize; i++)
   {
        cout <<  "Const Type---" << g_szConstTypeName[g_vecConst[i].type] << "  ";
        cout <<  " Const Name--" << g_vecConst[i].strLabelName << " ";
        switch(g_vecConst[i].type)
        {
        case DEC_CONST:
            cout << g_vecConst[i].constData.decVal;
            break;
        case HEX_CONST:
            cout << g_vecConst[i].constData.hexVal;
            break;
        case LABEL_CONST:
            cout << g_vecConst[i].constData.labelVal;
            break;
        case STR_CONST:
            cout << g_vecConst[i].constData.strVal;
            break;
        }
        cout << endl;
   }
   //生成变量标号表,常量标号表,指令标号表
   CaslUtil::MakeVariableLabelTable(g_vecVariable, g_vecVariableLabel);
   CaslUtil::MakeConstLabelTable(g_vecConst, g_vecConstLabel);
   CaslUtil::MakeInstructionLabelTable(g_mapLabel, g_vecInstructionLabel);
   
   vector<string> vecTest;
   vecTest.push_back(("1212"));
   vecTest.push_back(("1212232"));
   vecTest.push_back(("343556"));

   //生成目标代码
   string strFile("test.cse");
   if (CASL_UTIL_OP_OK == CaslUtil::MakeObjectCode())
   {
       CaslUtil::WriteExeFile(strFile);
   }
   else
   {
       cout << "Make Object Code Failed!!!" << endl;
   }
   return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -