📄 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;
///////////////////////////////////////////////////////////////////////////////////////////
typedef enum
{ START,INASSIGN,INRANGE,INCOMMENT,INNUM,INID,INCHAR,DONE }
StateType;
/* tokenString用于保存标识符和保留字单词的词元,长度41 */
static char tokenString[MAXTOKENLEN+1];
/* BUFLEN源代码行的输入缓冲区长度为256 */
#define BUFLEN 256
/* lineBuf为当前输入代码行缓冲区 */
extern char lineBuf[BUFLEN];
/* linepos为在代码缓冲区LineBuf中的当前字符位置,初始为0 */
extern int linepos;
/* bufsize为当前缓冲器中所存字串大小 */
extern int bufsize;
/* EOF_flag当为文件尾时,改变函数ungetNextChar功能 */
extern int EOF_flag ;
/******************* 保留字查找表 ********************/
static struct
{ char* str;
LexType tok;
} reservedWords[MAXRESERVED]
= { {"program",PROGRAM},{"type",TYPE},{"var",VAR},{"procedure",PROCEDURE}
,{"begin",BEGIN},{"end",END},{"array",ARRAY},{"of",OF},{"record",RECORD}
,{"if",IF},{"then",THEN},{"else",ELSE},{"fi",FI},{"while",WHILE}
,{"do",DO},{"endwh",ENDWH},{"read",READ},{"write",WRITE},{"return",RETURN}
,{"integer",INTEGER},{"char",CHAR} };
/******************************************************
****************** 语法分析树 ********************
******************************************************/
/*语法树根节点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;
/******************************************************
***************** 类型内部表示 ******************
******************************************************/
/*类型的枚举定义*/
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;
extern int Level; /*scope栈的层数*/
/*Token序列中的token数目*/
extern int Tokennum;
/*清单的行号*/
extern int lineno;
/*************************************
*********** 追踪标志 ************
*************************************/
/* 源程序追踪标志,如果该标志为TRUE *
* 语法分析时将源程序行号写入列表文件listing */
extern int EchoSource;
/* 词法扫描追踪标志,如果该标志为TRUE *
* 将每个被词法扫描器识别的单词信息写入列表文件listing */
extern int TraceScan;
/* 语法分析追踪标志,如果该标志为TRUE *
* 将语法树以线性形式(使用子节点缩进)写入列表文件listing */
extern int Error;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -