写在前面
总体:
不支持宏定义
如#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
用于支持
在一个声明中同时声明多个变量
变量声明devars
|
|
函数定义defun
|
|
包括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语言是通过可变长参数的前一个参数的地址来取得剩余参数的
结构体定义
如
不支持
// 用于表示结构体或联合体成员
// 不支持对于一个类型可以用逗号分隔定义多个成员
// eg. int x,y;
// 只能 int x;// int y;
定义结构体和定义该结构体类型变量必须分开
联合体定义
typedef定义
其他类型
数组
这一块和java一样
支持不定长数组
支持定长数组
指针
注意
先确定类型,如
意思是x,y都是int *类型
函数指针
运算符
复合赋值运算符 | |
---|---|
+= | |
-= | |
*= | |
/= | |
%= | |
&= | |
= | |
^= | |
<<= | |
>>= |
上面没显示的是|=
其他运算符和运算符优先级

#include语句
将书中的import改为include,功能一样
如#include stdio.h
compiler和type文件夹下面
和语义分析相关的类
对抽象语法树进行分析,并实施变量引用的消解和类型检查
- 变量引用的消解
- 类型名称的消解
- 类型定义检查
- 表达式的有效性检查
- 静态类型检查
类 | 作用 |
---|---|
LocalResolver | 变量引用的消解 |
DereferenceChecker | 表达式的有效性检查 |
TypeResolver | 类型名称的消解 |
TypeChecker | 静态类型检查 |
TyepeTable | 类型定义检查 |

Visitor模式

和语义分析相关的类