?? casl.y.bak
字號:
%{
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
#include <algorithm>
#include "../../Compiler/GlobalVariableDef.h"
int yyerror(char *s);
int yylex(void);
%}
%token DECIMAL
%token HEX
%token ID
%token STR
%token LABEL
%token DS
%token DC
%token GR0
%token GR1
%token GR2
%token GR3
%token GR4
%token LD
%token ST
%token LEA
%token ADD
%token SUB
%token AND
%token OR
%token EOR
%token CPA
%token CPL
%token SLA
%token SRA
%token SLL
%token SRL
%token JMP
%token JPZ
%token JMI
%token JNZ
%token JZE
%token PUSH
%token POP
%token CALL
%token RET
%token START
%token END
%token IN
%token OUT
%token EXIT
%%
PROGRAM: START BODY END {printf("Input Ok!\n");};
BODY: DEFPART EXECPART;
DEFPART: DEFPART DEFDETAIL | ;
DEFDETAIL: DSDEF | DCDEF;
DSDEF: LBLSTMT DS DECIMAL
{
g_vecVariable.push_back(CaslVariable((char*)$1, $3));
free((char*)$1);
}
;
DCDEF: LBLSTMT DC CONST
{
strcpy(g_currentConst.strLabelName, (char*)$1);
g_vecConst.push_back(g_currentConst);
free((char*)$1);
}
;
CONST: HEX
{
g_currentConst.type = HEX_CONST;
g_currentConst.constData.hexVal = $1;
}
| DECIMAL
{
g_currentConst.type = DEC_CONST;
g_currentConst.constData.decVal = $1;
}
| LABEL
{
g_currentConst.type = LABEL_CONST;
strcpy(g_currentConst.constData.labelVal, (char*)$1);
free((char*)$1);
}
| STR
{
g_currentConst.type = STR_CONST;
strcpy(g_currentConst.constData.strVal, g_strCurrentStrConst.c_str());
}
;
EXECPART: EXECSTMT EXECPART{cout << " parse:" << g_lCurrentParseCodeNumber << endl;} | EXECSTMT;
EXECSTMT: MEMSTMT |
MATHSTMT |
LOGSTMT |
RELSTMT |
CONDSTMT |
STACKSTMT|
PROCSTMT |
MACROSTMT
MEMSTMT: LDSTMT | LEASTMT | STSTMT
LDSTMT: LBLSTMT LD GR','EA
{
//如果標號不為空
if (NULL != $1)
{
g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
free((char*)$1);
}
//對于每條指令前的標號應當怎樣處理呢?
//應當定義一張標號表,然后將遇到的所有的標號都
//存放到標號表中,但是怎樣將標號與實際的指令對應起來呢?
//考慮在程序中定義一個當前編譯PC指針用來標識當前指令的
//位置,這樣就可以在最后依據(jù)這個位置編號來確定標號所對應的指令的偏移
//而對于常量定義,變量定義就不參與PC指針的記數(shù),
//而是在生成中間代碼以后,依據(jù),常量表,變量表,為所有的變量,常量
//分配空間,然后將程序中引用到變量,常量的地方改為變量,常量的地址值
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地址操作數(shù)的處理比較麻煩!!!!!!
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++;
}
;
LBLSTMT: LABEL {$$ = $1;}
| {$$ = NULL;};
GR: GR0
{
g_iCurrentRegNumber = 0;
}
| GR1
{
g_iCurrentRegNumber = 1;
}
| GR2
{
g_iCurrentRegNumber = 2;
}
| GR3
{
g_iCurrentRegNumber = 3;
}
| GR4
{
g_iCurrentRegNumber = 4;
}
;
EA: ADDR XRADDR
{
}
;
ADDR: DECIMAL
{
g_currentEAAddress.type = DEC_EA_ADDRESS;
g_currentEAAddress.addressVal.decAddress = $1;
}
| LABEL
{
//對于標號地址,應當先到標號表中查詢看有無對應項,如果有的話,就應當
//將查詢到的地址放入g_eaAddressVal中
//如果沒有的話,就應當在標號表的指定標號中
//加入一個回填項以便于在parse過程中如果遇到了指定的標號
//進行標號數(shù)據(jù)的回填
g_currentEAAddress.type = LABEL_EA_ADDRESS;
strcpy(g_currentEAAddress.addressVal.labelAddress.strLabelName, (char*)$1);
free((char*)$1);
}
;
XRADDR: ','XR
{
//g_iCurrentEARegNumber = g_iCurrentRegNumber;
}
|
{
g_iCurrentEARegNumber = REG_NONE;
}
;
XR: GR0
{
g_iCurrentEARegNumber = 0;
}
| GR1
{
g_iCurrentEARegNumber = 1;
}
| GR2
{
g_iCurrentEARegNumber = 2;
}
| GR3
{
g_iCurrentEARegNumber = 3;
}
| GR4
{
g_iCurrentEARegNumber = 4;
}
;
STSTMT: LBLSTMT ST GR','EA
{
if (NULL != $1)
{
g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
free((char*)$1);
}
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地址操作數(shù)的處理比較麻煩!!!!!!
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++;
}
;
LEASTMT: LBLSTMT LEA GR','EA
{
if (NULL != $1)
{
g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
free((char*)$1);
}
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_vecIntermediateCode.push_back(g_tempCode);
//將下一個Parse的代碼的編號加一
g_lCurrentParseCodeNumber++;
}
;
MATHSTMT: ADDSTMT | SUBSTMT;
ADDSTMT: LBLSTMT ADD GR','EA
{
if (NULL != $1)
{
g_mapLabel.insert(LabelMap::value_type(g_lCurrentParseCodeNumber, (char*)$1));
free((char*)$1);
}
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_vecIntermediateCode.push_back(g_tempCode);
//將下一個Parse的代碼的編號加一
g_lCurrentParseCodeNumber++;
}
;
SUBSTMT: LBLSTMT SUB GR ',' EA
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -