読者です 読者をやめる 読者になる 読者になる

言語のしくみを読む

main関数から読んでいく

$ ./streem ../examples/02hello.strm

main関数
オプション処理部はパスして
node_parse_init(&state) //node.c
state構造体の初期化
e_progはNULLなのでelse節以降を実行、引数を持っているので最後のelse節を実行
for(i = 1;i < argc;i++){
node_parse_file(&state,argv[i]) //node_parse_file node.c
}
node_parse_fileに渡されるのは引数の"../examples/02hekko.strm"になる。
渡されたファイル名を使ってreadモードで開かれる。
node_parse_input関数を呼び出す。
yyrestart関数にファイルポインタを渡して呼び出す //yyrestart:y.tab.c
yyparse関数のparser変数を渡して呼び出す
中身はまったくわからない。
parser_state pは
p.nerr = 0
p.lval = (void
) 0x61a510 ?
p.fname = 0x0
p.lineno = 2
p.tline = 3
node_parse_file関数に戻ってきてファイルを閉じる
main関数に戻る
strm_ary_new(NULL,argc=2)関数を呼ぶ。//array.c
struct strem_array + struct strem_value * lenだけメモリを確保
main関数に戻る
先ほど確保したstrm_arrayはav変数が指示、strm_value部分はbufが指示している
strm_str_value関数->strm_ptr_value->strm_str_new関数 //string.c
シングルスレッドモードのときとマルチスレッドモードで文字列確保関数を
呼び分けている。
シングルスレッドモードのときはstr_intern関数でsym_tableにkeyと一緒に文字列を保存
マルチスレッドモードの時はstr_new関数でメモリを確保してstrm_stringを返してmain関数の
buf[]配列に保存している。