Tokenizer Part getsym() tokenizer alpha(skipspc())) alphabet digit() digit getch() get one char gsearch() global name table search lsearch() local name table search escape() \033, \n など getstring() "aaaa" postequ() += などの処理 getch() getline() get one line getline() macroeq() Macro expansion #define Parser Part main() メインルーチン init() initialize 表等の初期化 decl() declare 宣言 typescpec() 型の宣言 int decl0() declare 宣言の本体 a[0],a; fdecl() function 関数の宣言 int a() { decl() local ローカル変数の宣言 int b; statement() statement 文 b = 1; def() 宣言されたオブジェクトの処理 typespec() type 型 sdelc() struct 構造体 struct decl() struct 構造体の中の宣言 decl0() * のついた宣言 (pointer) decl1() dec1() array 配列、variable name 変数名の定義 decl0() nested type 入れ子になった型 cexpr(expr()) size of array 配列の大きさ adecl() argument 引き数の宣言 def() fcheck() 既に宣言されているか? expr1() variable initilize 変数の初期化のための式の評価 文 statement() statement のコンパイル、以下、Cの基本構文 doif() dowhile() dodo() dofor() doswitch() docomp() docase() dodefault() doreturn() dogoto() dolabel() bexpr() branch expression if(a) など gexpr(expr()) expression 普通の式、gexpr はコード生成 expr() expression 式、これは木を返す rvalue(expr0()) のrvalue (right value) expr0() , で、つながった式 expr1() expr1() =, +=, <<= など expr2() expr2() a?b:c 3項演算子 expr3() expr3() || expr4() expr4() && expr5() expr5() | expr6() expr6() ^ expr7() expr7() & expr8() expr8() ==, != expr9() expr9() <,>,<=,>= expr10() expr10() <<,>> expr11() expr11() +,- expr12() expr12() *,%,/ expr13() expr13() ++,--,*p,|,-,~,! expr16() typename() sizeof, (int)a expr14() expr14() variable,"aaa",1234, expr15() expr13() expr0() () expr16() expr16() array[] expr15() strop() a.b, a->b ndecl0() expr15() function(a,b,c) typename() typespec() (int *) ndecl0() ndecl0() * の処理 ndecl1() ndecl1() arrary[],function() cexpr(expr()) bexpr() branch rexpr() >,<,!= 条件分岐のための式 gexpr() gexpr() コード生成 (この以下は、省略) gexpr()