📄 global.h
字号:
// global.h: interface for the Cglobal class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_GLOBAL_H__DA8B3700_55CD_4AF5_8E37_89AF1BDDE755__INCLUDED_)
#define AFX_GLOBAL_H__DA8B3700_55CD_4AF5_8E37_89AF1BDDE755__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#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)
/*非终极符的总数*/
#define NTMLNUM 68
/*终极符的总数*/
#define TMLNUM 42
/*LL1分析表的大小*/
#define TABLESIZE 104
/* 定义语法树节点的最大子节点数MAXCHILDRREN为3 */
/* 过程声明部分的子节点child[0]指向参数部分,
子节点child[1]指向声明体部分,子节点child[2]
指向函数的语句部分;*/
#define MAXCHILDREN 3
/********************** 单词的词法类型 ********************/
typedef enum
{
/* 簿记单词符号 */
ENDFILE1, ERROR1,
/* 保留字 */
PROGRAM, PROCEDURE, TYPE, VAR, IF,
THEN, ELSE, FI, WHILE, DO,
ENDWH, BEGIN, END, READ, WRITE,
ARRAY, OF, RECORD, RETURN,
INTEGER, CHAR1,
/* 多字符单词符号 */
ID, INTC, CHARC,
/*特殊符号 */
ASSIGN, EQ, LT, PLUS, MINUS,
TIMES, OVER, LPAREN, RPAREN, DOT,
COLON, SEMI, COMMA, LMIDPAREN, RMIDPAREN,
UNDERANGE
} LexType;
class Cglobal
{
public:
Cglobal();
virtual ~Cglobal();
public:
/*********** 单词的类型,包括词法信息和语义信息 ************/
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;
/*提前声明符号表结构*/
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;
/******************类型和变量声明*********************/
/* 1.进行LL1语法分析用到的类型及对应的变量 */
/*所有非终极符,其各自含义可参考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;
/*实现LL1分析用的分析栈,存放的是终极符和非终极符 */
typedef struct Node
{ /*内容标志*/
int flag; /* flag为1,表示栈中内容为非终极符;*/
/* flag为2,表示栈中内容为终极符 */
/*内容*/
union { NontmlType Ntmlvar ; /*非终极符部分*/
TmlType tmlvar; /*终极符部分*/
} var;
/*指向下一个节点的指针*/
struct Node *underNode;
} StackNode;
/* 2.创建语法树所需的类型及变量**/
/*为建立声明和语句部分的语法树所设的指针栈,*
*注意栈中存的是存放指针的地址 */
typedef struct NodePA
{ TreeNode **pointer;
struct NodePA *underNode;
} StackNodePA;
/*为生成表达式部分的语法树所设的指针栈,*
*栈中存的是存放指向树节点的指针 */
typedef struct NodeP
{ TreeNode *pointer;
struct NodeP *underNode;
}StackNodeP;
/*符号栈顶指针*/
StackNode *StackTop;
/*栈空标志*/
int STACKEMPTY;
/*语法树栈顶指针*/
StackNodePA *StackTopPA;
/*栈空标志*/
int paSTACKEMPTY;
/*操作符栈的栈顶指针*/
StackNodeP *OpStackTop;
/*操作符栈空标志*/
int OpSTACKEMPTY ;
/*操作数栈的栈顶指针*/
StackNodeP *NumStackTop;
/*操作数栈空标志*/
int NumSTACKEMPTY ;
/******************************************************
**********语义分析需要用到的类型及变量定义************
******************************************************/
/*标识符的类型*/
typedef enum {typeKind,varKind,procKind}IdKind;
/*变量的类别。dir表直接变量(值参),indir表示间接变量(变参)*/
typedef enum {dir,indir}AccessKind;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -