?? globals.h
字號(hào):
/*******************************************************************/
/* 文件 globals.h */
/* 說(shuō)明 類PASCAL語(yǔ)言編譯器的全局類型和變量,應(yīng)在其他包含文件之前 */
/* 主題 編譯器結(jié)構(gòu):原理和實(shí)例 */
/*******************************************************************/
/* 如已經(jīng)聯(lián)入頭文件globals.h則不再聯(lián)入 */
#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
/* 定義保留字?jǐn)?shù)量常量MAXRESERVED為21 */
#define MAXRESERVED 21
/* MAXTOKENLEN為單詞最大長(zhǎng)度定義為40 */
#define MAXTOKENLEN 40
/*初始化符號(hào)表中變量的偏移*/
#define INITOFF 7
/* SCOPESIZE為符號(hào)表scope棧的大小*/
#define SCOPESIZE 1000
/*定義token的長(zhǎng)度*/
#define TOKENLEN sizeof (TokenType)
/*定義鏈表節(jié)點(diǎn)的長(zhǎng)度*/
#define CHAINNODELEN sizeof (ChainNodeType)
/********************** 單詞的詞法類型 ********************/
typedef enum
{
/* 簿記單詞符號(hào) */
ENDFILE, ERROR,
/* 保留字 */
PROGRAM, PROCEDURE, TYPE, VAR, IF,
THEN, ELSE, FI, WHILE, DO,
ENDWH, BEGIN, END, READ, WRITE,
ARRAY, OF, RECORD, RETURN,
INTEGER, CHAR,
/* 多字符單詞符號(hào) */
ID, INTC, CHARC,
/*特殊符號(hào) */
ASSIGN, EQ, LT, PLUS, MINUS,/****begin 和 end算不算呢?*****/
TIMES, OVER, LPAREN, RPAREN, DOT,
COLON, SEMI, COMMA, LMIDPAREN, RMIDPAREN,
UNDERANGE
} LexType;
/*********** 單詞的類型,包括詞法信息和語(yǔ)義信息 ************/
typedef struct tokenType
{ int lineshow;
LexType Lex;
char Sem[MAXTOKENLEN+1];
} TokenType;
/***********鏈表的結(jié)點(diǎn)類型,包括Token部分和指針部分**********/
typedef struct node
{ TokenType Token; //單詞
struct node *nextToken; //指向下一個(gè)單詞的指針
} ChainNodeType;
/******************************************************
****************** 語(yǔ)法分析樹 ********************
******************************************************/
/*語(yǔ)法樹根節(jié)點(diǎn)ProK,程序頭結(jié)點(diǎn)PheadK,聲明類型節(jié)點(diǎn)DecK,
標(biāo)志子結(jié)點(diǎn)都是類型聲明的結(jié)點(diǎn)TypeK,標(biāo)志子結(jié)點(diǎn)都是變量聲明的結(jié)點(diǎn)VarK,
函數(shù)聲明結(jié)點(diǎn)FuncDecK,語(yǔ)句序列節(jié)點(diǎn)StmLK,語(yǔ)句聲明結(jié)點(diǎn)StmtK,
表達(dá)式結(jié)點(diǎn)ExpK*/
typedef enum {ProK,PheadK,DecK,TypeK,VarK,ProcDecK,StmLK,StmtK,ExpK}
NodeKind;
/*聲明類型Deckind 類型的枚舉定義:
數(shù)組類型ArrayK,字符類型CharK,
整數(shù)類型IntegerK,記錄類型RecordK,
以類型標(biāo)識(shí)符作為類型的IdK*/
typedef enum {ArrayK,CharK,IntegerK,RecordK,IdK} DecKind;
/* 語(yǔ)句類型StmtKind類型的枚舉定義: *
* 判斷類型IfK,循環(huán)類型WhileK *
* 賦值類型AssignK,讀類型ReadK *
* 寫類型WriteK,函數(shù)調(diào)用類型CallK */
typedef enum {IfK,WhileK,AssignK,ReadK,WriteK,CallK,ReturnK} StmtKind;
/* 表達(dá)式類型ExpKind類型的枚舉定義: *
* 操作類型OpK,常數(shù)類型ConstK,變量類型VarK */
typedef enum {OpK,ConstK,VariK} ExpKind;
/* 變量類型VarKind類型的枚舉定義: *
* 標(biāo)識(shí)符IdV,數(shù)組成員ArrayMembV,域成員FieldMembV*/
typedef enum {IdV,ArrayMembV,FieldMembV} VarKind;
/* 類型檢查ExpType類型的枚舉定義: *
* 空Void,整數(shù)類型Integer,字符類型Char */
typedef enum {Void,Integer,Boolean} ExpType;
/* 參數(shù)類型ParamType類型的枚舉定義: *
* 值參valparamType,變參varparamType */
typedef enum {valparamType,varparamType} ParamType;
/* 定義語(yǔ)法樹節(jié)點(diǎn)的最大子節(jié)點(diǎn)數(shù)MAXCHILDRREN為3 */
/* 過(guò)程聲明部分的子節(jié)點(diǎn)child[0]指向參數(shù)部分,
子節(jié)點(diǎn)child[1]指向聲明體部分,子節(jié)點(diǎn)child[2]
指向函數(shù)的語(yǔ)句部分;*/
#define MAXCHILDREN 3
/*提前聲明符號(hào)表結(jié)構(gòu)*/
struct symbtable;
/********** 語(yǔ)法樹節(jié)點(diǎn)treeNode類型 *********/
typedef struct treeNode
{
struct treeNode * child[MAXCHILDREN]; /* 子節(jié)點(diǎn)指針 */
struct treeNode * sibling; /* 兄弟節(jié)點(diǎn)指針 */
int lineno; /* 源代碼行號(hào) */
NodeKind nodekind; /* 節(jié)點(diǎn)類型 */
union
{
DecKind dec;
StmtKind stmt;
ExpKind exp;
} kind; /* 具體類型 */
int idnum; /* 相同類型的變量個(gè)數(shù) */
char name[10][10]; /* 標(biāo)識(shí)符的名稱 */
struct symbtable * table[10]; /* 與標(biāo)志符對(duì)應(yīng)的符號(hào)表地址,在語(yǔ)義分析階段填入*/
struct
{
struct
{
int low; /* 數(shù)組下界 */
int up; /* 數(shù)組上界 */
DecKind childtype; /* 數(shù)組的子類型 */
}ArrayAttr; /* 數(shù)組屬性 */
struct
{
ParamType paramt; /* 過(guò)程的參數(shù)類型*/
}ProcAttr; /* 過(guò)程屬性 */
struct
{
LexType op; /* 表達(dá)式的操作符*/
int val; /* 表達(dá)式的值 */
VarKind varkind; /* 變量的類別 */
ExpType type; /* 用于類型檢查 */
}ExpAttr; /* 表達(dá)式屬性 */
char type_name[10]; /* 類型名是標(biāo)識(shí)符 */
} attr; /* 屬性 */
}TreeNode;
/*非終極符的總數(shù)*/
#define NTMLNUM 68
/*終極符的總數(shù)*/
#define TMLNUM 42
/*LL1分析表的大小*/
#define TABLESIZE 104
/******************類型和變量聲明*********************/
/* 1.進(jìn)行LL1語(yǔ)法分析用到的類型及對(duì)應(yīng)的變量 */
/*所有非終極符,其各自含義可參考LL1文法*/
typedef enum
{
Program, ProgramHead, ProgramName, DeclarePart,
TypeDec, TypeDeclaration, TypeDecList, TypeDecMore,
TypeId, TypeName, BaseType, StructureType,
ArrayType, Low, Top, RecType,
FieldDecList, FieldDecMore, IdList, IdMore,
VarDec, VarDeclaration, VarDecList, VarDecMore,
VarIdList, VarIdMore, ProcDec, ProcDeclaration,
ProcDecMore, ProcName, ParamList, ParamDecList,
ParamMore, Param, FormList, FidMore,
ProcDecPart, ProcBody, ProgramBody, StmList,
StmMore, Stm, AssCall, AssignmentRest,
ConditionalStm, StmL, LoopStm, InputStm,
InVar, OutputStm, ReturnStm, CallStmRest,
ActParamList, ActParamMore, RelExp, OtherRelE,
Exp, OtherTerm, Term, OtherFactor,
Factor, Variable, VariMore, FieldVar,
FieldVarMore, CmpOp, AddOp, MultOp
} NontmlType;
/*所有終極符,取自單詞的詞法類型的枚舉定義,可參考zglobals.h頭文件*/
typedef LexType TmlType;
/*實(shí)現(xiàn)LL1分析用的分析棧,存放的是終極符和非終極符 */
typedef struct Node
{ /*內(nèi)容標(biāo)志*/
int flag; /* flag為1,表示棧中內(nèi)容為非終極符;*/
/* flag為2,表示棧中內(nèi)容為終極符 */
/*內(nèi)容*/
union { NontmlType Ntmlvar ; /*非終極符部分*/
TmlType tmlvar; /*終極符部分*/
} var;
/*指向下一個(gè)節(jié)點(diǎn)的指針*/
struct Node *underNode;
} StackNode;
/* 2.創(chuàng)建語(yǔ)法樹所需的類型及變量**/
/*為建立聲明和語(yǔ)句部分的語(yǔ)法樹所設(shè)的指針棧,*
*注意棧中存的是存放指針的地址 */
typedef struct NodePA
{ TreeNode **pointer;
struct NodePA *underNode;
} StackNodePA;
/*為生成表達(dá)式部分的語(yǔ)法樹所設(shè)的指針棧,*
*棧中存的是存放指向樹節(jié)點(diǎn)的指針 */
typedef struct NodeP
{ TreeNode *pointer;
struct NodeP *underNode;
}StackNodeP;
/*符號(hào)棧頂指針*/
extern StackNode *StackTop;
/*棧空標(biāo)志*/
extern int STACKEMPTY;
/*語(yǔ)法樹棧頂指針*/
extern StackNodePA *StackTopPA;
/*棧空標(biāo)志*/
extern int paSTACKEMPTY;
/*操作符棧的棧頂指針*/
extern StackNodeP *OpStackTop;
/*操作符棧空標(biāo)志*/
extern int OpSTACKEMPTY ;
/*操作數(shù)棧的棧頂指針*/
extern StackNodeP *NumStackTop;
/*操作數(shù)棧空標(biāo)志*/
extern int NumSTACKEMPTY ;
/******************************************************
**********語(yǔ)義分析需要用到的類型及變量定義************
******************************************************/
/*標(biāo)識(shí)符的類型*/
typedef enum {typeKind,varKind,procKind}IdKind;
/*變量的類別。dir表直接變量(值參),indir表示間接變量(變參)*/
typedef enum {dir,indir}AccessKind;
/*形參表的結(jié)構(gòu)定義*/
typedef struct paramTable
{
struct symbtable * entry;/*指向該形參所在符號(hào)表中的地址入口*/
struct paramTable * next;
}ParamTable;
struct typeIR;
/*標(biāo)識(shí)符的屬性結(jié)構(gòu)定義*/
typedef struct
{
struct typeIR * idtype; /*指向標(biāo)識(shí)符的類型內(nèi)部表示*/
IdKind kind; /*標(biāo)識(shí)符的類型*/
union
{
struct
{
AccessKind access; /*判斷是變參還是值參*/
int level;
int off;
bool isParam; /*判斷是參數(shù)還是普通變量*/
}VarAttr;/*變量標(biāo)識(shí)符的屬性*/
struct
{
int level; /*該過(guò)程的層數(shù)*/
ParamTable * param; /*參數(shù)表*/
int mOff; /*過(guò)程活動(dòng)記錄的大小*/
int nOff; /*sp到display表的偏移量*/
int procEntry; /*過(guò)程的入口地址*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -