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

📄 casl.y

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 Y
📖 第 1 页 / 共 4 页
字号:
            g_iCurrentEARegNumber = 1;
        }
    | GR2
        {
            g_iCurrentEARegNumber = 2;
        }
    | GR3
        {
            g_iCurrentEARegNumber = 3;
        }
    | GR4 
        {
            g_iCurrentEARegNumber = 4;
        }
    ;

STSTMT: LBLSTMT     { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                    ST GR','EA  NEW_LINE
                            {
                                            
                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                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++;

                            }

        ;
LEASTMT: LBLSTMT    { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                        LEA GR','EA   NEW_LINE
                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                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++;

                            }

                            ;
MATHSTMT: ADDSTMT | SUBSTMT; 


ADDSTMT: LBLSTMT     { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                    ADD GR','EA NEW_LINE
                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                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++;

                            }
                            ;
SUBSTMT: LBLSTMT         { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                        SUB GR ',' EA NEW_LINE
                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                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++;

                            }
;
LOGSTMT: ANDSTMT | ORSTMT | EORSTMT;

ANDSTMT: LBLSTMT         { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                         AND GR ',' EA NEW_LINE
                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                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的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
ORSTMT: LBLSTMT             { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            OR GR ','  EA NEW_LINE
                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_OR;
                                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++;

                            }
;
EORSTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            EOR GR ',' EA NEW_LINE
                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_EOR;
                                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++;

                            }
;
RELSTMT: CPASTMT | 
	 CPLSTMT |
	 SLASTMT |
	 SRASTMT |
	 SLLSTMT |
	 SRLSTMT 

CPASTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            CPA GR ',' EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_CPA;
                                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++;

                            }
;
CPLSTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            CPL GR ',' EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_CPL;
                                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++;

                            }

;
SLASTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            SLA GR ',' EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_SLA;
                                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++;

                            }
;
SRASTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            SRA GR ',' EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_SRA;
                                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++;

                            }
;
SLLSTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            SLL GR ',' EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_SLL;
                                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++;

                            }
;
SRLSTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            SRL GR ',' EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_SRL;
                                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++;

⌨️ 快捷键说明

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