mayo031042/10cc
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
一般のC compiler と異なる(かもしれない)点
{
bool 型はint 型に直される
配列の宣言時 数値以外を解釈できない→四則演算もだめ
変数をparse する時は配列型、ポインタ型、INT型に関わらず 暗黙的に*&の付加を行う
それに伴って&の左辺には変数型node のみがくることを保証し、*の左辺にはptr_to にtype の存在を保証する
}
バグ
{
}
try 系
内部で条件分岐する 主目的が果たせないときはそのままりたーんする
関数の依存関係を記述する
-> その関数内で呼び出される可能性のある自作関数を改行して羅列
-> 配列と構造体,enum も含めて記載
==parce_func.c==
bool current_token_is(TokenKind kind, char *op);
f
v
tokens[]
token_pos
bool consume(TokenKind kind, char *op);
f
current_token_is()
v
token_pos
bool consume_keyword(TokenKind kind);
f
v
tokens[]
token_pos
bool consume_ident();
f
v
tokens[]
token_pos
ident_pos
bool expect(TokenKind kind, char *op);
f
consume()
error_at()
v
tokens[]
token_pos
bool expect_ident();
f
consume_ident()
error_at()
v
tokens[]
token_pos
TypeKind expect_vartype();
f
consume_keyword()
error_at()
v
tokens[]
token_pos
int expect_number();
f
error_at()
v
tokens[]
token_pos
bool at_eof();
f
v
tokens[]
token_pos
int val_of_ident_pos();
f
v
ident_pos
==node.c==
Node 構造体は全てに出現するので省略
Node *create_node(NodeKind kind);
f
v
Node *new_node(NodeKind kind, Node *lhs, Node *rhs);
f
create_node()
v
Node *new_node_num(int val);
f
create_node()
v
Node *new_node_lvar(LVar *lvar);
f
create_node()
v
LVar
Node *create_or_stmt(NodeKind kind);
f
consume()
create_node()
stmt()
v
Node *new_node_if();
f
create_node()
expr()
expect()
create_or_stmt()
v
Node *new_node_else();
f
create_node()
new_node_if()
consume_keyword()
new_node_else()
create_or_stmt()
v
Node *new_grand_node(NodeKind kind, Node *l_l, Node *l_r, Node *r_l, Node *r_r)
f
new_node()
v
Node *new_node_for();
f
expect()
current_token_is()
create_node()
expr()
expect()
new_grand_node()
create_or_stmt()
v
Node *new_node_while();
f
expect()
expr()
new_grand_node()
create_node()
create_or_stmt()
v
Node *new_node_do();
f
create_or_stmt()
expect()
expr()
new_node()
v
Node *new_node_sizeof();
f
unary()
new_node_num()
size_of_node()
v
Node *new_node_block();
f
consume()
consume_keyword()
stmt()
type_of_node()
new_node_block()
v
Node *build_block();
f
add_block_nest()
new_node()
new_node_block()
sub_block_nest()
v
==lvar.c==
LVar 構造体は全てに出現するので省略
int culc_offset();
f
val_of_block_nest()
v
funcs[]
func_pos
LVar *new_lvar();
f
val_of_ident_pos()
culc_offset()
size_of()
val_of_block_nest()
v
tokens[]
funcs[]
func_pos
LVar *find_lvar_within_block(int depth);
f
val_of_ident_pos()
v
funcs[]
func_pos
tokens[]
LVar *find_lvar();
f
val_of_block_nest()
find_lvar_within_block()
error_at()
v
tokens[]
token_pos
Node *declare_lvar();
f
create_node()
new_type()
add_type_ptr()
expect_ident()
add_type_array()
find_lvar_within_block()
val_of_block_nest()
error_at()
new_lvar()
v
Node
Type
==func.c==
Func 構造体は全てに出現するので省略
Func **find_func();
f
val_of_ident_pos()
v
funcs[]
Func *new_func(Token *tok, Type *type);
f
v
Token
void declare_arg();
f
expect()
consume()
declare_lvar()
v
void consume_arg();
f
expect()
consume()
v
token_pos
Node *build_arg();
f
expect()
consume()
new_node()
expr()
v
Node
==type.c==
Type 構造体は全てに出現するので省略
Type *new_type(TypeKind kind);
f
v
Type *add_type_ptr(Type *type);
f
consume()
new_type()
v
Type *add_type_array(Type *type);
f
consume()
new_type()
expect_number()
expect()
add_type_array()
v
==parce.c==
Node 構造体は全てに出現するので省略
Node *primary();
f
consume()
expr()
expect()
consume_ident()
current_token_is()
create_node()
find_func()
error_at()
val_of_ident_pos()
build_arg()
new_node_lvar()
find_lvar()
new_node()
v
Func
Node *unary();
f
consume()
primary()
new_node()
new_node_num()
unary()
new_node_sizeof()
v
Node *mul();
f
consume()
new_node()
unary()
v
Node *add();
f
mul()
consume()
new_node()
v
Node *relational();
f
add()
consume()
new_node()
v
Node *equality();
f
relational()
consume()
new_node()
v
Node *assign();
f
equality()
consume()
new_node()
assign()
error_at()
v
tokens[]
token_pos
Node *expr();
f
assign()
type_of_node()
v
Node *stmt();
f
consume_keyword()
build_block()
new_node_else()
new_node_for()
new_node_while()
new_node_do()
current_token_is()
declare_lvar()
new_node()
expr()
create_node()
expect()
v
Node *program();
f
expect()
build_block()
v
void *function()
f
at_eof()
current_token_is()
error()
new_type()
expect_vartype()
add_type_ptr()
expect_ident()
find_func()
new_func()
val_of_ident_pos()
declare_arg()
consume_arg()
error_at()
program()
v
Type
Func
funcs[]
func_pos