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