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

📄 casl.y

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

                            }
;
CONDSTMT: JMPSTMT | 
	  JPZSTMT | 
	  JMISTMT |
	  JNZSTMT |
	  JZESTMT
JMPSTMT: LBLSTMT            {g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            JMP EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_JMP;
                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
JPZSTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            JPZ EA NEW_LINE
 
                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_JPZ;
                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
JMISTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            JMI EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_JMI;
                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
JNZSTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            JNZ EA NEW_LINE

                            {

                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
JZESTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            JZE EA NEW_LINE

                            {
                                                                            
                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
STACKSTMT: PUSHSTMT | POPSTMT

PUSHSTMT: LBLSTMT           { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            PUSH EA NEW_LINE

                            {

                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
POPSTMT: LBLSTMT            { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            POP GR NEW_LINE

                            {

                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
PROCSTMT: CALLSTMT | RETSTMT

CALLSTMT: LBLSTMT           { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            CALL EA NEW_LINE

                            {

                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
RETSTMT: LBLSTMT            {g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                            RET NEW_LINE

                            {

                                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_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;

                            }
;
MACROSTMT: EXITSTMT | INSTMT | OUTSTMT

EXITSTMT: LBLSTMT   { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
               EXIT    NEW_LINE
			  {
                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
                                g_tempCode.type = CASL_EXIT;
                                g_tempCode.operand1.type = EMPTY_OPERAND;
                                g_tempCode.operand2.type = EMPTY_OPERAND;
//                                g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   
                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber++;				
			   }

INSTMT: LBLSTMT { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
                CASL_YACC_IN LABEL ',' LABEL  
                            NEW_LINE
			  {
                if (NULL != $1)
                {
                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                    free((char*)$1);
                }


				g_tempCode.type = CASL_SET_ALABEL;

                                g_tempCode.operand1.type = EA_OPERAND;
				g_tempCode.operand1.OperandVal.eaOperand.regNumber = REG_EMPTY;
				g_tempCode.operand1.OperandVal.eaOperand.address.type = LABEL_EA_ADDRESS;
				strcpy(g_tempCode.operand1.OperandVal.eaOperand.address.addressVal.labelAddress.strLabelName, (char*)$4);
				g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   



				g_tempCode.type = CASL_SET_NLABEL;
                                g_tempCode.operand1.type = EA_OPERAND;
				g_tempCode.operand1.OperandVal.eaOperand.regNumber = REG_EMPTY;
				g_tempCode.operand1.OperandVal.eaOperand.address.type = LABEL_EA_ADDRESS;
				strcpy(g_tempCode.operand1.OperandVal.eaOperand.address.addressVal.labelAddress.strLabelName, (char*)$6);
				g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   

				g_tempCode.type = CASL_FUNC_IN;
				g_tempCode.operand1.type = EMPTY_OPERAND;
				g_tempCode.operand2.type = EMPTY_OPERAND;
                                g_vecIntermediateCode.push_back(g_tempCode);   

                                //将下一个Parse的代码的编号加3
                                g_lCurrentParseCodeNumber += 3;				

			   }

OUTSTMT: LBLSTMT    { g_tempCode.iSrcCodeLineNumber = g_iLineNumber;}
              CASL_YACC_OUT LABEL ',' LABEL NEW_LINE
			  {
                                if (NULL != $1)
                                {
                                    g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
                                    free((char*)$1);
                                }
				g_tempCode.type = CASL_SET_ALABEL;
                                g_tempCode.operand1.type = EA_OPERAND;
				g_tempCode.operand1.OperandVal.eaOperand.regNumber = REG_EMPTY;
				g_tempCode.operand1.OperandVal.eaOperand.address.type = LABEL_EA_ADDRESS;
				strcpy(g_tempCode.operand1.OperandVal.eaOperand.address.addressVal.labelAddress.strLabelName, (char*)$4);
				g_tempCode.operand2.type = EMPTY_OPERAND;
//                g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   

				g_tempCode.type = CASL_SET_NLABEL;
                                g_tempCode.operand1.type = EA_OPERAND;
				g_tempCode.operand1.OperandVal.eaOperand.regNumber = REG_EMPTY;
				g_tempCode.operand1.OperandVal.eaOperand.address.type = LABEL_EA_ADDRESS;
				strcpy(g_tempCode.operand1.OperandVal.eaOperand.address.addressVal.labelAddress.strLabelName, (char*)$6);
				g_tempCode.operand2.type = EMPTY_OPERAND;
//                g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   

				g_tempCode.type = CASL_FUNC_OUT;
				g_tempCode.operand1.type = EMPTY_OPERAND;
				g_tempCode.operand2.type = EMPTY_OPERAND;
//              g_tempCode.iSrcCodeLineNumber = g_iLineNumber - 1;
                                g_vecIntermediateCode.push_back(g_tempCode);   

                                //将下一个Parse的代码的编号加一
                                g_lCurrentParseCodeNumber += 3;				
			   }
%%
#include "Lex.yy.c"


    int yyerror(char *s)
	{
       /* donothing here!just a dummy thing!
         printf("error Occurs in Code Line %d : %s\n", g_lCurrentParseCodeNumber, g_szErrMsg);
       
         printf("%s", s);

       */
       //在此处可以记录下来出错的行号
       //这样对于系统中目前不能定制处理的错误可以有一个跟踪的效果!!!
       //可以使用一个vector来记录出错的行号及错误的性质!
       //要注意向错误表中不要添加重复的错误!!
         //标识编译过程中已经发现错误         
         g_bCompilingErr = true;
         g_verUnknownErrMsg.push_back(CompilingErrMsg(g_iLineNumber, UNKNOWN_COMPILING_ERROR));

⌨️ 快捷键说明

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