📄 compiler.h
字号:
/*
FileName: compiler.h
Author: LiWen
Create: 2005-11-23
Last Modified: 2005-12-29
Discription: 编译器头文件,结构的定义和函数声明
常量定义以及保护函数的宏定义
*/
#ifndef _COMPILER_H
#define _COMPILER_H
///////////////////////////////////////////
//Header Files
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
////////////////////////////////////////////////////
//预置常量定义部分
#define KEYNUM 13 //关键字数目
#define NUMDMAX 14 //数字的最大位数
#define IDENTMAX 10 //标识符的最大长度
#define MEMMAX 2047 //地址上界
#define ERRMAXN 44 //错误项目数
#define ERRMAXL 100 //错误信息最大长度
#define LEVMAX 3 //过程最大层数
#define MAXTX 100 //名字表最大容量
#define MAXERR 100 //最大允许错误数
#define CXMAX 200 //生成中间代码最大条数
#define BUFSIZE 10 //读入缓冲区大小
#define STRMAX 257 //一般字符串大小
#define WANYOUTSIZE 32767 //词法分析结果缓冲区
#define EXESTACKSIZ 256 //运行时堆栈大小
#define TMNT -1 //致命错误终止返回标志
//////////////////////////////////////////////
//数据结构定义部分
//
/*错误项目标识*/
enum ErrType{
/*****************Fetal errors***********************/
UNEXPECTED_FILE_END, //1.不可预期的文件结尾
UNEXPECTED_EXTERN_CODE, //2.程序结束还有多余代码
CODELIST_OVERFLOW, //3.中间代码表溢出
TABLE_OVERFLOW, //4.符号表溢出
/*****************Symbol errors**********************/
IDENT_TOO_LONG, //5.标识符过长
NUM_TOO_BIG, //6.数字过长
UNKNOWN_SYMBOL, //7.不可识别的符号
/****************Syntax errors***********************/
MISSING_PERIOD, //8.程序末尾丢掉了'.'结束符号
IDENT_REDECLARED,
IDENT_IN_CONST_EXPECTING, //9.常量声明必须以标识符开始
EQL_IN_CONST_EXPECTING, //0.常量声明中间应该为'='符号
NUM_IN_CONST_EXPECTING, //1.常量声明的值必须是数字常量
MISSING_SEMICOLON_IN_CONST, //2.常量声明末尾丢掉了';'
IDENT_IN_VAR_EXPECTING, //3.变量必须为标识符
MISSING_SEMICOLON_IN_VAR, //4.变量声明末尾丢掉了';'
PROC_LEV_TOO_DEEP, //5.过程层次定义太深
IDENT_IN_PROC_EXPECTING, //6.过程名必须为标识符
MISSING_SEMICOLON_IN_PROC, //7.过程声明末尾丢掉了';'
MISSING_SEMICOLON_END_PROC, //8.过程定义末尾丢掉了';'
UNEXPECTED_STATEMENT_BEGIN, //9.无效的语句开始
VAR_UNDECLARED, //0.未声明的变量
PROC_UNDECLARED, //1.未声明的过程
IDENT_CONST_IN_ASSIGN, //2.不可为常量赋值
IDENT_PROC_IN_ASSIGN, //3.赋值语句左边不可为过程名
BECOMES_EXPECTING_IN_ASSIGN, //4.赋值语句中间应该为":="
MISSING_SEMICOLON_IN_STATEMENT, //5.语句末尾丢掉了';'
THEN_EXPECTING_IN_IF, //6.if语句条件后面应该为then
DO_EXPECTING_IN_WHILE, //7.while语句条件后面应该为do
PROC_EXPECTING_IN_CALL, //8.call 后面必须是 过程名
IDENT_CONST_IN_READ, //9.read 语句中不应有常量
IDENT_PROC_IN_READ, //0.read 语句中不应有过程名
KEYWORD_APPEAR_IN_READ, //1.read 语句中不应该出现关键字
IDENT_EXPECTING_IN_READ, //2.read 语句中'('或者','后面应为变量
IDENT_PROC_IN_EXP, //3.表达式中不因该出现过程名
RELATIONOPR_EXPECTING_IN_CDT, //4.条件中的不应出现非关系运算符
MISSING_LPAREN, //5.丢掉了左括号
MISSING_RPAREN, //6.丢掉了右括号
MISSING_END, //7.缺少END
UNEXPECTED_STATEMENT_FOLLOW, //8.语句follow集不符
UNEXPECTED_PROCDECL_FOLLOW, //9.过程声明follow集不符
UNEXPECTED_CONST_FOLLOW, //0.常量声明follow集不符
UNEXPECTED_VAR_FOLLOW, //1.变量声明follow集不符
UNEXPECTED_PROCBODY_FOLLOW, //2.过程定义follow集不符
UNEXPECTED_CDT_FOLLOW, //3.条件follow集不符
UNEXPECTED_FACTOR_FOLLOW, //4.表达式follow集不符
};
/*错误记录结构*/
typedef struct struct_errt{
char str[100];
int row;
ErrType type;
}ERRT;
/*表项元素类型*/
typedef enum table_kind{
cst,var,proc
}KIND;
/*表项结构*/
typedef struct table_struct{
char name[IDENTMAX];
KIND kind;
int val;
int addr;
int lev;
//int size;
}TABLE;
/*字串(word)的类型代号*/
enum symbol{
nul,ident,number,plus,minus,
times,slash,oddsym,eql,neq,
lss,leq,gtr,geq,becomes,lparen,
rparen,comma,semicolon,period,
beginsym,endsym,ifsym,thensym,whilesym,
writesym,readsym,dosym,callsym,constsym,
varsym,procsym
};
#define SYMNUM 32 //字串(word)类型数
typedef struct symbol_struct{
char word[IDENTMAX+1];
symbol sym;
}SYM;
/*指令instruction的代号*/
enum instruction{
LIT,LOD,STO,CAL,INT,JMP,JPC,OPR
};
/*指令的存储结构*/
typedef struct instrction_struct{
enum instruction f;
int l;
int a;
}INSTRUCTION;
///////////////////////////////////////////////////////////////////
//下面是保护函数的宏定义,保证编译器在出现致命错误时,能够迅速返回
//到主程序报告错误,这些错误包括不可预期的文件末尾、各表格堆栈溢出
//以及除零出错等
#define PRT_PREREAD() if(preread() == TMNT) return TMNT
#define PRT_GETSYM() if(getsym() == TMNT) return TMNT
#define PRT_TABLEINSERT(a,b,c) if(tableinsert(a,b,c) == TMNT) return TMNT
#define PRT_TABLEPOP(a) if(tablepop(a) == TMNT) return TMNT
#define PRT_TRANSFORM(a,b,c) if(transform(a,b,c) == TMNT) return TMNT
#define PRT_REPORT(a) if(report(a) == TMNT) return TMNT
#define PRT_PROCBODY(a) if(procbody(a) == TMNT) return TMNT
#define PRT_STATEMENT(a,b) if(statement(a,b) == TMNT) return TMNT
#define PRT_VARDECLARE(a,b) if(vardeclare(a,b) == TMNT) return TMNT
#define PRT_CONSTDECLARE(a,b) if(constdeclare(a,b) == TMNT) return TMNT
#define PRT_PROCDECLARE(a,b) if(procdeclare(a,b) == TMNT) return TMNT
#define PRT_EXP(a,b) if(expression(a,b) == TMNT) return TMNT
#define PRT_TERM(a,b) if(term(a,b) == TMNT) return TMNT
#define PRT_FACTOR(a,b) if(factor(a,b) == TMNT) return TMNT
#define PRT_CONDITION(a,b) if(condition(a,b) == TMNT) return TMNT
#define PRT_PUSHTRY(a) if(pushtry(a) == TMNT) return TMNT
#define PRT_RUN(a,b,c) if(run(a,b,c) == TMNT) return TMNT
////////////////////////////////////////////////////////////////
//函数声明部分
//in error.cpp
void errorinit();
int report(ErrType type);
//in symbol.cpp
void symbolinit();
int getsym();
//in table.cpp
void tableinit();
int tableinsert(int lev,KIND kind,int *pdx = NULL);
int tablepop(int num);
int tablesearch(char *);
//in syntax.cpp
int program();
int constdeclare(int, int*);
int vardeclare(int, int*);
int procdeclare(int, int*);
int procbody(int);
int statement(int,int*);
int condition(int,int*);
int expression(int,int*);
int term(int,int*);
int factor(int,int*);
//in instruction.cpp
int transform(enum instruction f,int l,int a);
//in execute.cpp
int run(enum instruction f, int l, int a);
int execute();
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -