casl.y.bak
来自「这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译」· BAK 代码 · 共 864 行 · 第 1/3 页
BAK
864 行
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
LOGSTMT: ANDSTMT | ORSTMT | EORSTMT;
ANDSTMT: LBLSTMT AND GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
ORSTMT: LBLSTMT OR GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
EORSTMT: LBLSTMT EOR GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
RELSTMT: CPASTMT |
CPLSTMT |
SLASTMT |
SRASTMT |
SLLSTMT |
SRLSTMT
CPASTMT: LBLSTMT CPA GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
CPLSTMT: LBLSTMT CPL GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
SLASTMT: LBLSTMT SLA GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
SRASTMT: LBLSTMT SRA GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
SLLSTMT: LBLSTMT SLL GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
SRLSTMT: LBLSTMT SRL GR ',' EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
CONDSTMT: JMPSTMT |
JPZSTMT |
JMISTMT |
JNZSTMT |
JZESTMT
JMPSTMT: LBLSTMT JMP EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
JPZSTMT: LBLSTMT JPZ EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
JMISTMT: LBLSTMT JMI EA
{
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_vecIntermediateCode.push_back(g_tempCode);
//将下一个Parse的代码的编号加一
g_lCurrentParseCodeNumber++;
}
;
JNZSTMT: LBLSTMT JNZ EA
{
if (NULL != $1)
{
g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
free((char*)$1);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?