梅庄

编译原理实现概况

写在前面

总体:
不支持宏定义
如#define
将书中import换成#include,作用不变
去除goto语句
不支持float和double

ast文件夹下面

Node

AST

抽象语法树的根

ExprNode

表示表达式的节点

AbstractAssignNode

赋值

AssignNode

赋值表达式(=)

OpAssignNode

复合赋值表达式(+=, -=, ……)

AddressNode

地址表达式(&x)

BinaryOpNode

二元运算表达式(x+y, x-y, ……)

LogicalAndNode

&&

LogicalOrNode

||

CastNode

类型转换

CondExprNode

条件运算表达式

FuncallNode

函数调用表达式

LHSNode

能够成为赋值的左值的节点

ArefNode

数组表达式(a[i])

DereferenceNode

指针表达式(*ptr)

MemberNode

成员表达式(s.memb)

PtrMemberNode

成员表达式(ptr->memb)

VariableNode

变量表达式

LiteralNode

字面量

SizeofExprNode

计算表达式的sizeof表达式

SizeofTypeNode

计算类型的sizeof表达式

UnaryOpNode

一元运算表达式(+x,-x,……)

UnaryArithmeticOpNode

++和–

PrefixOpNode

前置的++和–

SuffixOpNode

后置的++和–

Slot

表示结构体成员的节点

StmtNode

表示语句的节点

BlockNode

程序块({……})

BreakNode

break语句

CaseNode

case标签

ContinueNode

continue语句

DoWhileNode

do……while语句

ExprStmtNode

单独构成语句的表达式

ForNode

for语句

IfNode

if语句

ReturnNode

return语句

SwithchNode

switch语句

WhileNode

while语句

TypeDefinition

类型定义

CompositeTypedefinition

结构体或联合体的定义

StructNode

结构体的定义

UnionNode

联合体的定义

TypedefNode

typedef声明

TypeNode

存储类型的节点

parser文件夹下面(.jj文件)

变量声明列表devar_list

用于支持
在一个声明中同时声明多个变量

1
int x, y, z;

变量声明devars

1
2
3
4
boolean priv; //是否为static
TypeNode type; //类型
String name; //变量名
ExprNode init = null; //可省略的初始化表达式

函数定义defun

1
2
3
4
5
boolean priv; //是否是static
TypeRef ret; //typeref()在语法层面上和type()是相同的
String n; //函数名
Params ps; //形参声明
BlockNode body; //函数本体

包括
DefinedFunction:函数定义
DefinedVariable:变量定义
Constant常量定义、
StructNode结构体定义
UnionNode联合体定义
TypedefNode用户类型定义。

外部符号import

表示声明的类
UndefinedFunction:函数
UndefinedVariable:变量
StructNode:结构体
UnionNode:联合体
TypedeNode:typedef

整数字面量

支持L和U结尾(也支持既有L又U)
支持8进制和16进制类型(0开头和0x开头)

char类型

保留
\a,\0``\",\\,\b,\e,\f,\n,\t,\r,\v
空白符{“ “, “\t”, “\n”, “\r”, “\f”}

String类型

注释

///**/

保留字

保留字
void
char
short
int
long
struct
union
enum
static
extern
const
signed
unsigned
if
else
switch
case
default
while
do
for
return
break
continue
typedef
#include
sizeof

声明declaration_file

函数声明
变量声明
常量声明
结构体声明struct
如 struct point p;
联合体声明union
typedef声明

定义top_defs

变量定义

(static) 类型(如int) 名字(如x) (表达式,如=2,可省略);
static int x = 2;
不支持 var = {1,2,3};

常量定义

前加const
类型(如int)名字(如x)表达式(如=2) ;

函数定义

priv=storage() ret=typeref() n=name() “(“ ps=params() “)” body=block()
如(static) int maxNum(int x, int y, int z){}

参数

// 形参声明
// 三种形式:
// 1.无参数(形参声明为void。如getc等)
// 2.定长参数(参数的个数是相同的。如puts或fgets等)
// 3.可变长参数(参数的个数不确定。如printf等)
注意:
//定长参数或可变长参数
//C语言必须有1个或1个以上的形参后才支持可变长参数
//f(…)是不允许的,至少要f(int x, …)
//原因在于C语言是通过可变长参数的前一个参数的地址来取得剩余参数的

结构体定义


1
2
3
4
struct point {
int x;
int y;
}

不支持

1
2
3
4
struct point {
int x;
int y;
}m,n;

// 用于表示结构体或联合体成员
// 不支持对于一个类型可以用逗号分隔定义多个成员
// eg. int x,y;
// 只能 int x;// int y;
定义结构体和定义该结构体类型变量必须分开

联合体定义

typedef定义

其他类型

数组

这一块和java一样
支持不定长数组

1
int[] a;

支持定长数组

1
int[5] a;

指针

注意
先确定类型,如

1
int* x,y;

意思是x,y都是int *类型

函数指针

运算符

复合赋值运算符
+=
-=
*=
/=
%=
&=
=
^=
<<=
>>=

上面没显示的是|=

其他运算符和运算符优先级

#include语句

将书中的import改为include,功能一样
如#include stdio.h

compiler和type文件夹下面

和语义分析相关的类

对抽象语法树进行分析,并实施变量引用的消解和类型检查

  1. 变量引用的消解
  2. 类型名称的消解
  3. 类型定义检查
  4. 表达式的有效性检查
  5. 静态类型检查
作用
LocalResolver 变量引用的消解
DereferenceChecker 表达式的有效性检查
TypeResolver 类型名称的消解
TypeChecker 静态类型检查
TyepeTable 类型定义检查

Visitor模式

和语义分析相关的类