{"version":1,"pages":[{"id":"-LjolCAofT66Z2wBRdml","title":"譯者序","pathname":"/compilerbook","siteSpaceId":"sitesp_AK64M","description":""},{"id":"-Ljor5z6841AB7clWPvJ","title":"前言","pathname":"/compilerbook/intoduction","siteSpaceId":"sitesp_AK64M","description":""},{"id":"-Lk2jJb4ChbUAW4G7ysk","title":"符號與規範","pathname":"/compilerbook/intoduction/symbol","siteSpaceId":"sitesp_AK64M","description":"本章內容以原書為準，但章節格式為配合GitBook可能會與本章內容有所出入之處。","breadcrumbs":[{"label":"前言"}]},{"id":"-Lk7P9zWbtZYUfTpRCyp","title":"本書的開發環境","pathname":"/compilerbook/intoduction/environments","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"前言"}]},{"id":"-Lk7wrA5IKoON9-QVrdv","title":"關於作者","pathname":"/compilerbook/intoduction/author","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"前言"}]},{"id":"-Lk7zHOU1g6q04JImZ9T","title":"結束前言之前","pathname":"/compilerbook/intoduction/column","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"前言"}]},{"id":"-Lk82iXhjus9ivDvz8kU","title":"機械語言與組譯器","pathname":"/compilerbook/machine_code_assembler","siteSpaceId":"sitesp_AK64M","description":""},{"id":"-LkNc1chyBIXbFYWYksm","title":"CPU 與記憶體","pathname":"/compilerbook/machine_code_assembler/cpu_memory","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"機械語言與組譯器"}]},{"id":"-LkXnvpiIPge7qzudctE","title":"什麼是組譯器","pathname":"/compilerbook/machine_code_assembler/assembler","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"機械語言與組譯器"}]},{"id":"-LkdnXew7fFtS2apgfOE","title":"C程式和所對應的組合語言","pathname":"/compilerbook/machine_code_assembler/c_assembly","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"機械語言與組譯器"}]},{"id":"-Lkdo4uE_SV8jVk1Ch4T","title":"簡單的範例","pathname":"/compilerbook/machine_code_assembler/c_assembly/kantan_na_rei","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"機械語言與組譯器"},{"label":"C程式和所對應的組合語言"}]},{"id":"-LkdoPy3AJD4Md27c-oV","title":"包含呼叫函式的範例","pathname":"/compilerbook/machine_code_assembler/c_assembly/kansuu_yobidashi","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"機械語言與組譯器"},{"label":"C程式和所對應的組合語言"}]},{"id":"-LkgEhxPLhmYD_lcGDys","title":"本章小結","pathname":"/compilerbook/machine_code_assembler/matome","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"機械語言與組譯器"}]},{"id":"-Ll0TNcAYDFNdo1Lpv0t","title":"創造計算機等級的語言","pathname":"/compilerbook/calculator_level_language","siteSpaceId":"sitesp_AK64M","description":""},{"id":"-Ll0nrGgFbwp2ABG3M2d","title":"第1步：創造能編譯1個整數的語言","pathname":"/compilerbook/calculator_level_language/step1","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-Ll_pIuwUdRX_ihzpyzP","title":"第2步：製作可以算加減法的編譯器","pathname":"/compilerbook/calculator_level_language/step2","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-LlkcdlaummtH968EUIX","title":"第3步：加入標記解析器（tokenizer）","pathname":"/compilerbook/calculator_level_language/step3","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-LmEJeDJvU7rxY-ZAeiY","title":"第4步：改良錯誤訊息","pathname":"/compilerbook/calculator_level_language/step4","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-LmJJd9632QyW0ObmbC8","title":"文法的記法與遞迴下降分析法","pathname":"/compilerbook/calculator_level_language/recursive_descendent_parsing","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-LmcuW_vduEB1Ci5za-g","title":"將文法結構表示為樹（tree）","pathname":"/compilerbook/calculator_level_language/recursive_descendent_parsing/tree_structure","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"文法的記法與遞迴下降分析法"}]},{"id":"-Lmh2MkFlSkHLXD3PDIN","title":"以生成規則定義文法","pathname":"/compilerbook/calculator_level_language/recursive_descendent_parsing/production_rule","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"文法的記法與遞迴下降分析法"}]},{"id":"-Lmn8J7U_DotJYjmxJTM","title":"以 BNF 描述生成規則","pathname":"/compilerbook/calculator_level_language/recursive_descendent_parsing/bnf","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"文法的記法與遞迴下降分析法"}]},{"id":"-LmwRogSvUIGIoB6vds_","title":"簡單的生成規則","pathname":"/compilerbook/calculator_level_language/recursive_descendent_parsing/simaple_production_rule","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"文法的記法與遞迴下降分析法"}]},{"id":"-LnB0v-z707FuxJ90gbM","title":"以生成規則描述運算子的優先順序","pathname":"/compilerbook/calculator_level_language/recursive_descendent_parsing/production_rule_operator_order","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"文法的記法與遞迴下降分析法"}]},{"id":"-LnGFTOmFfOOdnTLY21t","title":"包含遞迴的生成規則","pathname":"/compilerbook/calculator_level_language/recursive_descendent_parsing/recursive_production_rule","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"文法的記法與遞迴下降分析法"}]},{"id":"-LnL6inDLM6N6WBH4ws9","title":"遞迴下降語法分析","pathname":"/compilerbook/calculator_level_language/recursive_descendent_parsing/recursive_descent_syntax_parsing","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"文法的記法與遞迴下降分析法"}]},{"id":"-Lnkzhg5D7refoWP0lWF","title":"堆疊機","pathname":"/compilerbook/calculator_level_language/stack_machine","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-Lnozm8TqAzRZHSZIwUq","title":"堆疊機的概念","pathname":"/compilerbook/calculator_level_language/stack_machine/concept","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"堆疊機"}]},{"id":"-LnuFjDmPwxeJIZgJt28","title":"編譯成堆疊機指令","pathname":"/compilerbook/calculator_level_language/stack_machine/compile_to_stack_machine","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"堆疊機"}]},{"id":"-LnvG-MrhTfOL8hj1C_j","title":"以x86-64實作堆疊機的方法","pathname":"/compilerbook/calculator_level_language/stack_machine/x86-64_stack_machine","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"堆疊機"}]},{"id":"-LoK6vpNb0WBX3gclvso","title":"第5步：製作可進行四則運算的編譯器","pathname":"/compilerbook/calculator_level_language/step5","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-LoU_qpWjqHqoO_dAPKl","title":"第6步：單項加與單項減","pathname":"/compilerbook/calculator_level_language/step6","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-Lp2aD-Oqy4jNf36jkck","title":"第7步：比較運算子","pathname":"/compilerbook/calculator_level_language/step7","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"}]},{"id":"-LpXBwjpTS0OclbkhRmf","title":"修改標記解析器","pathname":"/compilerbook/calculator_level_language/step7/modify_tokenizer","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"第7步：比較運算子"}]},{"id":"-Lpbn_yhbvBj_6vkmf1s","title":"新的文法","pathname":"/compilerbook/calculator_level_language/step7/new_grammer","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"第7步：比較運算子"}]},{"id":"-LpgdOqSK6Z5wGAjLRyu","title":"產生組合語言指令","pathname":"/compilerbook/calculator_level_language/step7/generate_assembly","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"創造計算機等級的語言"},{"label":"第7步：比較運算子"}]},{"id":"-LqibFRoK3wHPBDufdao","title":"分離編譯與連結","pathname":"/compilerbook/separate_compile_linking","siteSpaceId":"sitesp_AK64M","description":""},{"id":"-LrCPNpyupf0kmG8Wpv2","title":"分離編譯","pathname":"/compilerbook/separate_compile_linking/separate_compilation","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"分離編譯與連結"}]},{"id":"-LrHkJ-lnqE74x56wwSw","title":"分離編譯與其必要性","pathname":"/compilerbook/separate_compile_linking/separate_compilation/to_separate_compile","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"分離編譯與連結"},{"label":"分離編譯"}]},{"id":"-LrNoER3v1FNf2nFFtLQ","title":"標頭檔的必要性與其內容","pathname":"/compilerbook/separate_compile_linking/separate_compilation/header_file","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"分離編譯與連結"},{"label":"分離編譯"}]},{"id":"-LrSu-z8cfNqztLMnEaB","title":"連結錯誤","pathname":"/compilerbook/separate_compile_linking/separate_compilation/link_error","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"分離編譯與連結"},{"label":"分離編譯"}]},{"id":"-LrT1Y_ehdBSTpJAOHSu","title":"全域變數的宣告與定義","pathname":"/compilerbook/separate_compile_linking/separate_compilation/global_declare_define","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"分離編譯與連結"},{"label":"分離編譯"}]},{"id":"-LrCPLf6VA3qnuYG6oxK","title":"第8步：分割檔案與修改 Makefile","pathname":"/compilerbook/separate_compile_linking/step8","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"分離編譯與連結"}]},{"id":"-Ls2mWfz20gDnsNfSKgj","title":"分割檔案","pathname":"/compilerbook/separate_compile_linking/step8/split_files","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"分離編譯與連結"},{"label":"第8步：分割檔案與修改 Makefile"}]},{"id":"-Ls2nxifx1wkiCtQyUu3","title":"修改 Makefile","pathname":"/compilerbook/separate_compile_linking/step8/modify_makefile","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"分離編譯與連結"},{"label":"第8步：分割檔案與修改 Makefile"}]},{"id":"-LsLoVgmyVKcZvVWTfJr","title":"函式與區域變數","pathname":"/compilerbook/function_local_variable","siteSpaceId":"sitesp_AK64M","description":""},{"id":"-Ls_aMka2CjHGecO3IlN","title":"第9步：1個字的區域變數","pathname":"/compilerbook/function_local_variable/step9","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"}]},{"id":"-LsoLmHaR6Ad_yDGh2Ph","title":"堆疊上的變數空間","pathname":"/compilerbook/function_local_variable/step9/variable_area_on_stack","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"},{"label":"第9步：1個字的區域變數"}]},{"id":"-Lti144NaHxKzsuM0Zxm","title":"修改標記解析器","pathname":"/compilerbook/function_local_variable/step9/modify_tokenizer","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"},{"label":"第9步：1個字的區域變數"}]},{"id":"-LtxTpbkJaWy5gY5s2E3","title":"修改分析器","pathname":"/compilerbook/function_local_variable/step9/modify_parser","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"},{"label":"第9步：1個字的區域變數"}]},{"id":"-LuVZeSPu19tYVkRNEAA","title":"左邊值與右邊值","pathname":"/compilerbook/function_local_variable/step9/left_value_right_value","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"},{"label":"第9步：1個字的區域變數"}]},{"id":"-LuqQADuoW6g9kjUp-Ue","title":"從任意的記憶體位址取得其值","pathname":"/compilerbook/function_local_variable/step9/load_value_from_any_address","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"},{"label":"第9步：1個字的區域變數"}]},{"id":"-Lv4NOHDZdm5NNEdTFDs","title":"修改指令產生器","pathname":"/compilerbook/function_local_variable/step9/modify_code_generator","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"},{"label":"第9步：1個字的區域變數"}]},{"id":"-Lv4QLc3bqnsVhAJNyYp","title":"修改主函式","pathname":"/compilerbook/function_local_variable/step9/modify_main_function","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"},{"label":"第9步：1個字的區域變數"}]},{"id":"-Lv5-nCvPmjjv13Pwqb3","title":"第10步：複數文字的區域變數","pathname":"/compilerbook/function_local_variable/step10","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"}]},{"id":"-Lx0XJx452Urpf608e86","title":"第11步：return","pathname":"/compilerbook/function_local_variable/step11","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"}]},{"id":"-LxZ6URt7C_WDD7C1FCP","title":"1973年的C編譯器","pathname":"/compilerbook/function_local_variable/c_compiler_in_1973","siteSpaceId":"sitesp_AK64M","description":"","breadcrumbs":[{"label":"函式與區域變數"}]}]}