?? globals.h
字號:
/************************************************************/
/* 文件 globals.h */
/* 說明 類PASCAL語言編譯器的全局類型和變量,應在其他包含文件之前 */
/* 主題 編譯器結構:原理和實例 */
/************************************************************/
/* 如已經聯入頭文件globals.h則不再聯入 */
#ifndef _GLOBALS_H_
#define _GLOBALS_H_
/****** globals.h所包含頭文件 ******/
#include "stdio.h"
#include "stdlib.h"
/* 定義常量FALSE為0 */
#ifndef FALSE
#define FALSE 0
#endif
/* 定義常量TRUE為1 */
#ifndef TRUE
#define TRUE 1
#endif
/* 定義保留字數量常量MAXRESERVED為21 */
#define MAXRESERVED 21
/* MAXTOKENLEN為單詞最大長度定義為40 */
#define MAXTOKENLEN 40
/*初始化符號表中變量的偏移*/
#define INITOFF 7
/* SCOPESIZE為符號表scope棧的大小*/
#define SCOPESIZE 1000
/*定義token的長度*/
#define TOKENLEN sizeof (TokenType)
/*定義鏈表節點的長度*/
#define CHAINNODELEN sizeof (ChainNodeType)
/********************** 單詞的詞法類型 ********************/
typedef enum
{
/* 簿記單詞符號 */
ENDFILE, ERROR,
/* 保留字 */
PROGRAM, PROCEDURE, TYPE, VAR, IF,
THEN, ELSE, FI, WHILE, DO,
ENDWH, BEGIN, END, READ, WRITE,
ARRAY, OF, RECORD, RETURN,
INTEGER, CHAR,
/* 多字符單詞符號 */
ID, INTC, CHARC,
/*特殊符號 */
ASSIGN, EQ, LT, PLUS, MINUS,
TIMES, OVER, LPAREN, RPAREN, DOT,
COLON, SEMI, COMMA, LMIDPAREN, RMIDPAREN,
UNDERANGE
} LexType;
/*********** 單詞的類型,包括詞法信息和語義信息 ************/
typedef struct tokenType
{ int lineshow;
LexType Lex;
char Sem[MAXTOKENLEN+1];
} TokenType;
/***********鏈表的結點類型,包括Token部分和指針部分**********/
typedef struct node
{ TokenType Token; //單詞
struct node *nextToken; //指向下一個單詞的指針
} ChainNodeType;
/******************************************************
****************** 語法分析樹 ********************
******************************************************/
/*語法樹根節點ProK,程序頭結點PheadK,聲明類型節點DecK,
標志子結點都是類型聲明的結點TypeK,標志子結點都是變量聲明的結點VarK,
函數聲明結點FuncDecK,語句序列節點StmLK,語句聲明結點StmtK,
表達式結點ExpK*/
typedef enum {ProK,PheadK,DecK,TypeK,VarK,ProcDecK,StmLK,StmtK,ExpK}
NodeKind;
/*聲明類型Deckind 類型的枚舉定義:
數組類型ArrayK,字符類型CharK,
整數類型IntegerK,記錄類型RecordK,
以類型標識符作為類型的IdK*/
typedef enum {ArrayK,CharK,IntegerK,RecordK,IdK} DecKind;
/* 語句類型StmtKind類型的枚舉定義: *
* 判斷類型IfK,循環類型WhileK *
* 賦值類型AssignK,讀類型ReadK *
* 寫類型WriteK,函數調用類型CallK */
typedef enum {IfK,WhileK,AssignK,ReadK,WriteK,CallK,ReturnK} StmtKind;
/* 表達式類型ExpKind類型的枚舉定義: *
* 操作類型OpK,常數類型ConstK,變量類型VarK */
typedef enum {OpK,ConstK,VariK} ExpKind;
/* 變量類型VarKind類型的枚舉定義: *
* 標識符IdV,數組成員ArrayMembV,域成員FieldMembV*/
typedef enum {IdV,ArrayMembV,FieldMembV} VarKind;
/* 類型檢查ExpType類型的枚舉定義: *
* 空Void,整數類型Integer,字符類型Char */
typedef enum {Void,Integer,Boolean} ExpType;
/* 參數類型ParamType類型的枚舉定義: *
* 值參valparamType,變參varparamType */
typedef enum {valparamType,varparamType} ParamType;
/* 定義語法樹節點的最大子節點數MAXCHILDRREN為3 */
/* 過程聲明部分的子節點child[0]指向參數部分,
子節點child[1]指向聲明體部分,子節點child[2]
指向函數的語句部分;*/
#define MAXCHILDREN 3
/*提前聲明符號表結構*/
struct symbtable;
/********** 語法樹節點treeNode類型 *********/
typedef struct treeNode
{
struct treeNode * child[MAXCHILDREN]; /* 子節點指針 */
struct treeNode * sibling; /* 兄弟節點指針 */
int lineno; /* 源代碼行號 */
NodeKind nodekind; /* 節點類型 */
union
{
DecKind dec;
StmtKind stmt;
ExpKind exp;
} kind; /* 具體類型 */
int idnum; /* 相同類型的變量個數 */
char name[10][10]; /* 標識符的名稱 */
struct symbtable * table[10]; /* 與標志符對應的符號表地址,在語義分析階段填入*/
struct
{
struct
{
int low; /* 數組下界 */
int up; /* 數組上界 */
DecKind childtype; /* 數組的子類型 */
}ArrayAttr; /* 數組屬性 */
struct
{
ParamType paramt; /* 過程的參數類型*/
}ProcAttr; /* 過程屬性 */
struct
{
LexType op; /* 表達式的操作符*/
int val; /* 表達式的值 */
VarKind varkind; /* 變量的類別 */
ExpType type; /* 用于類型檢查 */
}ExpAttr; /* 表達式屬性 */
char type_name[10]; /* 類型名是標識符 */
} attr; /* 屬性 */
}TreeNode;
/*非終極符的總數*/
#define NTMLNUM 68
/*終極符的總數*/
#define TMLNUM 42
/******************類型和變量聲明*********************/
/******************************************************
**********語義分析需要用到的類型及變量定義************
******************************************************/
/*標識符的類型*/
typedef enum {typeKind,varKind,procKind}IdKind;
/*變量的類別。dir表直接變量(值參),indir表示間接變量(變參)*/
typedef enum {dir,indir}AccessKind;
/*形參表的結構定義*/
typedef struct paramTable
{
struct symbtable * entry;/*指向該形參所在符號表中的地址入口*/
struct paramTable * next;
}ParamTable;
struct typeIR;
/*標識符的屬性結構定義*/
typedef struct
{
struct typeIR * idtype; /*指向標識符的類型內部表示*/
IdKind kind; /*標識符的類型*/
union
{
struct
{
AccessKind access; /*判斷是變參還是值參*/
int level;
int off;
bool isParam; /*判斷是參數還是普通變量*/
}VarAttr;/*變量標識符的屬性*/
struct
{
int level; /*該過程的層數*/
ParamTable * param; /*參數表*/
int mOff; /*過程活動記錄的大小*/
int nOff; /*sp到display表的偏移量*/
int procEntry; /*過程的入口地址*/
int codeEntry ;/*過程入口標號,用于中間代碼生成*/
}ProcAttr;/*過程名標識符的屬性*/
}More;/*標識符的不同類型有不同的屬性*/
}AttributeIR;
/*符號表的結構定義*/
typedef struct symbtable
{
char idName[10];
AttributeIR attrIR;
struct symbtable * next;
}SymbTable;
/*使用scope棧的局部符號表方法中所用到的scope棧*/
extern SymbTable * scope[1000];
/*scope棧的層數*/
extern int Level;
/*在同層的變量偏移*/
extern int Off;
/*記錄主程序的displayOff*/
extern int mainOff;
/*記錄當前層的displayOff*/
extern int savedOff;
/******************************************************
***************** 類型內部表示 ******************
******************************************************/
/*類型的枚舉定義*/
typedef enum {intTy,charTy,arrayTy,recordTy,boolTy}TypeKind;
struct typeIR;
/*域類型單元結構定義*/
typedef struct fieldchain
{
char id[10]; /*變量名*/
int off; /*所在記錄中的偏移*/
struct typeIR * UnitType; /*域中成員的類型*/
struct fieldchain * Next;
}fieldChain;
/*類型的內部結構定義*/
typedef struct typeIR
{
int size; /*類型所占空間大小*/
TypeKind kind;
union
{ struct
{ struct typeIR * indexTy;
struct typeIR * elemTy;
int low; /*記錄數組類型的下界*/
int up; /*記錄數組類型的上界*/
}ArrayAttr;
fieldChain * body; /*記錄類型中的域鏈*/
} More;
}TypeIR;
/********************************************************************/
/* 源代碼文本文件指針source */
extern FILE *source;
/* 列表輸出文件指針listing */
extern FILE* listing;
/*詞法分析結果Token序列的存儲文件指針fp*/
extern FILE* fp;
/*Token序列中的token數目*/
extern int Tokennum;
/*清單的行號*/
extern int lineno;
/*scope棧的層數*/
extern int Level;
/*在同層的變量偏移*/
extern int Off;
/*記錄主程序的displayOff*/
extern int mainOff;
/*記錄當前層的displayOff*/
extern int savedOff;
/*************************************
*********** 追蹤標志 ************
*************************************/
/* 源程序追蹤標志,如果該標志為TRUE *
* 語法分析時將源程序行號寫入列表文件listing */
extern int EchoSource;
/* 詞法掃描追蹤標志,如果該標志為TRUE *
* 將每個被詞法掃描器識別的單詞信息寫入列表文件listing */
extern int TraceScan;
/* 語法分析追蹤標志,如果該標志為TRUE *
* 將語法樹以線性形式(使用子節點縮進)寫入列表文件listing */
extern int TraceParse;
/* 語義分析追蹤標志,如果該標志為TRUE *
* 將符號表插入和查找寫入列表文件listing */
extern int TraceTable;
extern int TraceCode;
/* 錯誤追蹤標志,如果該標志為TRUE *
* 防止錯誤產生時進一步傳遞錯誤 */
extern int Error;
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -