📄 casl.y.bak
字号:
}
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 + -