⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a.h

📁 SNL语言编译器源码 小语言的编译器C++实现 包括词法分析
💻 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 + -