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

📄 casl_tab.c

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 C
📖 第 1 页 / 共 5 页
字号:
                            else
                            {
                                strcpy(g_currentConst.strLabelName, "\0");
                            }
            			    g_vecConst.push_back(g_currentConst);
                            if (NULL != yyvsp[-3])
                            {
                                free((char*)yyvsp[-3]);
                            }
			             ;
    break;}
case 24:
#line 177 "casl.y"
{
        			g_currentConst.type = HEX_CONST;
	    	        g_currentConst.constData.hexVal = yyvsp[0];
    	        ;
    break;}
case 25:
#line 182 "casl.y"
{
        			g_currentConst.type = DEC_CONST;
		        	g_currentConst.constData.decVal = yyvsp[0];
    		    ;
    break;}
case 26:
#line 187 "casl.y"
{
        		    g_currentConst.type = LABEL_CONST;
                    strcpy(g_currentConst.constData.labelVal, (char*)yyvsp[0]);
                    //free((char*)$1);
		        ;
    break;}
case 27:
#line 193 "casl.y"
{
                    g_currentConst.type = STR_CONST;
                    strcpy(g_currentConst.constData.strVal, g_strCurrentStrConst.c_str());
                ;
    break;}
case 32:
#line 205 "casl.y"
{
                        //如果标号不为空
                        if (NULL != yyvsp[-5])
                        {
                            g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)yyvsp[-5]));
                            free((char*)yyvsp[-5]);
                        }
                        
                        //对于每条指令前的标号应当怎样处理呢?
                        //应当定义一张标号表,然后将遇到的所有的标号都
                        //存放到标号表中,但是怎样将标号与实际的指令对应起来呢?
                        //考虑在程序中定义一个当前编译PC指针用来标识当前指令的
                        //位置,这样就可以在最后依据这个位置编号来确定标号所对应的指令的偏移
                        //而对于常量定义,变量定义就不参与PC指针的记数,
                        //而是在生成中间代码以后,依据,常量表,变量表,为所有的变量,常量
                        //分配空间,然后将程序中引用到变量,常量的地方改为变量,常量的地址值
                        g_tempCode.type = CASL_LD;
                        g_tempCode.operand1.type = REG_OPERAND;
                        g_tempCode.operand1.OperandVal.regOperand.regNumber = g_iCurrentRegNumber;
                        g_tempCode.operand2.type = EA_OPERAND;
                        //对于EA地址操作数的处理比较麻烦!!!!!!
                        g_tempCode.operand2.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                        g_tempCode.operand2.OperandVal.eaOperand.address = g_currentEAAddress;
                        g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                        g_vecIntermediateCode.push_back(g_tempCode);   
                        //将下一个Parse的代码的编号加一
                        g_lCurrentParseCodeNumber++;
                    ;
    break;}
case 33:
#line 237 "casl.y"
{
                            yyval = yyvsp[-1];
                        ;
    break;}
case 34:
#line 241 "casl.y"
{ 
                             yyval = yyvsp[0];
                        ;
    break;}
case 35:
#line 245 "casl.y"
{
                            yyval = NULL;
                        ;
    break;}
case 36:
#line 251 "casl.y"
{
            g_iCurrentRegNumber = 0;
        ;
    break;}
case 37:
#line 255 "casl.y"
{
            g_iCurrentRegNumber = 1;
        ;
    break;}
case 38:
#line 259 "casl.y"
{
            g_iCurrentRegNumber = 2;
        ;
    break;}
case 39:
#line 263 "casl.y"
{
            g_iCurrentRegNumber = 3;
        ;
    break;}
case 40:
#line 267 "casl.y"
{
            g_iCurrentRegNumber = 4;
        ;
    break;}
case 41:
#line 273 "casl.y"
{

                ;
    break;}
case 42:
#line 279 "casl.y"
{
                    g_currentEAAddress.type = DEC_EA_ADDRESS;
                    g_currentEAAddress.addressVal.decAddress = yyvsp[0];
                ;
    break;}
case 43:
#line 284 "casl.y"
{
                    //对于标号地址,应当先到标号表中查询看有无对应项,如果有的话,就应当
                    //将查询到的地址放入g_eaAddressVal中
                    //如果没有的话,就应当在标号表的指定标号中
                    //加入一个回填项以便于在parse过程中如果遇到了指定的标号
                    //进行标号数据的回填
                    g_currentEAAddress.type = LABEL_EA_ADDRESS;
                    strcpy(g_currentEAAddress.addressVal.labelAddress.strLabelName, (char*)yyvsp[0]);
                    free((char*)yyvsp[0]);
                ;
    break;}
case 44:
#line 295 "casl.y"
{
                    //-----------------有效地址也可以有十六进制数!!!!!----------------------
                    //unfinished now!!
                    //因为在使用的时候,我们不需要去理会十六进制与十进制的区别,因为词法分析模块已经替我们
                    //将十六进制的输入换为十进制的数据了!!!!所以我们直接将HEX的地址量当DEC来用即可!!!
                    //-----------------------------------------------------------------
                    g_currentEAAddress.type = DEC_EA_ADDRESS;
                    g_currentEAAddress.addressVal.decAddress = yyvsp[0];
                ;
    break;}
case 45:
#line 307 "casl.y"
{
                    //g_iCurrentEARegNumber = g_iCurrentRegNumber;
                ;
    break;}
case 46:
#line 311 "casl.y"
{
                    g_iCurrentEARegNumber = REG_EMPTY;
                ;
    break;}
case 47:
#line 317 "casl.y"
{
            g_iCurrentEARegNumber = 0;
        ;
    break;}
case 48:
#line 321 "casl.y"
{
            g_iCurrentEARegNumber = 1;
        ;
    break;}
case 49:
#line 325 "casl.y"
{
            g_iCurrentEARegNumber = 2;
        ;
    break;}
case 50:
#line 329 "casl.y"
{
            g_iCurrentEARegNumber = 3;
        ;
    break;}
case 51:
#line 333 "casl.y"
{
            g_iCurrentEARegNumber = 4;
        ;
    break;}
case 52:
#line 338 "casl.y"
{ g_tempCode.iSrcCodeLineNumber = g_iLineNumber;;
    break;}
case 53:
#line 340 "casl.y"
{
                                            
                                if (NULL != yyvsp[-6])
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)yyvsp[-6]));
                                    free((char*)yyvsp[-6]);
                                }
                                g_tempCode.type = CASL_ST;
                                g_tempCode.operand1.type = REG_OPERAND;
                                g_tempCode.operand1.OperandVal.regOperand.regNumber = g_iCurrentRegNumber;
                                g_tempCode.operand2.type = EA_OPERAND;
                                //对于EA地址操作数的处理比较麻烦!!!!!!
                                g_tempCode.operand2.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand2.OperandVal.eaOperand.address = g_currentEAAddress;
//                                g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            ;
    break;}
case 54:
#line 362 "casl.y"
{ g_tempCode.iSrcCodeLineNumber = g_iLineNumber;;
    break;}
case 55:
#line 364 "casl.y"
{

                                if (NULL != yyvsp[-6])
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)yyvsp[-6]));
                                    free((char*)yyvsp[-6]);
                                }
                                g_tempCode.type = CASL_LEA;
                                g_tempCode.operand1.type = REG_OPERAND;
                                g_tempCode.operand1.OperandVal.regOperand.regNumber = g_iCurrentRegNumber;
                                g_tempCode.operand2.type = EA_OPERAND;
                                g_tempCode.operand2.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand2.OperandVal.eaOperand.address = g_currentEAAddress;
//                                g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            ;
    break;}
case 58:
#line 388 "casl.y"
{ g_tempCode.iSrcCodeLineNumber = g_iLineNumber;;
    break;}
case 59:
#line 390 "casl.y"
{

                                if (NULL != yyvsp[-6])
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)yyvsp[-6]));
                                    free((char*)yyvsp[-6]);
                                }
                                g_tempCode.type = CASL_ADD;
                                g_tempCode.operand1.type = REG_OPERAND;
                                g_tempCode.operand1.OperandVal.regOperand.regNumber = g_iCurrentRegNumber;
                                g_tempCode.operand2.type = EA_OPERAND;
                                g_tempCode.operand2.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand2.OperandVal.eaOperand.address = g_currentEAAddress;
//                                g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            ;
    break;}
case 60:
#line 410 "casl.y"
{ g_tempCode.iSrcCodeLineNumber = g_iLineNumber;;
    break;}
case 61:
#line 412 "casl.y"
{

                                if (NULL != yyvsp[-6])
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)yyvsp[-6]));
                                    free((char*)yyvsp[-6]);
                                }
                                g_tempCode.type = CASL_SUB;
                                g_tempCode.operand1.type = REG_OPERAND;
                                g_tempCode.operand1.OperandVal.regOperand.regNumber = g_iCurrentRegNumber;
                                g_tempCode.operand2.type = EA_OPERAND;
                                g_tempCode.operand2.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand2.OperandVal.eaOperand.address = g_currentEAAddress;
//                                g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            ;
    break;}
case 65:
#line 434 "casl.y"
{ g_tempCode.iSrcCodeLineNumber = g_iLineNumber;;
    break;}
case 66:
#line 436 "casl.y"
{

                                if (NULL != yyvsp[-6])
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)yyvsp[-6]));
                                    free((char*)yyvsp[-6]);
                                }
                                g_tempCode.type = CASL_AND;
                                g_tempCode.operand1.type = REG_OPERAND;
                                g_tempCode.operand1.OperandVal.regOperand.regNumber = g_iCurrentRegNumber;
                                g_tempCode.operand2.type = EA_OPERAND;
                                g_tempCode.operand2.OperandVal.eaOperand.regNumber = g_iCurrentEARegNumber;
                                g_tempCode.operand2.OperandVal.eaOperand.address = g_currentEAAddress;
//                                g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一

⌨️ 快捷键说明

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