?? casl_tab.c
字號:
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 + -