📄 a.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 */
char tokenString[MAXTOKENLEN+1];
/* BUFLEN源代码行的输入缓冲区长度为256 */
#define BUFLEN 256
/* lineBuf为当前输入代码行缓冲区 */
static char lineBuf[BUFLEN];
/* linepos为在代码缓冲区LineBuf中的当前字符位置,初始为0 */
static int linepos = 0;
/* bufsize为当前缓冲器中所存字串大小 */
static int bufsize = 0;
/* EOF_flag当为文件尾时,改变函数ungetNextChar功能 */
static int EOF_flag = FALSE;
/******************* 保留字查找表 ********************/
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} };
////////////////////////////////////////////////////////////////////////
FILE * source; /* 源程序文本文件,为编译器输入文件 */
FILE * listing; /* 中间列表文件,为编译器中间信息输出文件 */
/*指针fp,指向存放Token序列的文件"Tokenlist"*/
FILE *fp;
/*Token序列中的token数目*/
int Tokennum=0;
/*清单的行号*/
int lineno=0;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -