[TOC]
使用make
产生可执行文件complier.exe
使用complier.exe -h
获取帮助
最终输出语法树,目标代码以及汇编代码
test.c和test_fact.c为测试代码
运算符和分隔符
- TK_PLUS ::=
+
- TK_MINUS ::=
-
- TK_STAR ::=
*
- TK_DIVIDE ::=
/
- TK_MOD ::=
%
- TK_EQ ::=
==
- TK_NEQ ::=
!=
- TK_LT ::=
<
- TK_LEQ ::=
<=
- TK_GT ::=
>
- TK_GEQ ::=
>=
- TK_ASSIGN ::=
=
- TK_DOT ::=
.
- TK_AND ::=
&&
- TK_OR ::=
||
- TK_NOT ::=
!
- TK_LP ::=
(
- TK_RP ::=
)
- TK_LB ::=
[
- TK_RB ::=
]
- TK_BEGIN ::=
{
- TK_END ::=
}
- TK_SEMI ::=
;
- TK_COMMA ::=
,
- TK_EOF ::=
END OF FILE
常量
- TK_CINT ::=
CONST INT
- TK_CFLOAT ::=
CONST FLOAT
- TK_CCHAR ::=
CONST CHAR
- TK_CSTR ::=
CONST STRING
关键字
- KW_CHAR ::=
char
- KW_INT ::=
int
- KW_FLOAT ::=
float
- KW_STRUCT ::=
struct
- KW_RETURN ::=
return
- KW_IF ::=
if
- KW_ELSE ::=
else
- KW_FOR ::=
for
- KW_CONTINUE ::=
continue
- KW_BREAK ::=
break
标识符
- TK_ID ::=
IDENTIFIER
这部分包含全局变量及函数定义的语法,Program是初始语法单元,表示整个程序。每个Program可以产生一个ExtDefList,每个ExtDefList表示0个或多个ExtDef,每个ExtDef表示一个全局变量、结构体、函数的定义或函数的声明
-
Program ::= ExtDefList
-
ExtDefList ::= ExtDef ExtDefList
| ε
-
ExtDef ::= Specifier ExtDecList TK_SEMI
| Specifier TK_SEMI
| Specifier FunDec CompSt
| Specifier FunDec TK_SEMI
-
ExtDecList ::= VarDec
| VarDec TK_COMMA ExtDecList
这部分主要与变量的类型有关,包括普通类型
int
、char
、float
和结构体类型
-
Specifier ::= Type
| StructSpecifier
-
Type ::= KW_INT| KW_FLOAT| KW_CHAR
-
StructSpecifier ::= KW_STRUCT OptTag TK_BEGIN DefList TK_END
| KW_STRUCT TK_ID
-
OptTag ::= TK_ID
| ε
这一部分主要与变量和函数的定义有关,VarDec表示对一个变量的定义,FunDec表示对一个函数头的定义
-
VarDec ::= TK_ID
| VarDec TK_LB TK_CINT TK_RB
-
FunDec ::= TK_ID TK_LP ParamList TK_RP
| TK_ID TK_LP TK_RP
-
ParamList ::= ParamDec TK_COMMA ParamList
| ParamDec
-
ParamDec ::= Specifier VarDec
这一部分主要与语句有关,CompSt表示一个由一对花括号括起来的语句块,StmtList是个或多个Stmt的组合,每个Stmt都表示一个语句
-
CompSt ::= TK_BEGIN DefList StmtList TK_END
-
StmtList ::= Stmt StmtList
| ε
-
Stmt ::= Expression TK_SEMI
| CompSt
| KW_RETURN Expression TK_SEMI
| KW_IF TK_LP Expression TK_RP Stmt
| KW_IF TK_LP Expression TK_RP Stmt KW_ELSE Stmt
| KW_FOR TK_LP Expression TK_SEMI Expression TK_SEMI Expression TK_RP Stmt
这一部分主要与局部变量的定义有关,DefList由0个或多个Def组成,每个Def就是一条变量定义,它包含一个类型描述符Specifier和一个DecList
-
DefList ::= Def DefList
| ε
-
Def ::= Specifier DecList TK_SEMI
-
DecList ::= Dec
| Dec TK_COMMA DecList
-
Dec ::= VarDec
| VarDec TK_ASSIGN Expression
这一部分主要与表达式有关,包含二元运算符的表达式(赋值表达式、逻辑表达式、关系表达式以及四则运算表达式)、一元运算符的表达式(括号表达式,取负以及逻辑非)、不包含运算符的表达式(函数调用表达式、数组访问表达式以及结构体访问表达式)和最基本的表达式(整型常数、浮点型常数、字符型常量、字符串常量以及普通变量),Args表示实参列表。
-
Expression ::= Expression TK_ASSIGN Expression
| Expression TK_AND Expression
| Expression TK_OR Expression
| Expression RelOp Expression
| Expression TK_PLUS Expression
| Expression TK_MINUS Expression
| Expression TK_STAR Expression
| Expression TK_DIVIDE Expression
| TK_LP Expression TK_RP
| TK_MINUS Expression
| TK_NOT Expression
| TK_ID TK_LP Args TK_RP
| TK_ID TK_LP TK_RP
| Expression TK_LB Expression TK_RB
| Expression TK_DOT TK_ID
| TK_ID
| TK_CINT
| TK_CFLOAT
| TK_CCHAR
| TK_CSTR
-
RelOp ::= TK_LT | TK_LEQ | TK_EQ | TK_GT | TK_GEQ | TK_NEQ
-
Args ::= Expression TK_COMMA Args
| Expression
- Undefined variable;
- Undefined function;
- Redefined variable;
- Redefined function;
- Type mismatched for assignment;
- The left-hand side of an assignment must be a variable;
- Type mismatched for operands;
- Type mismatched for return;
- Unmatched parameters for function;
- Symbol is not an array;
- Symbol is not a function;
- Type of expression between "[]" should be INT;
- Illegal use of ".";
- Non-existent field of a structure;
- Redefined structure field;
- Redefined structure;
- Undefined structure;
- Redefined parameter of function;
- Only INT can be use as boolean in a condition statement;
- Can not initialize a field while defining the structure;
- Only INT can use "!"(not);
- Only INT or FLOAT can use "-"(minus);
- Array dimension error;