?? util.cpp
字號:
?
+
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函數返回程序頭類型語法樹節點指針t */
return t;
}
/********************************************************/
/* 函數名 newDecANode */
/* 功 能 創建聲明語法樹節點函數,沒有指明具體的節點聲明 */
/* 類型,在語法樹的第二層 */
/* 說 明 該函數為語法樹創建一個新的結點 */
/* 并將語法樹節點成員初始化 */
/********************************************************/
TreeNode * newDecANode(NodeKind kind)
{
/* 在內存中動態申請分配單元,返回指向該單元的語法樹結點類型指針t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 語法樹節點指針t為NULL,未能成功分配內存單元 *
* 將出錯信息及行號lineno寫入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 語法樹節點指針t不是NULL,成功分配內存單元 */
else {
/* 初始化新語法樹節點t各子節點child[i]為NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新語法樹節點t兄弟節點sibling為NULL */
t->sibling = NULL;
/* 指定新語法樹節點t成員:結點類型nodekind為參數kind */
t->nodekind = kind;
/* 指定新語法樹節點t成員:源代碼行號lineno為全局變量lineno */
t->lineno = lineno;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函數返回語法樹根節點指針t */
return t;
}
//嘗試
/********************************************************/
/* 函數名 newTypeNode */
/* 功 能 類型標志語法樹節點創建函數 */
/* 說 明 該函數為語法樹創建一個新的類型標志結點, */
/* 表示在它之下的聲明都為類型聲明, */
/* 并將語法樹節點的成員初始化 */
/********************************************************/
TreeNode * newTypeNode()
{
/* 內存中動態申請分配單元,返回指向該單元的語法樹節點類型指針t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 語法樹節點指針t為NULL,未能成功分配內存單元 *
* 將出錯信息及行號lineno寫入列表文件listing */
if (t==NULL)
fprintf(listing,"Out of memory error at line %d\n",lineno);
/* 語法樹節點指針t不是NULL,內存單元已經成功分配 */
else {
/* 初始化新語法樹節點t各子節點child[i]為NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新語法樹節點t兄弟節點sibling為NULL(空) */
t->sibling = NULL;
/* 指定新語法樹節點t成員: 結點類型nodekind為表達式類型ExpK */
t->nodekind = TypeK;
/* 指定新語法樹節點t成員: 源代碼行號lineno為全局變量lineno */
t->lineno = lineno;
t->idnum = 0;
/*初始化符號表地址指針*/
for (int i=0;i<10;i++)
t->table[i] = NULL;
}
/* 函數返回表達式類型語法樹結點指針t */
return t;
}
/********************************************************/
/* 函數名 newVarNode */
/* 功 能 變量聲明標志語法樹節點創建函數 */
/* 說 明 該函數為語法樹創建一個新的變量聲明標志結點,
/* 表示在它之下的聲明都為變量聲明, */
/* 并將語法樹節點的成員初始化 */
/********************************************************/
TreeNode * newVarNode()
{
/* 內存中動態申請分配單元,返回指向該單元的語法樹節點類型指針t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 語法樹節點指針t為NULL,未能成功分配內存單元 *
* 將出錯信息及行號lineno寫入列表文件listing */
if (t==NULL)
fprintf(listing,"Out of memory error at line %d\n",lineno);
/* 語法樹節點指針t不是NULL,內存單元已經成功分配 */
else {
/* 初始化新語法樹節點t各子節點child[i]為NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新語法樹節點t兄弟節點sibling為NULL(空) */
t->sibling = NULL;
/* 指定新語法樹節點t成員: 結點類型nodekind為表達式類型ExpK */
t->nodekind = VarK;
/* 指定新語法樹節點t成員: 源代碼行號lineno為全局變量lineno */
t->lineno = lineno;
t->idnum = 0;
/*初始化符號表地址指針*/
for (int i=0;i<10;i++)
t->table[i] = NULL;
}
/* 函數返回表達式類型語法樹結點指針t */
return t;
}
//試試,如果行的話,就把它們合成一個!!!!
/********************************************************/
/* 函數名 newDecNode */
/* 功 能 創建聲明類型語法樹節點函數 */
/* 說 明 該函數為語法樹創建一個新的聲明類型結點 */
/* 并將語法樹節點成員初始化 */
/********************************************************/
TreeNode * newDecNode(void)
{
/* 在內存中動態申請分配單元,返回指向該單元的語法樹結點類型指針t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 語法樹節點指針t為NULL,未能成功分配內存單元 *
* 將出錯信息及行號lineno寫入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 語法樹節點指針t不是NULL,成功分配內存單元 */
else {
/* 初始化新語法樹節點t各子節點child[i]為NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新語法樹節點t兄弟節點sibling為NULL */
t->sibling = NULL;
/* 指定新語法樹節點t成員:結點類型nodekind為語句類型DecK*/
t->nodekind = DecK;
/* 指定新語法樹節點t成員:源代碼行號lineno為全局變量lineno */
t->lineno = lineno;
t->idnum=0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函數返回聲明類型語法樹節點指針t */
return t;
}
/********************************************************/
/* 函數名 newProcNode */
/* 功 能 創建函數類型語法樹節點函數 */
/* 說 明 該函數為語法樹創建一個新的函數類型結點 */
/* 并將語法樹節點成員初始化 */
/********************************************************/
TreeNode * newProcNode(void)
{
/* 在內存中動態申請分配單元,返回指向該單元的語法樹結點類型指針t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 語法樹節點指針t為NULL,未能成功分配內存單元 *
* 將出錯信息及行號lineno寫入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 語法樹節點指針t不是NULL,成功分配內存單元 */
else {
/* 初始化新語法樹節點t各子節點child[i]為NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新語法樹節點t兄弟節點sibling為NULL */
t->sibling = NULL;
/* 指定新語法樹節點t成員:結點類型nodekind為語句類型ProcDecK */
t->nodekind = ProcDecK;
/* 指定新語法樹節點t成員:源代碼行號lineno為全局變量lineno */
t->lineno = lineno;
t->idnum = 0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函數返回語句類型語法樹節點指針t */
return t;
}
/********************************************************/
/* 函數名 newStmlNode */
/* 功 能 創建語句標志類型語法樹節點函數 */
/* 說 明 該函數為語法樹創建一個新的語句標志類型結點 */
/* 并將語法樹節點成員初始化 */
/********************************************************/
TreeNode * newStmlNode(void)
{
/* 在內存中動態申請分配單元,返回指向該單元的語法樹結點類型指針t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 語法樹節點指針t為NULL,未能成功分配內存單元 *
* 將出錯信息及行號lineno寫入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 語法樹節點指針t不是NULL,成功分配內存單元 */
else {
/* 初始化新語法樹節點t各子節點child[i]為NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新語法樹節點t兄弟節點sibling為NULL */
t->sibling = NULL;
/* 指定新語法樹節點t成員:結點類型nodekind為語句類型StmLK */
t->nodekind = StmLK;
/* 指定新語法樹節點t成員:源代碼行號lineno為全局變量lineno */
t->lineno = lineno;
t->idnum = 0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/*函數返回語句類型語法樹節點指針t*/
return t;
}
/********************************************************/
/* 函數名 newStmtNode */
/* 功 能 創建語句類型語法樹節點函數 */
/* 說 明 該函數為語法樹創建一個新的語句類型結點 */
/* 并將語法樹節點成員初始化 */
/********************************************************/
TreeNode * newStmtNode(StmtKind kind)
{
/* 在內存中動態申請分配單元,返回指向該單元的語法樹結點類型指針t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 語法樹節點指針t為NULL,未能成功分配內存單元 *
* 將出錯信息及行號lineno寫入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 語法樹節點指針t不是NULL,成功分配內存單元 */
else {
/* 初始化新語法樹節點t各子節點child[i]為NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新語法樹節點t兄弟節點sibling為NULL */
t->sibling = NULL;
/* 指定新語法樹節點t成員:結點類型nodekind為語句類型StmtK */
t->nodekind = StmtK;
/* 指定新語法樹節點t成員:語句類型kind.stmt為函數給定參數kind */
t->kind.stmt = kind;
/* 指定新語法樹節點t成員:源代碼行號lineno為全局變量lineno */
t->lineno = lineno;
t->idnum = 0;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函數返回語句類型語法樹節點指針t */
return t;
}
/********************************************************/
/* 函數名 newExpNode */
/* 功 能 表達式類型語法樹節點創建函數 */
/* 說 明 該函數為語法樹創建一個新的表達式類型結點 */
/* 并將語法樹節點的成員初始化 */
/********************************************************/
TreeNode * newExpNode(ExpKind kind)
{
/* 內存中動態申請分配單元,返回指向該單元的語法樹節點類型指針t */
TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));
int i;
/* 語法樹節點指針t為NULL,未能成功分配內存單元 *
* 將出錯信息及行號lineno寫入列表文件listing */
if (t==NULL)
{
fprintf(listing,"Out of memory error at line %d\n",lineno);
Error = TRUE;
}
/* 語法樹節點指針t不是NULL,內存單元已經成功分配 */
else {
/* 初始化新語法樹節點t各子節點child[i]為NULL */
for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;
/* 初始化新語法樹節點t兄弟節點sibling為NULL(空) */
t->sibling = NULL;
/* 指定新語法樹節點t成員: 結點類型nodekind為表達式類型ExpK */
t->nodekind = ExpK;
/* 指定新語法樹節點t成員: 表達式類型kind.exp為函數給定參數kind */
t->kind.exp = kind;
/* 指定新語法樹節點t成員: 源代碼行號lineno為全局變量lineno */
t->lineno = lineno;
/* 指定新語法樹節點t成員: 表達式為變量類型時的變量類型varkind *
/* 為IdV.*/
t->attr.ExpAttr.varkind = IdV;
/* 指定新語法樹節點t成員: 類型檢查類型type為Void */
t->attr.ExpAttr.type = Void;
for(i=0;i<10;i++)
{
strcpy(t->name[i],"\0");
t->table[i] = NULL;
}
}
/* 函數返回表達式類型語法樹結點指針t */
return t;
}
/* 靜態變量indentno在函數printTree中 *
* 用于存儲當前子樹縮進格數,初始為0 */
static indentno = 0;
/** 增量/減量縮進宏定義 **/
#define INDENT indentno+=4
#define UNINDENT indentno-=4
/********************************************************/
/* 函數名 printSpaces */
/* 功 能 空格打印函數 */
/* 說 明 該函數打印指定數量空格,用于表示子樹縮進 */
/********************************************************/
static void printSpaces(void)
{ int i;
/* 按給定縮進量indentno打印空格進行縮進 *
* 其中縮進量indentno總能保持非負 */
for (i=0;i<indentno;i++)
fprintf(listing," ");
}
/******************************************************/
/* 函數名 printTree */
/* 功 能 把語法樹輸出,顯示在listing文件中 */
/* 說 明 該函數運用了宏來定義增量減量的縮進 */
/******************************************************/
void printTree(TreeNode *tree)
{ int i;
/* 增量縮進宏,每次進入語法樹節點都進行增量縮進 */
INDENT;
/* 函數參數給定語法樹節點指針tree非NULL(空) */
while (tree != NULL)
{
/*打印行號*/
if(tree->lineno==0)
printTab(9);
else
switch((int)(tree->lineno / 10))
{
case 0:
fprintf(listing,"line:%d",tree->lineno);
printTab(3);
break;
case 1:
case 2:
case 3:
case 4:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -