[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-6159":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":9,"pushedAt":9,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":15,"starSnapshotCount":15,"syncStatus":33,"lastSyncTime":34,"discoverSource":35},6159,"acwj","DoctorWkt\u002Facwj","DoctorWkt","A Compiler Writing Journey",null,"C",13231,1195,227,22,0,3,10,30,9,83.23,"GNU General Public License v3.0",false,"master",true,[26,27,28,29],"c","compiler","lexical-analysis","parsing","2026-06-12 04:00:27","# A Compiler Writing Journey\n\nIn this Github repository, I'm documenting my journey to write a\nself-compiling compiler for a subset of the C language.\nI'm also writing out the details so that,\nif you want to follow along, there will be an explanation of what\nI did, why, and with some references back to the theory of compilers.\n\nBut not too much theory, I want this to be a practical journey.\n\nHere are the steps I've taken so far:\n\n + [Part  0](00_Introduction\u002FReadme.md):  Introduction to the Journey\n + [Part  1](01_Scanner\u002FReadme.md):       Introduction to Lexical Scanning\n + [Part  2](02_Parser\u002FReadme.md):        Introduction to Parsing\n + [Part  3](03_Precedence\u002FReadme.md):    Operator Precedence\n + [Part  4](04_Assembly\u002FReadme.md):      An Actual Compiler\n + [Part  5](05_Statements\u002FReadme.md):    Statements\n + [Part  6](06_Variables\u002FReadme.md):     Variables\n + [Part  7](07_Comparisons\u002FReadme.md):   Comparison Operators\n + [Part  8](08_If_Statements\u002FReadme.md): If Statements\n + [Part  9](09_While_Loops\u002FReadme.md):   While Loops\n + [Part 10](10_For_Loops\u002FReadme.md):     For Loops\n + [Part 11](11_Functions_pt1\u002FReadme.md): Functions, part 1\n + [Part 12](12_Types_pt1\u002FReadme.md):     Types, part 1\n + [Part 13](13_Functions_pt2\u002FReadme.md): Functions, part 2\n + [Part 14](14_ARM_Platform\u002FReadme.md):  Generating ARM Assembly Code\n + [Part 15](15_Pointers_pt1\u002FReadme.md):  Pointers, part 1\n + [Part 16](16_Global_Vars\u002FReadme.md):   Declaring Global Variables Properly\n + [Part 17](17_Scaling_Offsets\u002FReadme.md): Better Type Checking and Pointer Offsets\n + [Part 18](18_Lvalues_Revisited\u002FReadme.md): Lvalues and Rvalues Revisited\n + [Part 19](19_Arrays_pt1\u002FReadme.md):    Arrays, part 1\n + [Part 20](20_Char_Str_Literals\u002FReadme.md): Character and String Literals\n + [Part 21](21_More_Operators\u002FReadme.md): More Operators\n + [Part 22](22_Design_Locals\u002FReadme.md): Design Ideas for Local Variables and Function Calls\n + [Part 23](23_Local_Variables\u002FReadme.md): Local Variables\n + [Part 24](24_Function_Params\u002FReadme.md): Function Parameters\n + [Part 25](25_Function_Arguments\u002FReadme.md): Function Calls and Arguments\n + [Part 26](26_Prototypes\u002FReadme.md):    Function Prototypes\n + [Part 27](27_Testing_Errors\u002FReadme.md): Regression Testing and a Nice Surprise\n + [Part 28](28_Runtime_Flags\u002FReadme.md): Adding More Run-time Flags\n + [Part 29](29_Refactoring\u002FReadme.md):   A Bit of Refactoring\n + [Part 30](30_Design_Composites\u002FReadme.md): Designing Structs, Unions and Enums\n + [Part 31](31_Struct_Declarations\u002FReadme.md): Implementing Structs, Part 1\n + [Part 32](32_Struct_Access_pt1\u002FReadme.md): Accessing Members in a Struct\n + [Part 33](33_Unions\u002FReadme.md):        Implementing Unions and Member Access\n + [Part 34](34_Enums_and_Typedefs\u002FReadme.md): Enums and Typedefs\n + [Part 35](35_Preprocessor\u002FReadme.md):  The C Pre-Processor\n + [Part 36](36_Break_Continue\u002FReadme.md): `break` and `continue`\n + [Part 37](37_Switch\u002FReadme.md):        Switch Statements\n + [Part 38](38_Dangling_Else\u002FReadme.md): Dangling Else and More\n + [Part 39](39_Var_Initialisation_pt1\u002FReadme.md): Variable Initialisation, part 1\n + [Part 40](40_Var_Initialisation_pt2\u002FReadme.md): Global Variable Initialisation\n + [Part 41](41_Local_Var_Init\u002FReadme.md): Local Variable Initialisation\n + [Part 42](42_Casting\u002FReadme.md):       Type Casting and NULL\n + [Part 43](43_More_Operators\u002FReadme.md): Bugfixes and More Operators\n + [Part 44](44_Fold_Optimisation\u002FReadme.md): Constant Folding\n + [Part 45](45_Globals_Again\u002FReadme.md): Global Variable Declarations, revisited\n + [Part 46](46_Void_Functions\u002FReadme.md): Void Function Parameters and Scanning Changes\n + [Part 47](47_Sizeof\u002FReadme.md):        A Subset of `sizeof`\n + [Part 48](48_Static\u002FReadme.md):        A Subset of `static`\n + [Part 49](49_Ternary\u002FReadme.md):       The Ternary Operator\n + [Part 50](50_Mop_up_pt1\u002FReadme.md):    Mopping Up, part 1\n + [Part 51](51_Arrays_pt2\u002FReadme.md):    Arrays, part 2\n + [Part 52](52_Pointers_pt2\u002FReadme.md):  Pointers, part 2\n + [Part 53](53_Mop_up_pt2\u002FReadme.md):    Mopping Up, part 2\n + [Part 54](54_Reg_Spills\u002FReadme.md):    Spilling Registers\n + [Part 55](55_Lazy_Evaluation\u002FReadme.md): Lazy Evaluation\n + [Part 56](56_Local_Arrays\u002FReadme.md):  Local Arrays\n + [Part 57](57_Mop_up_pt3\u002FReadme.md):    Mopping Up, part 3\n + [Part 58](58_Ptr_Increments\u002FReadme.md): Fixing Pointer Increments\u002FDecrements\n + [Part 59](59_WDIW_pt1\u002FReadme.md):      Why Doesn't It Work, part 1\n + [Part 60](60_TripleTest\u002FReadme.md):    Passing the Triple Test\n + [Part 61](61_What_Next\u002FReadme.md):     What's Next?\n + [Part 62](62_Cleanup\u002FReadme.md):       Code Cleanup\n + [Part 63](63_QBE\u002FReadme.md):           A New Backend using QBE\n + [Part 64](64_6809_Target\u002FReadme.md):   A Backend for the 6809 CPU\n\nI've stopped work on *acwj* and now I'm writing a new language\ncalled [alic](https:\u002F\u002Fgithub.com\u002FDoctorWkt\u002Falic) from scratch. Check it out!\n\n## Copyrights\n\nI have borrowed some of the code, and lots of ideas, from the \n[SubC](http:\u002F\u002Fwww.t3x.org\u002Fsubc\u002F) compiler written by Nils M Holm.\nHis code is in the public domain. I think that my code is substantially\ndifferent enough that I can apply a different license to my code.\n\nUnless otherwise noted,\n\n + all source code and scripts are (c) Warren Toomey under\n   the GPL3 license.\n + all non-source code documents (e.g. English documents,\n   image files) are (c) Warren Toomey under the Creative\n   Commons BY-NC-SA 4.0 license.\n","该项目记录了作者编写一个自编译的C语言子集编译器的过程。它涵盖了从词法分析到生成ARM汇编代码的全过程，包括扫描器、解析器、语义分析及代码生成等核心功能，并逐步实现变量、函数、循环结构等C语言特性。项目以实践为导向，提供了详细的步骤说明和理论背景介绍，适合对编译原理感兴趣的开发者学习使用，尤其是那些希望深入了解如何从零开始构建一个简单编译器的人士。",2,"2026-06-11 03:05:51","top_language"]