Copy disabled (too large)
Download .txt
Showing preview only (10,721K chars total). Download the full file to get everything.
Repository: DoctorWkt/acwj
Branch: master
Commit: ba1d3ba77fe8
Files: 9835
Total size: 8.7 MB
Directory structure:
gitextract_us1gy_yo/
├── 00_Introduction/
│ ├── Figs/
│ │ └── parsing_steps.dia
│ └── Readme.md
├── 01_Scanner/
│ ├── Makefile
│ ├── Readme.md
│ ├── data.h
│ ├── decl.h
│ ├── defs.h
│ ├── input01
│ ├── input02
│ ├── input03
│ ├── input04
│ ├── input05
│ ├── main.c
│ └── scan.c
├── 02_Parser/
│ ├── Makefile
│ ├── Readme.md
│ ├── data.h
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── input01
│ ├── input02
│ ├── input03
│ ├── input04
│ ├── input05
│ ├── interp.c
│ ├── main.c
│ ├── scan.c
│ └── tree.c
├── 03_Precedence/
│ ├── Makefile
│ ├── Readme.md
│ ├── data.h
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── expr2.c
│ ├── input01
│ ├── input02
│ ├── input03
│ ├── input04
│ ├── input05
│ ├── interp.c
│ ├── main.c
│ ├── scan.c
│ └── tree.c
├── 04_Assembly/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── input01
│ ├── input02
│ ├── interp.c
│ ├── main.c
│ ├── scan.c
│ └── tree.c
├── 05_Statements/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── input01
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ └── tree.c
├── 06_Variables/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── input01
│ ├── input02
│ ├── input03
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ └── tree.c
├── 07_Comparisons/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── input01
│ ├── input02
│ ├── input03
│ ├── input04
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ └── tree.c
├── 08_If_Statements/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── input01
│ ├── input02
│ ├── input03
│ ├── input04
│ ├── input05
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ └── tree.c
├── 09_While_Loops/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01
│ │ ├── input02
│ │ ├── input03
│ │ ├── input04
│ │ ├── input05
│ │ ├── input06
│ │ ├── mktests
│ │ ├── mktestsn
│ │ ├── out.input01
│ │ ├── out.input02
│ │ ├── out.input03
│ │ ├── out.input04
│ │ ├── out.input05
│ │ ├── out.input06
│ │ ├── runtests
│ │ └── runtestsn
│ └── tree.c
├── 10_For_Loops/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01
│ │ ├── input02
│ │ ├── input03
│ │ ├── input04
│ │ ├── input05
│ │ ├── input06
│ │ ├── input07
│ │ ├── mktests
│ │ ├── mktestsn
│ │ ├── out.input01
│ │ ├── out.input02
│ │ ├── out.input03
│ │ ├── out.input04
│ │ ├── out.input05
│ │ ├── out.input06
│ │ ├── out.input07
│ │ ├── runtests
│ │ └── runtestsn
│ └── tree.c
├── 11_Functions_pt1/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01
│ │ ├── input02
│ │ ├── input03
│ │ ├── input04
│ │ ├── input05
│ │ ├── input06
│ │ ├── input07
│ │ ├── input08
│ │ ├── input09
│ │ ├── mktests
│ │ ├── mktestsn
│ │ ├── out.input01
│ │ ├── out.input02
│ │ ├── out.input03
│ │ ├── out.input04
│ │ ├── out.input05
│ │ ├── out.input06
│ │ ├── out.input07
│ │ ├── out.input08
│ │ ├── out.input09
│ │ ├── runtests
│ │ └── runtestsn
│ └── tree.c
├── 12_Types_pt1/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01
│ │ ├── input02
│ │ ├── input03
│ │ ├── input04
│ │ ├── input05
│ │ ├── input06
│ │ ├── input07
│ │ ├── input08
│ │ ├── input09
│ │ ├── input10
│ │ ├── mktests
│ │ ├── mktestsn
│ │ ├── out.input01
│ │ ├── out.input02
│ │ ├── out.input03
│ │ ├── out.input04
│ │ ├── out.input05
│ │ ├── out.input06
│ │ ├── out.input07
│ │ ├── out.input08
│ │ ├── out.input09
│ │ ├── out.input10
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 13_Functions_pt2/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01
│ │ ├── input02
│ │ ├── input03
│ │ ├── input04
│ │ ├── input05
│ │ ├── input06
│ │ ├── input07
│ │ ├── input08
│ │ ├── input09
│ │ ├── input10
│ │ ├── input11
│ │ ├── input12
│ │ ├── input13
│ │ ├── input14
│ │ ├── mktests
│ │ ├── mktestsn
│ │ ├── out.input01
│ │ ├── out.input02
│ │ ├── out.input03
│ │ ├── out.input04
│ │ ├── out.input05
│ │ ├── out.input06
│ │ ├── out.input07
│ │ ├── out.input08
│ │ ├── out.input09
│ │ ├── out.input10
│ │ ├── out.input11
│ │ ├── out.input12
│ │ ├── out.input13
│ │ ├── out.input14
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 14_ARM_Platform/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01
│ │ ├── input02
│ │ ├── input03
│ │ ├── input04
│ │ ├── input05
│ │ ├── input06
│ │ ├── input07
│ │ ├── input08
│ │ ├── input09
│ │ ├── input10
│ │ ├── input11
│ │ ├── input12
│ │ ├── input13
│ │ ├── input14
│ │ ├── mktests
│ │ ├── mktestsn
│ │ ├── out.input01
│ │ ├── out.input02
│ │ ├── out.input03
│ │ ├── out.input04
│ │ ├── out.input05
│ │ ├── out.input06
│ │ ├── out.input07
│ │ ├── out.input08
│ │ ├── out.input09
│ │ ├── out.input10
│ │ ├── out.input11
│ │ ├── out.input12
│ │ ├── out.input13
│ │ ├── out.input14
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 15_Pointers_pt1/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 16_Global_Vars/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 17_Scaling_Offsets/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 18_Lvalues_Revisited/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 19_Arrays_pt1/
│ ├── Makefile
│ ├── Notes
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 20_Char_Str_Literals/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 21_More_Operators/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 22_Design_Locals/
│ └── Readme.md
├── 23_Local_Variables/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 24_Function_Params/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── input27a.c
│ ├── input27b.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 25_Function_Arguments/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 26_Prototypes/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 27_Testing_Errors/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── lib/
│ │ └── printint.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 28_Runtime_Flags/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 29_Refactoring/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 30_Design_Composites/
│ ├── Figs/
│ │ ├── newsymlists.dia
│ │ └── structunion1.dia
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 31_Struct_Declarations/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 32_Struct_Access_pt1/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 33_Unions/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── input62.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── out.input62.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 34_Enums_and_Typedefs/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── err.input64.c
│ │ ├── err.input65.c
│ │ ├── err.input66.c
│ │ ├── err.input68.c
│ │ ├── err.input69.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── input62.c
│ │ ├── input63.c
│ │ ├── input64.c
│ │ ├── input65.c
│ │ ├── input66.c
│ │ ├── input67.c
│ │ ├── input68.c
│ │ ├── input69.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── out.input62.c
│ │ ├── out.input63.c
│ │ ├── out.input67.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 35_Preprocessor/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ └── stdio.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── err.input64.c
│ │ ├── err.input65.c
│ │ ├── err.input66.c
│ │ ├── err.input68.c
│ │ ├── err.input69.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── input62.c
│ │ ├── input63.c
│ │ ├── input64.c
│ │ ├── input65.c
│ │ ├── input66.c
│ │ ├── input67.c
│ │ ├── input68.c
│ │ ├── input69.c
│ │ ├── input70.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── out.input62.c
│ │ ├── out.input63.c
│ │ ├── out.input67.c
│ │ ├── out.input70.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 36_Break_Continue/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ └── stdio.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── err.input64.c
│ │ ├── err.input65.c
│ │ ├── err.input66.c
│ │ ├── err.input68.c
│ │ ├── err.input69.c
│ │ ├── err.input72.c
│ │ ├── err.input73.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── input62.c
│ │ ├── input63.c
│ │ ├── input64.c
│ │ ├── input65.c
│ │ ├── input66.c
│ │ ├── input67.c
│ │ ├── input68.c
│ │ ├── input69.c
│ │ ├── input70.c
│ │ ├── input71.c
│ │ ├── input72.c
│ │ ├── input73.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── out.input62.c
│ │ ├── out.input63.c
│ │ ├── out.input67.c
│ │ ├── out.input70.c
│ │ ├── out.input71.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 37_Switch/
│ ├── Figs/
│ │ ├── switch_ast.dia
│ │ ├── switch_logic.dia
│ │ └── switch_logic2.dia
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ └── stdio.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── err.input64.c
│ │ ├── err.input65.c
│ │ ├── err.input66.c
│ │ ├── err.input68.c
│ │ ├── err.input69.c
│ │ ├── err.input72.c
│ │ ├── err.input73.c
│ │ ├── err.input75.c
│ │ ├── err.input76.c
│ │ ├── err.input77.c
│ │ ├── err.input78.c
│ │ ├── err.input79.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── input62.c
│ │ ├── input63.c
│ │ ├── input64.c
│ │ ├── input65.c
│ │ ├── input66.c
│ │ ├── input67.c
│ │ ├── input68.c
│ │ ├── input69.c
│ │ ├── input70.c
│ │ ├── input71.c
│ │ ├── input72.c
│ │ ├── input73.c
│ │ ├── input74.c
│ │ ├── input75.c
│ │ ├── input76.c
│ │ ├── input77.c
│ │ ├── input78.c
│ │ ├── input79.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── out.input62.c
│ │ ├── out.input63.c
│ │ ├── out.input67.c
│ │ ├── out.input70.c
│ │ ├── out.input71.c
│ │ ├── out.input74.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 38_Dangling_Else/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ └── stdio.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── err.input64.c
│ │ ├── err.input65.c
│ │ ├── err.input66.c
│ │ ├── err.input68.c
│ │ ├── err.input69.c
│ │ ├── err.input72.c
│ │ ├── err.input73.c
│ │ ├── err.input75.c
│ │ ├── err.input76.c
│ │ ├── err.input77.c
│ │ ├── err.input78.c
│ │ ├── err.input79.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── input62.c
│ │ ├── input63.c
│ │ ├── input64.c
│ │ ├── input65.c
│ │ ├── input66.c
│ │ ├── input67.c
│ │ ├── input68.c
│ │ ├── input69.c
│ │ ├── input70.c
│ │ ├── input71.c
│ │ ├── input72.c
│ │ ├── input73.c
│ │ ├── input74.c
│ │ ├── input75.c
│ │ ├── input76.c
│ │ ├── input77.c
│ │ ├── input78.c
│ │ ├── input79.c
│ │ ├── input80.c
│ │ ├── input81.c
│ │ ├── input82.c
│ │ ├── input83.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── out.input62.c
│ │ ├── out.input63.c
│ │ ├── out.input67.c
│ │ ├── out.input70.c
│ │ ├── out.input71.c
│ │ ├── out.input74.c
│ │ ├── out.input80.c
│ │ ├── out.input81.c
│ │ ├── out.input82.c
│ │ ├── out.input83.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 39_Var_Initialisation_pt1/
│ ├── Figs/
│ │ └── decl_call_graph.dia
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ └── stdio.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── err.input64.c
│ │ ├── err.input65.c
│ │ ├── err.input66.c
│ │ ├── err.input68.c
│ │ ├── err.input69.c
│ │ ├── err.input72.c
│ │ ├── err.input73.c
│ │ ├── err.input75.c
│ │ ├── err.input76.c
│ │ ├── err.input77.c
│ │ ├── err.input78.c
│ │ ├── err.input79.c
│ │ ├── err.input85.c
│ │ ├── err.input86.c
│ │ ├── err.input87.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── input62.c
│ │ ├── input63.c
│ │ ├── input64.c
│ │ ├── input65.c
│ │ ├── input66.c
│ │ ├── input67.c
│ │ ├── input68.c
│ │ ├── input69.c
│ │ ├── input70.c
│ │ ├── input71.c
│ │ ├── input72.c
│ │ ├── input73.c
│ │ ├── input74.c
│ │ ├── input75.c
│ │ ├── input76.c
│ │ ├── input77.c
│ │ ├── input78.c
│ │ ├── input79.c
│ │ ├── input80.c
│ │ ├── input81.c
│ │ ├── input82.c
│ │ ├── input83.c
│ │ ├── input84.c
│ │ ├── input85.c
│ │ ├── input86.c
│ │ ├── input87.c
│ │ ├── input88.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── out.input62.c
│ │ ├── out.input63.c
│ │ ├── out.input67.c
│ │ ├── out.input70.c
│ │ ├── out.input71.c
│ │ ├── out.input74.c
│ │ ├── out.input80.c
│ │ ├── out.input81.c
│ │ ├── out.input82.c
│ │ ├── out.input83.c
│ │ ├── out.input84.c
│ │ ├── out.input88.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 40_Var_Initialisation_pt2/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ └── stdio.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input31.c
│ │ ├── err.input32.c
│ │ ├── err.input33.c
│ │ ├── err.input34.c
│ │ ├── err.input35.c
│ │ ├── err.input36.c
│ │ ├── err.input37.c
│ │ ├── err.input38.c
│ │ ├── err.input39.c
│ │ ├── err.input40.c
│ │ ├── err.input41.c
│ │ ├── err.input42.c
│ │ ├── err.input43.c
│ │ ├── err.input44.c
│ │ ├── err.input45.c
│ │ ├── err.input46.c
│ │ ├── err.input47.c
│ │ ├── err.input48.c
│ │ ├── err.input49.c
│ │ ├── err.input50.c
│ │ ├── err.input51.c
│ │ ├── err.input52.c
│ │ ├── err.input56.c
│ │ ├── err.input57.c
│ │ ├── err.input59.c
│ │ ├── err.input60.c
│ │ ├── err.input61.c
│ │ ├── err.input64.c
│ │ ├── err.input65.c
│ │ ├── err.input66.c
│ │ ├── err.input68.c
│ │ ├── err.input69.c
│ │ ├── err.input72.c
│ │ ├── err.input73.c
│ │ ├── err.input75.c
│ │ ├── err.input76.c
│ │ ├── err.input77.c
│ │ ├── err.input78.c
│ │ ├── err.input79.c
│ │ ├── err.input85.c
│ │ ├── err.input86.c
│ │ ├── err.input87.c
│ │ ├── err.input92.c
│ │ ├── err.input93.c
│ │ ├── err.input94.c
│ │ ├── err.input95.c
│ │ ├── err.input96.c
│ │ ├── err.input97.c
│ │ ├── err.input98.c
│ │ ├── input01.c
│ │ ├── input02.c
│ │ ├── input03.c
│ │ ├── input04.c
│ │ ├── input05.c
│ │ ├── input06.c
│ │ ├── input07.c
│ │ ├── input08.c
│ │ ├── input09.c
│ │ ├── input10.c
│ │ ├── input11.c
│ │ ├── input12.c
│ │ ├── input13.c
│ │ ├── input14.c
│ │ ├── input15.c
│ │ ├── input16.c
│ │ ├── input17.c
│ │ ├── input18.c
│ │ ├── input18a.c
│ │ ├── input19.c
│ │ ├── input20.c
│ │ ├── input21.c
│ │ ├── input22.c
│ │ ├── input23.c
│ │ ├── input24.c
│ │ ├── input25.c
│ │ ├── input26.c
│ │ ├── input27.c
│ │ ├── input28.c
│ │ ├── input29.c
│ │ ├── input30.c
│ │ ├── input31.c
│ │ ├── input32.c
│ │ ├── input33.c
│ │ ├── input34.c
│ │ ├── input35.c
│ │ ├── input36.c
│ │ ├── input37.c
│ │ ├── input38.c
│ │ ├── input39.c
│ │ ├── input40.c
│ │ ├── input41.c
│ │ ├── input42.c
│ │ ├── input43.c
│ │ ├── input44.c
│ │ ├── input45.c
│ │ ├── input46.c
│ │ ├── input47.c
│ │ ├── input48.c
│ │ ├── input49.c
│ │ ├── input50.c
│ │ ├── input51.c
│ │ ├── input52.c
│ │ ├── input53.c
│ │ ├── input54.c
│ │ ├── input55.c
│ │ ├── input56.c
│ │ ├── input57.c
│ │ ├── input58.c
│ │ ├── input59.c
│ │ ├── input60.c
│ │ ├── input61.c
│ │ ├── input62.c
│ │ ├── input63.c
│ │ ├── input64.c
│ │ ├── input65.c
│ │ ├── input66.c
│ │ ├── input67.c
│ │ ├── input68.c
│ │ ├── input69.c
│ │ ├── input70.c
│ │ ├── input71.c
│ │ ├── input72.c
│ │ ├── input73.c
│ │ ├── input74.c
│ │ ├── input75.c
│ │ ├── input76.c
│ │ ├── input77.c
│ │ ├── input78.c
│ │ ├── input79.c
│ │ ├── input80.c
│ │ ├── input81.c
│ │ ├── input82.c
│ │ ├── input83.c
│ │ ├── input84.c
│ │ ├── input85.c
│ │ ├── input86.c
│ │ ├── input87.c
│ │ ├── input88.c
│ │ ├── input89.c
│ │ ├── input90.c
│ │ ├── input91.c
│ │ ├── input92.c
│ │ ├── input93.c
│ │ ├── input94.c
│ │ ├── input95.c
│ │ ├── input96.c
│ │ ├── input97.c
│ │ ├── input98.c
│ │ ├── input99.c
│ │ ├── mktests
│ │ ├── out.input01.c
│ │ ├── out.input02.c
│ │ ├── out.input03.c
│ │ ├── out.input04.c
│ │ ├── out.input05.c
│ │ ├── out.input06.c
│ │ ├── out.input07.c
│ │ ├── out.input08.c
│ │ ├── out.input09.c
│ │ ├── out.input10.c
│ │ ├── out.input11.c
│ │ ├── out.input12.c
│ │ ├── out.input13.c
│ │ ├── out.input14.c
│ │ ├── out.input15.c
│ │ ├── out.input16.c
│ │ ├── out.input17.c
│ │ ├── out.input18.c
│ │ ├── out.input18a.c
│ │ ├── out.input19.c
│ │ ├── out.input20.c
│ │ ├── out.input21.c
│ │ ├── out.input22.c
│ │ ├── out.input23.c
│ │ ├── out.input24.c
│ │ ├── out.input25.c
│ │ ├── out.input26.c
│ │ ├── out.input27.c
│ │ ├── out.input28.c
│ │ ├── out.input29.c
│ │ ├── out.input30.c
│ │ ├── out.input53.c
│ │ ├── out.input54.c
│ │ ├── out.input55.c
│ │ ├── out.input58.c
│ │ ├── out.input62.c
│ │ ├── out.input63.c
│ │ ├── out.input67.c
│ │ ├── out.input70.c
│ │ ├── out.input71.c
│ │ ├── out.input74.c
│ │ ├── out.input80.c
│ │ ├── out.input81.c
│ │ ├── out.input82.c
│ │ ├── out.input83.c
│ │ ├── out.input84.c
│ │ ├── out.input88.c
│ │ ├── out.input89.c
│ │ ├── out.input90.c
│ │ ├── out.input91.c
│ │ ├── out.input99.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 41_Local_Var_Init/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ └── stdio.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 42_Casting/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 43_More_Operators/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 44_Fold_Optimisation/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 45_Globals_Again/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 46_Void_Functions/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 47_Sizeof/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 48_Static/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 49_Ternary/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 50_Mop_up_pt1/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 51_Arrays_pt2/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── err.input124.c
│ │ ├── err.input126.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── input124.c
│ │ ├── input125.c
│ │ ├── input126.c
│ │ ├── input127.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── out.input125.c
│ │ ├── out.input127.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 52_Pointers_pt2/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── err.input124.c
│ │ ├── err.input126.c
│ │ ├── err.input129.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── input124.c
│ │ ├── input125.c
│ │ ├── input126.c
│ │ ├── input127.c
│ │ ├── input128.c
│ │ ├── input129.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── out.input125.c
│ │ ├── out.input127.c
│ │ ├── out.input128.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 53_Mop_up_pt2/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── err.input124.c
│ │ ├── err.input126.c
│ │ ├── err.input129.c
│ │ ├── err.input136.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── input124.c
│ │ ├── input125.c
│ │ ├── input126.c
│ │ ├── input127.c
│ │ ├── input128.c
│ │ ├── input129.c
│ │ ├── input130.c
│ │ ├── input131.c
│ │ ├── input132.c
│ │ ├── input133.c
│ │ ├── input134.c
│ │ ├── input135.c
│ │ ├── input136.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── out.input125.c
│ │ ├── out.input127.c
│ │ ├── out.input128.c
│ │ ├── out.input130.c
│ │ ├── out.input131.c
│ │ ├── out.input132.c
│ │ ├── out.input133.c
│ │ ├── out.input134.c
│ │ ├── out.input135.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 54_Reg_Spills/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── err.input124.c
│ │ ├── err.input126.c
│ │ ├── err.input129.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input034.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input097.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── input124.c
│ │ ├── input125.c
│ │ ├── input126.c
│ │ ├── input127.c
│ │ ├── input128.c
│ │ ├── input129.c
│ │ ├── input130.c
│ │ ├── input131.c
│ │ ├── input132.c
│ │ ├── input133.c
│ │ ├── input134.c
│ │ ├── input135.c
│ │ ├── input136.c
│ │ ├── input137.c
│ │ ├── input138.c
│ │ ├── input139.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── out.input125.c
│ │ ├── out.input127.c
│ │ ├── out.input128.c
│ │ ├── out.input130.c
│ │ ├── out.input131.c
│ │ ├── out.input132.c
│ │ ├── out.input133.c
│ │ ├── out.input134.c
│ │ ├── out.input135.c
│ │ ├── out.input136.c
│ │ ├── out.input137.c
│ │ ├── out.input138.c
│ │ ├── out.input139.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ ├── types.c
│ └── zresults
├── 55_Lazy_Evaluation/
│ └── Readme.md
├── 56_Local_Arrays/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── err.input124.c
│ │ ├── err.input126.c
│ │ ├── err.input129.c
│ │ ├── err.input141.c
│ │ ├── err.input142.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── input124.c
│ │ ├── input125.c
│ │ ├── input126.c
│ │ ├── input127.c
│ │ ├── input128.c
│ │ ├── input129.c
│ │ ├── input130.c
│ │ ├── input131.c
│ │ ├── input132.c
│ │ ├── input133.c
│ │ ├── input134.c
│ │ ├── input135.c
│ │ ├── input136.c
│ │ ├── input137.c
│ │ ├── input138.c
│ │ ├── input139.c
│ │ ├── input140.c
│ │ ├── input141.c
│ │ ├── input142.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── out.input125.c
│ │ ├── out.input127.c
│ │ ├── out.input128.c
│ │ ├── out.input130.c
│ │ ├── out.input131.c
│ │ ├── out.input132.c
│ │ ├── out.input133.c
│ │ ├── out.input134.c
│ │ ├── out.input135.c
│ │ ├── out.input136.c
│ │ ├── out.input137.c
│ │ ├── out.input138.c
│ │ ├── out.input139.c
│ │ ├── out.input140.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 57_Mop_up_pt3/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── err.input124.c
│ │ ├── err.input126.c
│ │ ├── err.input129.c
│ │ ├── err.input141.c
│ │ ├── err.input142.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── input124.c
│ │ ├── input125.c
│ │ ├── input126.c
│ │ ├── input127.c
│ │ ├── input128.c
│ │ ├── input129.c
│ │ ├── input130.c
│ │ ├── input131.c
│ │ ├── input132.c
│ │ ├── input133.c
│ │ ├── input134.c
│ │ ├── input135.c
│ │ ├── input136.c
│ │ ├── input137.c
│ │ ├── input138.c
│ │ ├── input139.c
│ │ ├── input140.c
│ │ ├── input141.c
│ │ ├── input142.c
│ │ ├── input143.c
│ │ ├── input144.c
│ │ ├── input145.c
│ │ ├── mktests
│ │ ├── nasmext.inc
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── out.input125.c
│ │ ├── out.input127.c
│ │ ├── out.input128.c
│ │ ├── out.input130.c
│ │ ├── out.input131.c
│ │ ├── out.input132.c
│ │ ├── out.input133.c
│ │ ├── out.input134.c
│ │ ├── out.input135.c
│ │ ├── out.input136.c
│ │ ├── out.input137.c
│ │ ├── out.input138.c
│ │ ├── out.input139.c
│ │ ├── out.input140.c
│ │ ├── out.input143.c
│ │ ├── out.input144.c
│ │ ├── out.input145.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 58_Ptr_Increments/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── err.input124.c
│ │ ├── err.input126.c
│ │ ├── err.input129.c
│ │ ├── err.input141.c
│ │ ├── err.input142.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── input124.c
│ │ ├── input125.c
│ │ ├── input126.c
│ │ ├── input127.c
│ │ ├── input128.c
│ │ ├── input129.c
│ │ ├── input130.c
│ │ ├── input131.c
│ │ ├── input132.c
│ │ ├── input133.c
│ │ ├── input134.c
│ │ ├── input135.c
│ │ ├── input136.c
│ │ ├── input137.c
│ │ ├── input138.c
│ │ ├── input139.c
│ │ ├── input140.c
│ │ ├── input141.c
│ │ ├── input142.c
│ │ ├── input143.c
│ │ ├── input144.c
│ │ ├── input145.c
│ │ ├── input146.c
│ │ ├── input147.c
│ │ ├── mktests
│ │ ├── nasmext.inc
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── out.input125.c
│ │ ├── out.input127.c
│ │ ├── out.input128.c
│ │ ├── out.input130.c
│ │ ├── out.input131.c
│ │ ├── out.input132.c
│ │ ├── out.input133.c
│ │ ├── out.input134.c
│ │ ├── out.input135.c
│ │ ├── out.input136.c
│ │ ├── out.input137.c
│ │ ├── out.input138.c
│ │ ├── out.input139.c
│ │ ├── out.input140.c
│ │ ├── out.input143.c
│ │ ├── out.input144.c
│ │ ├── out.input145.c
│ │ ├── out.input146.c
│ │ ├── out.input147.c
│ │ ├── runtests
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 59_WDIW_pt1/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├── misc.c
│ ├── opt.c
│ ├── scan.c
│ ├── stmt.c
│ ├── sym.c
│ ├── tests/
│ │ ├── err.input031.c
│ │ ├── err.input032.c
│ │ ├── err.input033.c
│ │ ├── err.input034.c
│ │ ├── err.input035.c
│ │ ├── err.input036.c
│ │ ├── err.input037.c
│ │ ├── err.input038.c
│ │ ├── err.input039.c
│ │ ├── err.input040.c
│ │ ├── err.input041.c
│ │ ├── err.input042.c
│ │ ├── err.input043.c
│ │ ├── err.input044.c
│ │ ├── err.input045.c
│ │ ├── err.input046.c
│ │ ├── err.input047.c
│ │ ├── err.input048.c
│ │ ├── err.input049.c
│ │ ├── err.input050.c
│ │ ├── err.input051.c
│ │ ├── err.input052.c
│ │ ├── err.input056.c
│ │ ├── err.input057.c
│ │ ├── err.input059.c
│ │ ├── err.input060.c
│ │ ├── err.input061.c
│ │ ├── err.input064.c
│ │ ├── err.input065.c
│ │ ├── err.input066.c
│ │ ├── err.input068.c
│ │ ├── err.input069.c
│ │ ├── err.input072.c
│ │ ├── err.input073.c
│ │ ├── err.input075.c
│ │ ├── err.input076.c
│ │ ├── err.input077.c
│ │ ├── err.input078.c
│ │ ├── err.input079.c
│ │ ├── err.input085.c
│ │ ├── err.input086.c
│ │ ├── err.input087.c
│ │ ├── err.input092.c
│ │ ├── err.input093.c
│ │ ├── err.input094.c
│ │ ├── err.input095.c
│ │ ├── err.input096.c
│ │ ├── err.input097.c
│ │ ├── err.input098.c
│ │ ├── err.input102.c
│ │ ├── err.input103.c
│ │ ├── err.input104.c
│ │ ├── err.input105.c
│ │ ├── err.input118.c
│ │ ├── err.input124.c
│ │ ├── err.input126.c
│ │ ├── err.input129.c
│ │ ├── err.input141.c
│ │ ├── err.input142.c
│ │ ├── input001.c
│ │ ├── input002.c
│ │ ├── input003.c
│ │ ├── input004.c
│ │ ├── input005.c
│ │ ├── input006.c
│ │ ├── input007.c
│ │ ├── input008.c
│ │ ├── input009.c
│ │ ├── input010.c
│ │ ├── input011.c
│ │ ├── input012.c
│ │ ├── input013.c
│ │ ├── input014.c
│ │ ├── input015.c
│ │ ├── input016.c
│ │ ├── input017.c
│ │ ├── input018.c
│ │ ├── input018a.c
│ │ ├── input019.c
│ │ ├── input020.c
│ │ ├── input021.c
│ │ ├── input022.c
│ │ ├── input023.c
│ │ ├── input024.c
│ │ ├── input025.c
│ │ ├── input026.c
│ │ ├── input027.c
│ │ ├── input028.c
│ │ ├── input029.c
│ │ ├── input030.c
│ │ ├── input031.c
│ │ ├── input032.c
│ │ ├── input033.c
│ │ ├── input035.c
│ │ ├── input036.c
│ │ ├── input037.c
│ │ ├── input038.c
│ │ ├── input039.c
│ │ ├── input040.c
│ │ ├── input041.c
│ │ ├── input042.c
│ │ ├── input043.c
│ │ ├── input044.c
│ │ ├── input045.c
│ │ ├── input046.c
│ │ ├── input047.c
│ │ ├── input048.c
│ │ ├── input049.c
│ │ ├── input050.c
│ │ ├── input051.c
│ │ ├── input052.c
│ │ ├── input053.c
│ │ ├── input054.c
│ │ ├── input055.c
│ │ ├── input056.c
│ │ ├── input057.c
│ │ ├── input058.c
│ │ ├── input059.c
│ │ ├── input060.c
│ │ ├── input061.c
│ │ ├── input062.c
│ │ ├── input063.c
│ │ ├── input064.c
│ │ ├── input065.c
│ │ ├── input066.c
│ │ ├── input067.c
│ │ ├── input068.c
│ │ ├── input069.c
│ │ ├── input070.c
│ │ ├── input071.c
│ │ ├── input072.c
│ │ ├── input073.c
│ │ ├── input074.c
│ │ ├── input075.c
│ │ ├── input076.c
│ │ ├── input077.c
│ │ ├── input078.c
│ │ ├── input079.c
│ │ ├── input080.c
│ │ ├── input081.c
│ │ ├── input082.c
│ │ ├── input083.c
│ │ ├── input084.c
│ │ ├── input085.c
│ │ ├── input086.c
│ │ ├── input087.c
│ │ ├── input088.c
│ │ ├── input089.c
│ │ ├── input090.c
│ │ ├── input091.c
│ │ ├── input092.c
│ │ ├── input093.c
│ │ ├── input094.c
│ │ ├── input095.c
│ │ ├── input096.c
│ │ ├── input098.c
│ │ ├── input099.c
│ │ ├── input100.c
│ │ ├── input101.c
│ │ ├── input102.c
│ │ ├── input103.c
│ │ ├── input104.c
│ │ ├── input105.c
│ │ ├── input106.c
│ │ ├── input107.c
│ │ ├── input108.c
│ │ ├── input109.c
│ │ ├── input110.c
│ │ ├── input111.c
│ │ ├── input112.c
│ │ ├── input113.c
│ │ ├── input114.c
│ │ ├── input115.c
│ │ ├── input116.c
│ │ ├── input117.c
│ │ ├── input118.c
│ │ ├── input119.c
│ │ ├── input120.c
│ │ ├── input121.c
│ │ ├── input122.c
│ │ ├── input123.c
│ │ ├── input124.c
│ │ ├── input125.c
│ │ ├── input126.c
│ │ ├── input127.c
│ │ ├── input128.c
│ │ ├── input129.c
│ │ ├── input130.c
│ │ ├── input131.c
│ │ ├── input132.c
│ │ ├── input133.c
│ │ ├── input134.c
│ │ ├── input135.c
│ │ ├── input136.c
│ │ ├── input137.c
│ │ ├── input138.c
│ │ ├── input139.c
│ │ ├── input140.c
│ │ ├── input141.c
│ │ ├── input142.c
│ │ ├── input143.c
│ │ ├── input144.c
│ │ ├── input145.c
│ │ ├── input146.c
│ │ ├── input147.c
│ │ ├── input148.c
│ │ ├── mktests
│ │ ├── out.input001.c
│ │ ├── out.input002.c
│ │ ├── out.input003.c
│ │ ├── out.input004.c
│ │ ├── out.input005.c
│ │ ├── out.input006.c
│ │ ├── out.input007.c
│ │ ├── out.input008.c
│ │ ├── out.input009.c
│ │ ├── out.input010.c
│ │ ├── out.input011.c
│ │ ├── out.input012.c
│ │ ├── out.input013.c
│ │ ├── out.input014.c
│ │ ├── out.input015.c
│ │ ├── out.input016.c
│ │ ├── out.input017.c
│ │ ├── out.input018.c
│ │ ├── out.input018a.c
│ │ ├── out.input019.c
│ │ ├── out.input020.c
│ │ ├── out.input021.c
│ │ ├── out.input022.c
│ │ ├── out.input023.c
│ │ ├── out.input024.c
│ │ ├── out.input025.c
│ │ ├── out.input026.c
│ │ ├── out.input027.c
│ │ ├── out.input028.c
│ │ ├── out.input029.c
│ │ ├── out.input030.c
│ │ ├── out.input053.c
│ │ ├── out.input054.c
│ │ ├── out.input055.c
│ │ ├── out.input058.c
│ │ ├── out.input062.c
│ │ ├── out.input063.c
│ │ ├── out.input067.c
│ │ ├── out.input070.c
│ │ ├── out.input071.c
│ │ ├── out.input074.c
│ │ ├── out.input080.c
│ │ ├── out.input081.c
│ │ ├── out.input082.c
│ │ ├── out.input083.c
│ │ ├── out.input084.c
│ │ ├── out.input088.c
│ │ ├── out.input089.c
│ │ ├── out.input090.c
│ │ ├── out.input091.c
│ │ ├── out.input099.c
│ │ ├── out.input100.c
│ │ ├── out.input101.c
│ │ ├── out.input106.c
│ │ ├── out.input107.c
│ │ ├── out.input108.c
│ │ ├── out.input109.c
│ │ ├── out.input110.c
│ │ ├── out.input111.c
│ │ ├── out.input112.c
│ │ ├── out.input113.c
│ │ ├── out.input114.c
│ │ ├── out.input115.c
│ │ ├── out.input116.c
│ │ ├── out.input117.c
│ │ ├── out.input119.c
│ │ ├── out.input120.c
│ │ ├── out.input121.c
│ │ ├── out.input122.c
│ │ ├── out.input123.c
│ │ ├── out.input125.c
│ │ ├── out.input127.c
│ │ ├── out.input128.c
│ │ ├── out.input130.c
│ │ ├── out.input131.c
│ │ ├── out.input132.c
│ │ ├── out.input133.c
│ │ ├── out.input134.c
│ │ ├── out.input135.c
│ │ ├── out.input136.c
│ │ ├── out.input137.c
│ │ ├── out.input138.c
│ │ ├── out.input139.c
│ │ ├── out.input140.c
│ │ ├── out.input143.c
│ │ ├── out.input144.c
│ │ ├── out.input145.c
│ │ ├── out.input146.c
│ │ ├── out.input147.c
│ │ ├── out.input148.c
│ │ ├── runtests
│ │ ├── runtests0
│ │ └── runtestsn
│ ├── tree.c
│ └── types.c
├── 60_TripleTest/
│ ├── Makefile
│ ├── Readme.md
│ ├── cg.c
│ ├── cg_arm.c
│ ├── cgn.c
│ ├── data.h
│ ├── decl.c
│ ├── decl.h
│ ├── defs.h
│ ├── expr.c
│ ├── gen.c
│ ├── include/
│ │ ├── ctype.h
│ │ ├── errno.h
│ │ ├── fcntl.h
│ │ ├── stddef.h
│ │ ├── stdio.h
│ │ ├── stdlib.h
│ │ ├── string.h
│ │ └── unistd.h
│ ├── main.c
│ ├──
================================================
FILE CONTENTS
================================================
================================================
FILE: 00_Introduction/Readme.md
================================================
# Part 0: Introduction
I've decided to go on a compiler writing journey. In the past I've written some
[assemblers](https://github.com/DoctorWkt/pdp7-unix/blob/master/tools/as7), and
I've written a [simple compiler](https://github.com/DoctorWkt/h-compiler)
for a typeless language. But I've never written a compiler that can compile
itself. So that's where I'm headed on this journey.
As part of the process, I'm going to write up my work so that others can
follow along. This will also help me to clarify my thoughts and ideas.
Hopefully you, and I, will find this useful!
## Goals of the Journey
Here are my goals, and non-goals, for the journey:
+ To write a self-compiling compiler. I think that if the compiler can
compile itself, it gets to call itself a *real* compiler.
+ To target at least one real hardware platform. I've seen a few compilers
that generate code for hypothetical machines. I want my compiler to
work on real hardware. Also, if possible, I want to write the compiler
so that it can support multiple backends for different hardware platforms.
+ Practical before research. There's a whole lot of research in the area of
compilers. I want to start from absolute zero on this journey, so I'll
tend to go for a practical approach and not a theory-heavy approach. That
said, there will be times when I'll need to introduce (and implement) some
theory-based stuff.
+ Follow the KISS principle: keep it simple, stupid! I'm definitely going to
be using Ken Thompson's principle here: "When in doubt, use brute force."
+ Take a lot of small steps to reach the final goal. I'll break the journey
up into a lot of simple steps instead of taking large leaps. This will
make each new addition to the compiler a bite-sized and easily digestible
thing.
## Target Language
The choice of a target language is difficult. If I choose a high-level
language like Python, Go etc., then I'll have to implement a whole pile
of libraries and classes as they are built-in to the language.
I could write a compiler for a language like Lisp, but these can be
[done easily](ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-039.pdf).
Instead, I've fallen back on the old standby and I'm going to write a
compiler for a subset of C, enough to allow the compiler to compile
itself.
C is just a step up from assembly language (for some subset of C, not
[C18](https://en.wikipedia.org/wiki/C18_(C_standard_revision))), and this
will help make the task of compiling the C code down to assembly somewhat
easier. Oh, and I also like C.
## The Basics of a Compiler's Job
The job of a compiler is to translate input in one language (usually
a high-level language) into a different output language (usually a
lower-level language than the input). The main steps are:

+ Do [lexical analysis](https://en.wikipedia.org/wiki/Lexical_analysis)
to recognise the lexical elements. In several languages, `=` is different
to `==`, so you can't just read a single `=`. We call these lexical
elements *tokens*.
+ [Parse](https://en.wikipedia.org/wiki/Parsing) the input, i.e. recognise
the syntax and structural elements of the input and ensure that they
conform to the *grammar* of the language. For example, your language
might have this decision-making
structure:
```
if (x < 23) {
print("x is smaller than 23\n");
}
```
> but in another language you might write:
```
if (x < 23):
print("x is smaller than 23\n")
```
> This is also the place where the compiler can detect syntax errors, like if
the semicolon was missing on the end of the first *print* statement.
+ Do [semantic analysis](https://en.wikipedia.org/wiki/Semantic_analysis_(compilers))
of the input, i.e. understand the meaning of the input. This is actually different
from recognising the syntax and structure. For example, in English, a
sentence might have the form `<subject> <verb> <adjective> <object>`.
The following two sentences have the same structure, but completely
different meaning:
```
David ate lovely bananas.
Jennifer hates green tomatoes.
```
+ [Translate](https://en.wikipedia.org/wiki/Code_generation_(compiler))
the meaning of the input into a different language. Here we
convert the input, parts at a time, into a lower-level language.
## Resources
There's a lot of compiler resources out on the Internet. Here are the ones
I'll be looking at.
### Learning Resources
If you want to start with some books, papers and tools on compilers,
I'd highly recommend this list:
+ [Curated list of awesome resources on Compilers, Interpreters and Runtimes](https://github.com/aalhour/awesome-compilers) by Ahmad Alhour
### Existing Compilers
While I'm going to build my own compiler, I plan on looking at other compilers
for ideas and probably also borrow some of their code. Here are the ones
I'm looking at:
+ [SubC](http://www.t3x.org/subc/) by Nils M Holm
+ [Swieros C Compiler](https://github.com/rswier/swieros/blob/master/root/bin/c.c) by Robert Swierczek
+ [fbcc](https://github.com/DoctorWkt/fbcc) by Fabrice Bellard
+ [tcc](https://bellard.org/tcc/), also by Fabrice Bellard and others
+ [catc](https://github.com/yui0/catc) by Yuichiro Nakada
+ [amacc](https://github.com/jserv/amacc) by Jim Huang
+ [Small C](https://en.wikipedia.org/wiki/Small-C) by Ron Cain,
James E. Hendrix, derivatives by others
In particular, I'll be using a lot of the ideas, and some of the code,
from the SubC compiler.
## Setting Up the Development Environment
Assuming that you want to come along on this journey, here's what you'll
need. I'm going to use a Linux development environment, so download and
set up your favourite Linux system: I'm using Lubuntu 18.04.
I'm going to target two hardware platforms: Intel x86-64 and 32-bit ARM.
I'll use a PC running Lubuntu 18.04 as the Intel target, and a Raspberry
Pi running Raspbian as the ARM target.
On the Intel platform, we are going to need an existing C compiler.
So, install this package (I give the Ubuntu/Debian commands):
```
$ sudo apt-get install build-essential
```
If there are any more tools required for a vanilla Linux
system, let me know.
Finally, clone a copy of this Github repository.
## The Next Step
In the next part of our compiler writing journey, we will start with
the code to scan our input file and find the *tokens* that are the
lexical elements of our language. [Next step](../01_Scanner/Readme.md)
================================================
FILE: 01_Scanner/Makefile
================================================
scanner: main.c scan.c
cc -o scanner -g main.c scan.c
clean:
rm -f scanner *.o
================================================
FILE: 01_Scanner/Readme.md
================================================
# Part 1: Introduction to Lexical Scanning
We start our compiler writing journey with a simple lexical scanner.
As I mentioned in the previous part, the job of the scanner
is to identify the lexical elements, or *tokens*, in the input language.
We will start with a language that has only five lexical elements:
+ the four basic maths operators: `*`, `/`, `+` and `-`
+ decimal whole numbers which have 1 or more digits `0` .. `9`
Each token that we scan is going to be stored in this structure
(from `defs.h`):
```c
// Token structure
struct token {
int token;
int intvalue;
};
```
where the `token` field can be one of these values (from `defs.h`):
```c
// Tokens
enum {
T_PLUS, T_MINUS, T_STAR, T_SLASH, T_INTLIT
};
```
When the token is a `T_INTLIT` (i.e. an integer literal), the `intvalue`
field will hold the value of the integer that we scanned in.
## Functions in `scan.c`
The `scan.c` file holds the functions of our lexical scanner. We are going
to read in one character at a time from our input file. However, there will
be times when we need to "put back" a character if we have read too far
ahead in the input stream. We also want to track what line we are currently
on so that we can print the line number in our debug messages. All of this
is done by the `next()` function:
```c
// Get the next character from the input file.
static int next(void) {
int c;
if (Putback) { // Use the character put
c = Putback; // back if there is one
Putback = 0;
return c;
}
c = fgetc(Infile); // Read from input file
if ('\n' == c)
Line++; // Increment line count
return c;
}
```
The `Putback` and `Line` variables are defined in `data.h` along with
our input file pointer:
```c
extern_ int Line;
extern_ int Putback;
extern_ FILE *Infile;
```
All C files will include this where `extern_` is replaced with `extern`.
But `main.c` will remove the `extern_`; hence, these variables will
"belong" to `main.c`.
Finally, how do we put a character back into the input stream? Thus:
```c
// Put back an unwanted character
static void putback(int c) {
Putback = c;
}
```
## Ignoring Whitespace
We need a function that reads and silently skips whitespace characters
until it gets a non-whitespace character, and returns it. Thus:
```c
// Skip past input that we don't need to deal with,
// i.e. whitespace, newlines. Return the first
// character we do need to deal with.
static int skip(void) {
int c;
c = next();
while (' ' == c || '\t' == c || '\n' == c || '\r' == c || '\f' == c) {
c = next();
}
return (c);
}
```
## Scanning Tokens: `scan()`
So now we can read characters in while skipping whitespace; we can also
put back a character if we read one character too far ahead. We can
now write our first lexical scanner:
```c
// Scan and return the next token found in the input.
// Return 1 if token valid, 0 if no tokens left.
int scan(struct token *t) {
int c;
// Skip whitespace
c = skip();
// Determine the token based on
// the input character
switch (c) {
case EOF:
return (0);
case '+':
t->token = T_PLUS;
break;
case '-':
t->token = T_MINUS;
break;
case '*':
t->token = T_STAR;
break;
case '/':
t->token = T_SLASH;
break;
default:
// More here soon
}
// We found a token
return (1);
}
```
That's it for the simple one-character tokens: for each recognised
character, turn it into a token. You may ask: why not just put
the recognised character into the `struct token`? The answer is that later
we will need to recognise multi-character tokens such as `==` and keywords
like `if` and `while`. So it will make life easier to have an enumerated
list of token values.
## Integer Literal Values
In fact, we already have to face this situation as we also need to
recognise integer literal values like `3827` and `87731`. Here is the
missing `default` code from the `switch` statement:
```c
default:
// If it's a digit, scan the
// literal integer value in
if (isdigit(c)) {
t->intvalue = scanint(c);
t->token = T_INTLIT;
break;
}
printf("Unrecognised character %c on line %d\n", c, Line);
exit(1);
```
Once we hit a decimal digit character, we call the helper function `scanint()`
with this first character. It will return the scanned integer value. To
do this, it has to read each character in turn, check that it's a
legitimate digit, and build up the final number. Here is the code:
```c
// Scan and return an integer literal
// value from the input file.
static int scanint(int c) {
int k, val = 0;
// Convert each character into an int value
while ((k = chrpos("0123456789", c)) >= 0) {
val = val * 10 + k;
c = next();
}
// We hit a non-integer character, put it back.
putback(c);
return val;
}
```
We start with a zero `val` value. Each time we get a character
in the set `0` to `9` we convert this to an `int` value with
`chrpos()`. We make `val` 10 times bigger and then add this new
digit to it.
For example, if we have the characters `3`, `2`, `8`, we do:
+ `val= 0 * 10 + 3`, i.e. 3
+ `val= 3 * 10 + 2`, i.e. 32
+ `val= 32 * 10 + 8`, i.e. 328
Right at the end, did you notice the call to `putback(c)`?
We found a character that's not a decimal digit at this point.
We can't simply discard it, but luckily we can put it back
in the input stream to be consumed later.
You may also ask at this point: why not simply subtract the ASCII value of
'0' from `c` to make it an integer? The answer is that, later on, we will
be able to do `chrpos("0123456789abcdef")` to convert hexadecimal digits
as well.
Here's the code for `chrpos()`:
```c
// Return the position of character c
// in string s, or -1 if c not found
static int chrpos(char *s, int c) {
char *p;
p = strchr(s, c);
return (p ? p - s : -1);
}
```
And that's it for the lexical scanner code in `scan.c` for now.
## Putting the Scanner to Work
The code in `main.c` puts the above scanner to work. The `main()`
function opens up a file and then scans it for tokens:
```c
void main(int argc, char *argv[]) {
...
init();
...
Infile = fopen(argv[1], "r");
...
scanfile();
exit(0);
}
```
And `scanfile()` loops while there is a new token and prints out the
details of the token:
```c
// List of printable tokens
char *tokstr[] = { "+", "-", "*", "/", "intlit" };
// Loop scanning in all the tokens in the input file.
// Print out details of each token found.
static void scanfile() {
struct token T;
while (scan(&T)) {
printf("Token %s", tokstr[T.token]);
if (T.token == T_INTLIT)
printf(", value %d", T.intvalue);
printf("\n");
}
}
```
## Some Example Input Files
I've provided some example input files so you can see what tokens
the scanner finds in each file, and what input files the scanner rejects.
```
$ make
cc -o scanner -g main.c scan.c
$ cat input01
2 + 3 * 5 - 8 / 3
$ ./scanner input01
Token intlit, value 2
Token +
Token intlit, value 3
Token *
Token intlit, value 5
Token -
Token intlit, value 8
Token /
Token intlit, value 3
$ cat input04
23 +
18 -
45.6 * 2
/ 18
$ ./scanner input04
Token intlit, value 23
Token +
Token intlit, value 18
Token -
Token intlit, value 45
Unrecognised character . on line 3
```
## Conclusion and What's Next
We've started small and we have a simple lexical scanner that recognises
the four main maths operators and also integer literal values. We saw
that we needed to skip whitespace and put back characters if we read
too far into the input.
Single character tokens are easy to scan, but multi-character tokens are
a bit harder. But at the end, the `scan()` function returns the next token
from the input file in a `struct token` variable:
```c
struct token {
int token;
int intvalue;
};
```
In the next part of our compiler writing journey, we will build
a recursive descent parser to interpret the grammar of our input
files, and calculate & print out the final value for each file. [Next step](../02_Parser/Readme.md)
================================================
FILE: 01_Scanner/data.h
================================================
#ifndef extern_
#define extern_ extern
#endif
// Global variables
// Copyright (c) 2019 Warren Toomey, GPL3
// Global variables
// Copyright (c) 2019 Warren Toomey, GPL3
extern_ int Line;
extern_ int Putback;
extern_ FILE *Infile;
================================================
FILE: 01_Scanner/decl.h
================================================
// Function prototypes for all compiler files
// Copyright (c) 2019 Warren Toomey, GPL3
int scan(struct token *t);
================================================
FILE: 01_Scanner/defs.h
================================================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Structure and enum definitions
// Copyright (c) 2019 Warren Toomey, GPL3
// Structure and enum definitions
// Copyright (c) 2019 Warren Toomey, GPL3
// Tokens
enum {
T_PLUS, T_MINUS, T_STAR, T_SLASH, T_INTLIT
};
// Token structure
struct token {
int token;
int intvalue;
};
================================================
FILE: 01_Scanner/input01
================================================
2 + 3 * 5 - 8 / 3
================================================
FILE: 01_Scanner/input02
================================================
13 -6+ 4*
5
+
08 / 3
================================================
FILE: 01_Scanner/input03
================================================
12 34 + -56 * / - - 8 + * 2
================================================
FILE: 01_Scanner/input04
================================================
23 +
18 -
45.6 * 2
/ 18
================================================
FILE: 01_Scanner/input05
================================================
23 * 456abcdefg
================================================
FILE: 01_Scanner/main.c
================================================
#include "defs.h"
#define extern_
#include "data.h"
#undef extern_
#include "decl.h"
#include <errno.h>
// Compiler setup and top-level execution
// Copyright (c) 2019 Warren Toomey, GPL3
// Compiler setup and top-level execution
// Copyright (c) 2019 Warren Toomey, GPL3
// Initialise global variables
static void init() {
Line = 1;
Putback = '\n';
}
// Print out a usage if started incorrectly
static void usage(char *prog) {
fprintf(stderr, "Usage: %s infile\n", prog);
exit(1);
}
// List of printable tokens
char *tokstr[] = { "+", "-", "*", "/", "intlit" };
// Loop scanning in all the tokens in the input file.
// Print out details of each token found.
static void scanfile() {
struct token T;
while (scan(&T)) {
printf("Token %s", tokstr[T.token]);
if (T.token == T_INTLIT)
printf(", value %d", T.intvalue);
printf("\n");
}
}
// Main program: check arguments and print a usage
// if we don't have an argument. Open up the input
// file and call scanfile() to scan the tokens in it.
void main(int argc, char *argv[]) {
if (argc != 2)
usage(argv[0]);
init();
if ((Infile = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Unable to open %s: %s\n", argv[1], strerror(errno));
exit(1);
}
scanfile();
exit(0);
}
================================================
FILE: 01_Scanner/scan.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Lexical scanning
// Copyright (c) 2019 Warren Toomey, GPL3
// Lexical scanning
// Copyright (c) 2019 Warren Toomey, GPL3
// Return the position of character c
// in string s, or -1 if c not found
static int chrpos(char *s, int c) {
char *p;
p = strchr(s, c);
return (p ? p - s : -1);
}
// Get the next character from the input file.
static int next(void) {
int c;
if (Putback) { // Use the character put
c = Putback; // back if there is one
Putback = 0;
return c;
}
c = fgetc(Infile); // Read from input file
if ('\n' == c)
Line++; // Increment line count
return c;
}
// Put back an unwanted character
static void putback(int c) {
Putback = c;
}
// Skip past input that we don't need to deal with,
// i.e. whitespace, newlines. Return the first
// character we do need to deal with.
static int skip(void) {
int c;
c = next();
while (' ' == c || '\t' == c || '\n' == c || '\r' == c || '\f' == c) {
c = next();
}
return (c);
}
// Scan and return an integer literal
// value from the input file.
static int scanint(int c) {
int k, val = 0;
// Convert each character into an int value
while ((k = chrpos("0123456789", c)) >= 0) {
val = val * 10 + k;
c = next();
}
// We hit a non-integer character, put it back.
putback(c);
return val;
}
// Scan and return the next token found in the input.
// Return 1 if token valid, 0 if no tokens left.
int scan(struct token *t) {
int c;
// Skip whitespace
c = skip();
// Determine the token based on
// the input character
switch (c) {
case EOF:
return (0);
case '+':
t->token = T_PLUS;
break;
case '-':
t->token = T_MINUS;
break;
case '*':
t->token = T_STAR;
break;
case '/':
t->token = T_SLASH;
break;
default:
// If it's a digit, scan the
// literal integer value in
if (isdigit(c)) {
t->intvalue = scanint(c);
t->token = T_INTLIT;
break;
}
printf("Unrecognised character %c on line %d\n", c, Line);
exit(1);
}
// We found a token
return (1);
}
================================================
FILE: 02_Parser/Makefile
================================================
parser: expr.c interp.c main.c scan.c tree.c
cc -o parser -g expr.c interp.c main.c scan.c tree.c
clean:
rm -f parser *.o
================================================
FILE: 02_Parser/Readme.md
================================================
# Part 2: Introduction to Parsing
In this part of our compiler writing journey, I'm going to introduce the
basics of a parser. As I mentioned in the first part, the job of the parser
is to recognise the syntax and structural elements of the input and ensure
that they conform to the *grammar* of the language.
We already have several language elements that we can scan in, i.e. our tokens:
+ the four basic maths operators: `*`, `/`, `+` and `-`
+ decimal whole numbers which have 1 or more digits `0` .. `9`
Now let's define a grammar for the language that our parser will recognise.
## BNF: Backus-Naur Form
You will come across the use of
[BNF ](https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form)
at some point if you get into dealing
with computer languages. I will just introduce enough of the BNF syntax
here to express the grammar we want to recognise.
We want a grammar to express maths expressions with whole numbers. Here is
the BNF description of the grammar:
```
expression: number
| expression '*' expression
| expression '/' expression
| expression '+' expression
| expression '-' expression
;
number: T_INTLIT
;
```
The vertical bars separate options in the grammar, so the above says:
+ An expression could be just a number, or
+ An expression is two expressions separated by a '*' token, or
+ An expression is two expressions separated by a '/' token, or
+ An expression is two expressions separated by a '+' token, or
+ An expression is two expressions separated by a '-' token
+ A number is always a T_INTLIT token
It should be pretty obvious that the BNF definition of the grammar is
*recursive*: an expression is defined by referencing other expressions.
But there is a way to *bottom-out" the recursion: when an expression
turns out to be a number, this is always a T_INTLIT token and thus
not recursive.
In BNF, we say that "expression" and "number" are *non-terminal* symbols, as
they are produced by rules in the grammar. However, T_INTLIT is a *terminal*
symbol as it is not defined by any rule. Instead, it is an already-recognised
token in the language. Similarly, the four maths operator tokens are
terminal symbols.
## Recursive Descent Parsing
Given that the grammar for our language is recursive, it makes sense for
us to try and parse it recursively. What we need to do is to read in a
token, then *look ahead* to the next token. Based on what the next token
is, we can then decide what path we need to take to parse the input.
This may require us to recursively call a function that has already been
called.
In our case, the first token in any expression will be a number and this
may be followed by maths operator. After that there may only
be a single number, or there may be the start of a whole new expression.
How can we parse this recursively?
We can write pseudo-code that looks like this:
```
function expression() {
Scan and check the first token is a number. Error if it's not
Get the next token
If we have reached the end of the input, return, i.e. base case
Otherwise, call expression()
}
```
Let's run this function on the input `2 + 3 - 5 T_EOF` where `T_EOF`
is a token that reflects the end of the input. I will number each
call to `expression()`.
```
expression0:
Scan in the 2, it's a number
Get next token, +, which isn't T_EOF
Call expression()
expression1:
Scan in the 3, it's a number
Get next token, -, which isn't T_EOF
Call expression()
expression2:
Scan in the 5, it's a number
Get next token, T_EOF, so return from expression2
return from expression1
return from expression0
```
Yes, the function was able to recursively parse the input
`2 + 3 - 5 T_EOF`.
Of course, we haven't done anything with the
input, but that isn't the job of the parser. The parser's job is
to *recognise* the input, and warn of any syntax errors. Someone
else is going to do the *semantic analysis* of the input, i.e. to
understand and perform the meaning of this input.
> Later on, you will see that this isn't actually true. It often makes
sense to intertwine the syntax analysis and semantic analysis.
## Abstract Syntax Trees
To do the semantic analysis, we need code that either interprets
the recognised input, or translates it to another format, e.g.
assembly code. In this part of the journey, we will build an
interpreter for the input. But to get there, we are first going to
convert the input into an
[abstract syntax tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree),
also known as an AST.
I highly recommend you read this short explanation of ASTs:
+ [Leveling Up One’s Parsing Game With ASTs](https://medium.com/basecs/leveling-up-ones-parsing-game-with-asts-d7a6fc2400ff)
by Vaidehi Joshi
It's well written and really help to explain the purpose and structure of ASTs.
Don't worry, I'll be here when you get back.
The structure of each node in the AST that we will build is described in
`defs.h`:
```c
// AST node types
enum {
A_ADD, A_SUBTRACT, A_MULTIPLY, A_DIVIDE, A_INTLIT
};
// Abstract Syntax Tree structure
struct ASTnode {
int op; // "Operation" to be performed on this tree
struct ASTnode *left; // Left and right child trees
struct ASTnode *right;
int intvalue; // For A_INTLIT, the integer value
};
```
Some AST nodes, like those with `op` values `A_ADD` and `A_SUBTRACT`
have two child ASTs that are pointed to by `left` and `right`. Later on,
we will add or subtract the values of the sub-trees.
Alternatively, an AST node with the `op` value A_INTLIT represents
an integer value. It has no sub-tree children, just a value in the
`intvalue` field.
## Building AST Nodes and Trees
The code in `tree.c` has the functions to build ASTs. The most
general function, `mkastnode()`, takes values for all four
fields in an AST node. It allocates the node, populates the field
values and returns a pointer to the node:
```c
// Build and return a generic AST node
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue) {
struct ASTnode *n;
// Malloc a new ASTnode
n = (struct ASTnode *) malloc(sizeof(struct ASTnode));
if (n == NULL) {
fprintf(stderr, "Unable to malloc in mkastnode()\n");
exit(1);
}
// Copy in the field values and return it
n->op = op;
n->left = left;
n->right = right;
n->intvalue = intvalue;
return (n);
}
```
Given this, we can write more specific functions that make a leaf AST
node (i.e. one with no children), and make an AST node with a single child:
```c
// Make an AST leaf node
struct ASTnode *mkastleaf(int op, int intvalue) {
return (mkastnode(op, NULL, NULL, intvalue));
}
// Make a unary AST node: only one child
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue) {
return (mkastnode(op, left, NULL, intvalue));
```
## Purpose of the AST
We are going to use an AST to store each expression that we recognise
so that, later on, we can traverse it recursively to calculate the
final value of the expression. We do want to deal with the precedence of the
maths operators. Here is an example.
Consider the expression `2 * 3 + 4 * 5`. Now, multiplication has higher
precedence that addition. Therefore, we want to *bind* the multiplication
operands together and perform these operations before we do the addition.
If we generated the AST tree to look like this:
```
+
/ \
/ \
/ \
* *
/ \ / \
2 3 4 5
```
then, when traversing the tree, we would perform `2*3` first, then `4*5`.
Once we have these results, we can then pass them up to the root of the
tree to perform the addition.
## A Naive Expression Parser
Now, we could re-use the token values from our scanner as the AST node
operation values, but I like to keep the concept of tokens and AST nodes
separate. So, to start with, I'm going to have a function to map
the token values into AST node operation values. This, along with the
rest of the parser, is in `expr.c`:
```c
// Convert a token into an AST operation.
int arithop(int tok) {
switch (tok) {
case T_PLUS:
return (A_ADD);
case T_MINUS:
return (A_SUBTRACT);
case T_STAR:
return (A_MULTIPLY);
case T_SLASH:
return (A_DIVIDE);
default:
fprintf(stderr, "unknown token in arithop() on line %d\n", Line);
exit(1);
}
}
```
The default statement in the switch statement fires when we can't convert
the given token into an AST node type. It's going to form part of the
syntax checking in our parser.
We need a function to check that the next token is an integer literal,
and to build an AST node to hold the literal value. Here it is:
```c
// Parse a primary factor and return an
// AST node representing it.
static struct ASTnode *primary(void) {
struct ASTnode *n;
// For an INTLIT token, make a leaf AST node for it
// and scan in the next token. Otherwise, a syntax error
// for any other token type.
switch (Token.token) {
case T_INTLIT:
n = mkastleaf(A_INTLIT, Token.intvalue);
scan(&Token);
return (n);
default:
fprintf(stderr, "syntax error on line %d\n", Line);
exit(1);
}
}
```
This assumes that there is a global variable `Token`, and that it
already has the most recent token scanned in from the input. In
`data.h`:
```c
extern_ struct token Token;
```
and in `main()`:
```c
scan(&Token); // Get the first token from the input
n = binexpr(); // Parse the expression in the file
```
Now we can write the code for the parser:
```c
// Return an AST tree whose root is a binary operator
struct ASTnode *binexpr(void) {
struct ASTnode *n, *left, *right;
int nodetype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If no tokens left, return just the left node
if (Token.token == T_EOF)
return (left);
// Convert the token into a node type
nodetype = arithop(Token.token);
// Get the next token in
scan(&Token);
// Recursively get the right-hand tree
right = binexpr();
// Now build a tree with both sub-trees
n = mkastnode(nodetype, left, right, 0);
return (n);
}
```
Notice that nowhere in this naive parser code is there anything to
deal with different operator precedence. As it stands, the code treats
all operators as having equal precedence. If you follow the code as
it parses the expression `2 * 3 + 4 * 5`, you will see that it
builds this AST:
```
*
/ \
2 +
/ \
3 *
/ \
4 5
```
This is definitely not correct. It will multiply `4*5` to get 20,
then do `3+20` to get 23 instead of doing `2*3` to get 6.
So why did I do this? I wanted to show you that writing a simple parser
is easy, but getting it to also do the semantic analysis is harder.
## Interpreting the Tree
Now that we have our (incorrect) AST tree, let's write some code to
interpret it. Again, we are going to write recursive code to traverse
the tree. Here's the pseudo-code:
```
interpretTree:
First, interpret the left-hand sub-tree and get its value
Then, interpret the right-hand sub-tree and get its value
Perform the operation in the node at the root of our tree
on the two sub-tree values, and return this value
```
Going back to the correct AST tree:
```
+
/ \
/ \
/ \
* *
/ \ / \
2 3 4 5
```
the call structure would look like:
```
interpretTree0(tree with +):
Call interpretTree1(left tree with *):
Call interpretTree2(tree with 2):
No maths operation, just return 2
Call interpretTree3(tree with 3):
No maths operation, just return 3
Perform 2 * 3, return 6
Call interpretTree1(right tree with *):
Call interpretTree2(tree with 4):
No maths operation, just return 4
Call interpretTree3(tree with 5):
No maths operation, just return 5
Perform 4 * 5, return 20
Perform 6 + 20, return 26
```
## Code to Interpret the Tree
This is in `interp.c` and follows the above pseudo-code:
```c
// Given an AST, interpret the
// operators in it and return
// a final value.
int interpretAST(struct ASTnode *n) {
int leftval, rightval;
// Get the left and right sub-tree values
if (n->left)
leftval = interpretAST(n->left);
if (n->right)
rightval = interpretAST(n->right);
switch (n->op) {
case A_ADD:
return (leftval + rightval);
case A_SUBTRACT:
return (leftval - rightval);
case A_MULTIPLY:
return (leftval * rightval);
case A_DIVIDE:
return (leftval / rightval);
case A_INTLIT:
return (n->intvalue);
default:
fprintf(stderr, "Unknown AST operator %d\n", n->op);
exit(1);
}
}
```
Again, the default statement in the switch statement fires when we can't
interpret the AST node type. It's going to form part of the
sematic checking in our parser.
## Building the Parser
There is some other code here and the, like the call to the interpreter
in `main()`:
```c
scan(&Token); // Get the first token from the input
n = binexpr(); // Parse the expression in the file
printf("%d\n", interpretAST(n)); // Calculate the final result
exit(0);
```
You can now build the parser by doing:
```
$ make
cc -o parser -g expr.c interp.c main.c scan.c tree.c
```
I've provided several input files for you to test the parser on, but
of course you can create your own. Remember, the calculated results
are incorrect, but the parser should detect input errors like
consecutive numbers, consecutive operators, and a number missing at the end
of the input. I've also added some debugging code to the interpreter so
you can see which AST tree nodes get evaluated in which order:
```
$ cat input01
2 + 3 * 5 - 8 / 3
$ ./parser input01
int 2
int 3
int 5
int 8
int 3
8 / 3
5 - 2
3 * 3
2 + 9
11
$ cat input02
13 -6+ 4*
5
+
08 / 3
$ ./parser input02
int 13
int 6
int 4
int 5
int 8
int 3
8 / 3
5 + 2
4 * 7
6 + 28
13 - 34
-21
$ cat input03
12 34 + -56 * / - - 8 + * 2
$ ./parser input03
unknown token in arithop() on line 1
$ cat input04
23 +
18 -
45.6 * 2
/ 18
$ ./parser input04
Unrecognised character . on line 3
$ cat input05
23 * 456abcdefg
$ ./parser input05
Unrecognised character a on line 1
```
## Conclusion and What's Next
A parser recognises the grammar of the language and checks that the
input to the compiler conforms to this grammar. If it doesn't, the parser
should print out an error message. As our expression grammar is
recursive, we have chosen to write a recursive descent parser to
recognise our expressions.
Right now the parser works, as shown by the above output, but it fails
to get the semantics of the input right. In other words, it doesn't
calculate the correct value of the expressions.
In the next part of our compiler writing journey, we will modify
the parser so that it also does the semantic analysis of the
expressions to get the right maths results. [Next step](../03_Precedence/Readme.md)
================================================
FILE: 02_Parser/data.h
================================================
#ifndef extern_
#define extern_ extern
#endif
// Global variables
// Copyright (c) 2019 Warren Toomey, GPL3
extern_ int Line;
extern_ int Putback;
extern_ FILE *Infile;
extern_ struct token Token;
================================================
FILE: 02_Parser/decl.h
================================================
// Function prototypes for all compiler files
// Copyright (c) 2019 Warren Toomey, GPL3
int scan(struct token *t);
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue);
struct ASTnode *mkastleaf(int op, int intvalue);
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue);
struct ASTnode *binexpr(void);
int interpretAST(struct ASTnode *n);
================================================
FILE: 02_Parser/defs.h
================================================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Structure and enum definitions
// Copyright (c) 2019 Warren Toomey, GPL3
// Token types
enum {
T_EOF, T_PLUS, T_MINUS, T_STAR, T_SLASH, T_INTLIT
};
// Token structure
struct token {
int token; // Token type, from the enum list above
int intvalue; // For T_INTLIT, the integer value
};
// AST node types
enum {
A_ADD, A_SUBTRACT, A_MULTIPLY, A_DIVIDE, A_INTLIT
};
// Abstract Syntax Tree structure
struct ASTnode {
int op; // "Operation" to be performed on this tree
struct ASTnode *left; // Left and right child trees
struct ASTnode *right;
int intvalue; // For A_INTLIT, the integer value
};
================================================
FILE: 02_Parser/expr.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of expressions
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse a primary factor and return an
// AST node representing it.
static struct ASTnode *primary(void) {
struct ASTnode *n;
// For an INTLIT token, make a leaf AST node for it
// and scan in the next token. Otherwise, a syntax error
// for any other token type.
switch (Token.token) {
case T_INTLIT:
n = mkastleaf(A_INTLIT, Token.intvalue);
scan(&Token);
return (n);
default:
fprintf(stderr, "syntax error on line %d\n", Line);
exit(1);
}
}
// Convert a token into an AST operation.
int arithop(int tok) {
switch (tok) {
case T_PLUS:
return (A_ADD);
case T_MINUS:
return (A_SUBTRACT);
case T_STAR:
return (A_MULTIPLY);
case T_SLASH:
return (A_DIVIDE);
default:
fprintf(stderr, "unknown token in arithop() on line %d\n", Line);
exit(1);
}
}
// Return an AST tree whose root is a binary operator
struct ASTnode *binexpr(void) {
struct ASTnode *n, *left, *right;
int nodetype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If no tokens left, return just the left node
if (Token.token == T_EOF)
return (left);
// Convert the token into a node type
nodetype = arithop(Token.token);
// Get the next token in
scan(&Token);
// Recursively get the right-hand tree
right = binexpr();
// Now build a tree with both sub-trees
n = mkastnode(nodetype, left, right, 0);
return (n);
}
================================================
FILE: 02_Parser/input01
================================================
2 + 3 * 5 - 8 / 3
================================================
FILE: 02_Parser/input02
================================================
13 -6+ 4*
5
+
08 / 3
================================================
FILE: 02_Parser/input03
================================================
12 34 + -56 * / - - 8 + * 2
================================================
FILE: 02_Parser/input04
================================================
23 +
18 -
45.6 * 2
/ 18
================================================
FILE: 02_Parser/input05
================================================
23 * 456abcdefg
================================================
FILE: 02_Parser/interp.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// AST tree interpreter
// Copyright (c) 2019 Warren Toomey, GPL3
// List of AST operators
static char *ASTop[] = { "+", "-", "*", "/" };
// Given an AST, interpret the
// operators in it and return
// a final value.
int interpretAST(struct ASTnode *n) {
int leftval, rightval;
// Get the left and right sub-tree values
if (n->left)
leftval = interpretAST(n->left);
if (n->right)
rightval = interpretAST(n->right);
// Debug: Print what we are about to do
if (n->op == A_INTLIT)
printf("int %d\n", n->intvalue);
else
printf("%d %s %d\n", leftval, ASTop[n->op], rightval);
switch (n->op) {
case A_ADD:
return (leftval + rightval);
case A_SUBTRACT:
return (leftval - rightval);
case A_MULTIPLY:
return (leftval * rightval);
case A_DIVIDE:
return (leftval / rightval);
case A_INTLIT:
return (n->intvalue);
default:
fprintf(stderr, "Unknown AST operator %d\n", n->op);
exit(1);
}
}
================================================
FILE: 02_Parser/main.c
================================================
#include "defs.h"
#define extern_
#include "data.h"
#undef extern_
#include "decl.h"
#include <errno.h>
// Compiler setup and top-level execution
// Copyright (c) 2019 Warren Toomey, GPL3
// Initialise global variables
static void init() {
Line = 1;
Putback = '\n';
}
// Print out a usage if started incorrectly
static void usage(char *prog) {
fprintf(stderr, "Usage: %s infile\n", prog);
exit(1);
}
// Main program: check arguments and print a usage
// if we don't have an argument. Open up the input
// file and call scanfile() to scan the tokens in it.
void main(int argc, char *argv[]) {
struct ASTnode *n;
if (argc != 2)
usage(argv[0]);
init();
if ((Infile = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Unable to open %s: %s\n", argv[1], strerror(errno));
exit(1);
}
scan(&Token); // Get the first token from the input
n = binexpr(); // Parse the expression in the file
printf("%d\n", interpretAST(n)); // Calculate the final result
exit(0);
}
================================================
FILE: 02_Parser/scan.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Lexical scanning
// Copyright (c) 2019 Warren Toomey, GPL3
// Return the position of character c
// in string s, or -1 if c not found
static int chrpos(char *s, int c) {
char *p;
p = strchr(s, c);
return (p ? p - s : -1);
}
// Get the next character from the input file.
static int next(void) {
int c;
if (Putback) { // Use the character put
c = Putback; // back if there is one
Putback = 0;
return c;
}
c = fgetc(Infile); // Read from input file
if ('\n' == c)
Line++; // Increment line count
return c;
}
// Put back an unwanted character
static void putback(int c) {
Putback = c;
}
// Skip past input that we don't need to deal with,
// i.e. whitespace, newlines. Return the first
// character we do need to deal with.
static int skip(void) {
int c;
c = next();
while (' ' == c || '\t' == c || '\n' == c || '\r' == c || '\f' == c) {
c = next();
}
return (c);
}
// Scan and return an integer literal
// value from the input file.
static int scanint(int c) {
int k, val = 0;
// Convert each character into an int value
while ((k = chrpos("0123456789", c)) >= 0) {
val = val * 10 + k;
c = next();
}
// We hit a non-integer character, put it back.
putback(c);
return val;
}
// Scan and return the next token found in the input.
// Return 1 if token valid, 0 if no tokens left.
int scan(struct token *t) {
int c;
// Skip whitespace
c = skip();
// Determine the token based on
// the input character
switch (c) {
case EOF:
t->token = T_EOF;
return (0);
case '+':
t->token = T_PLUS;
break;
case '-':
t->token = T_MINUS;
break;
case '*':
t->token = T_STAR;
break;
case '/':
t->token = T_SLASH;
break;
default:
// If it's a digit, scan the
// literal integer value in
if (isdigit(c)) {
t->intvalue = scanint(c);
t->token = T_INTLIT;
break;
}
printf("Unrecognised character %c on line %d\n", c, Line);
exit(1);
}
// We found a token
return (1);
}
================================================
FILE: 02_Parser/tree.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// AST tree functions
// Copyright (c) 2019 Warren Toomey, GPL3
// Build and return a generic AST node
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue) {
struct ASTnode *n;
// Malloc a new ASTnode
n = (struct ASTnode *) malloc(sizeof(struct ASTnode));
if (n == NULL) {
fprintf(stderr, "Unable to malloc in mkastnode()\n");
exit(1);
}
// Copy in the field values and return it
n->op = op;
n->left = left;
n->right = right;
n->intvalue = intvalue;
return (n);
}
// Make an AST leaf node
struct ASTnode *mkastleaf(int op, int intvalue) {
return (mkastnode(op, NULL, NULL, intvalue));
}
// Make a unary AST node: only one child
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue) {
return (mkastnode(op, left, NULL, intvalue));
}
================================================
FILE: 03_Precedence/Makefile
================================================
parser: expr.c interp.c main.c scan.c tree.c
cc -o parser -g expr.c interp.c main.c scan.c tree.c
parser2: expr2.c interp.c main.c scan.c tree.c
cc -o parser2 -g expr2.c interp.c main.c scan.c tree.c
clean:
rm -f parser parser2 *.o
test: parser
-(./parser input01; \
./parser input02; \
./parser input03; \
./parser input04; \
./parser input05)
test2: parser2
-(./parser2 input01; \
./parser2 input02; \
./parser2 input03; \
./parser2 input04; \
./parser2 input05)
================================================
FILE: 03_Precedence/Readme.md
================================================
# Part 3: Operator Precedence
We saw in the previous part of our compiler writing journey that a parser
doesn't necessarily enforce the semantics of our language. It only
enforces the syntax and structural rules of the grammar.
We ended up with code that calculates the wrong value of expressions
like `2 * 3 + 4 * 5`, because the code created an AST that looks like:
```
*
/ \
2 +
/ \
3 *
/ \
4 5
```
instead of:
```
+
/ \
/ \
/ \
* *
/ \ / \
2 3 4 5
```
To solve this, we have to add code to our parser to perform operator
precedence. There are (at least) two ways of doing this:
+ Making the operator precedence explicit in the language's grammar
+ Influencing the existing parser with an operator precedence table
## Making the Operator Precedence Explicit
Here is our grammar from the last part of the journey:
```
expression: number
| expression '*' expression
| expression '/' expression
| expression '+' expression
| expression '-' expression
;
number: T_INTLIT
;
```
Note that there is no differentiation between any of the four maths
operators. Let's tweak the grammar so that there is a difference:
```
expression: additive_expression
;
additive_expression:
multiplicative_expression
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
multiplicative_expression:
number
| number '*' multiplicative_expression
| number '/' multiplicative_expression
;
number: T_INTLIT
;
```
We now have two types of expressions: *additive* expressions and
*multiplicative* expressions. Note that the grammar now forces
the numbers to be part of multiplicative expressions only. This
forces the '*' and '/' operators to bind more tightly to the
numbers on either side, thus having higher precedence.
Any additive expression is actually either a multiplicative expression
by itself, or an additive (i.e. multiplicative) expression followed
by a '+' or '-' operator then another multiplicative expression.
The additive expression is now at a much lower predencence than the
multiplicative expression.
## Doing The Above in the Recursive Descent Parser
How do we take the above version of our grammar and implement it into
our recursive descent parser? I've done this in the file `expr2.c` and
I'll cover the code below.
The answer is to have a `multiplicative_expr()` function to deal with the
'*' and '/' operators, and an `additive_expr()` function to deal with the
lower precedence '+' and '-' operators.
Both functions are going to read in something and an operator.
Then, while there are following operators at the same precedence,
each function will parse some more of the input and combine the left
and right halves with the first operator.
However, `additive_expr()` will have to defer to the higher-precedence
`multiplicative_expr()` function. Here is how this is done.
## `additive_expr()`
```c
// Return an AST tree whose root is a '+' or '-' binary operator
struct ASTnode *additive_expr(void) {
struct ASTnode *left, *right;
int tokentype;
// Get the left sub-tree at a higher precedence than us
left = multiplicative_expr();
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
// Loop working on token at our level of precedence
while (1) {
// Fetch in the next integer literal
scan(&Token);
// Get the right sub-tree at a higher precedence than us
right = multiplicative_expr();
// Join the two sub-trees with our low-precedence operator
left = mkastnode(arithop(tokentype), left, right, 0);
// And get the next token at our precedence
tokentype = Token.token;
if (tokentype == T_EOF)
break;
}
// Return whatever tree we have created
return (left);
}
```
Right at the beginning, we immediately call `multiplicative_expr()`
in case the first operator is a high-precedence '*' or '/'. That
function will only return when it encounters a low-precedence
'+' or '-' operator.
Thus, when we hit the `while` loop, we know we have a '+' or '-' operator.
We loop until there are no tokens left in the input, i.e. when we hit
the T_EOF token.
Inside the loop, we call `multiplicative_expr()` again in case any
future operators are higher precedence than us. Again, this will
return when they are not.
Once we have a left and right sub-tree, we can combine them with
the operator we got the last time around the loop. This repeats, so that
if we had the expression `2 + 4 + 6`, we would end up with the AST tree:
```
+
/ \
+ 6
/ \
2 4
```
But if `multiplicative_expr()` had its own higher precedence operators,
we would be combining sub-trees with multiple nodes in them.
## multiplicative_expr()
```c
// Return an AST tree whose root is a '*' or '/' binary operator
struct ASTnode *multiplicative_expr(void) {
struct ASTnode *left, *right;
int tokentype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
// While the token is a '*' or '/'
while ((tokentype == T_STAR) || (tokentype == T_SLASH)) {
// Fetch in the next integer literal
scan(&Token);
right = primary();
// Join that with the left integer literal
left = mkastnode(arithop(tokentype), left, right, 0);
// Update the details of the current token.
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
break;
}
// Return whatever tree we have created
return (left);
}
```
The code is similar to `additive_expr()` except that we get to call
`primary()` to get real integer literals! We also only loop when
we have operators at our high precedence level, i.e. '*' and '/'
operators. As soon as we hit a low precedence operator, we simply
return the sub-tree that we've built to this point. This goes
back to `additive_expr()` to deal with the low precedence operator.
## Drawbacks of the Above
The above way of constructing a recursive descent parser with
explicit operator precedence can be inefficient because of
all the function calls needed to reach the right level of precedence.
There also has to be functions to deal with each level of operator
precedence, so we end up with lots of lines of code.
## The Alternative: Pratt Parsing
One way to cut down on the amount of code is to use a
[Pratt parser](https://en.wikipedia.org/wiki/Pratt_parser)
which has a table of precedence values associated with each token
instead of having functions that replicate the explicit precedence in
the grammar.
At this point I highly recommend that you read
[Pratt Parsers: Expression Parsing Made Easy](https://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/)
by Bob Nystrom. Pratt parsers still make my head hurt, so read as much
as you can and get comfortable with the basic concept.
## `expr.c`: Pratt Parsing
I've implemented Pratt parsing in `expr.c` which is a drop-in replacement
for `expr2.c`. Let's start the tour.
Firstly, we need some code to determine the precedence levels for each
token:
```c
// Operator precedence for each token
static int OpPrec[] = { 0, 10, 10, 20, 20, 0 };
// EOF + - * / INTLIT
// Check that we have a binary operator and
// return its precedence.
static int op_precedence(int tokentype) {
int prec = OpPrec[tokentype];
if (prec == 0) {
fprintf(stderr, "syntax error on line %d, token %d\n", Line, tokentype);
exit(1);
}
return (prec);
}
```
Higher numbers (e.g. 20) mean a higher precedence than lower numbers
(e.g. 10).
Now, you might ask: why have a function when you have a look-up table called
`OpPrec[]`? The answer is: to spot syntax errors.
Consider an input that looks like `234 101 + 12`. We can scan in the
first two tokens. But if we simply used `OpPrec[]` to get the precedence of the
second `101` token, we wouldn't notice that it isn't an operator. Thus,
the `op_precedence()` function enforces the correct grammar syntax.
Now, instead of having a function for each precedence level, we have a
single expression function that uses the table of operator precedences:
```c
// Return an AST tree whose root is a binary operator.
// Parameter ptp is the previous token's precedence.
struct ASTnode *binexpr(int ptp) {
struct ASTnode *left, *right;
int tokentype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
// While the precedence of this token is
// more than that of the previous token precedence
while (op_precedence(tokentype) > ptp) {
// Fetch in the next integer literal
scan(&Token);
// Recursively call binexpr() with the
// precedence of our token to build a sub-tree
right = binexpr(OpPrec[tokentype]);
// Join that sub-tree with ours. Convert the token
// into an AST operation at the same time.
left = mkastnode(arithop(tokentype), left, right, 0);
// Update the details of the current token.
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
}
// Return the tree we have when the precedence
// is the same or lower
return (left);
}
```
Firstly, note that this is still recursive like the previous parser
functions. This time, we receive the precedence level of the token
that was found before we got called. `main()` will call us with the
lowest precedence, 0, but we will call ourselves with higher values.
You should also spot that the code is quite similar to the
`multiplicative_expr()` function: read in an integer literal,
get the operator's token type, then loop building a tree.
The difference is the loop condition and body:
```c
multiplicative_expr():
while ((tokentype == T_STAR) || (tokentype == T_SLASH)) {
scan(&Token); right = primary();
left = mkastnode(arithop(tokentype), left, right, 0);
tokentype = Token.token;
if (tokentype == T_EOF) return (left);
}
binexpr():
while (op_precedence(tokentype) > ptp) {
scan(&Token); right = binexpr(OpPrec[tokentype]);
left = mkastnode(arithop(tokentype), left, right, 0);
tokentype = Token.token;
if (tokentype == T_EOF) return (left);
}
```
With the Pratt parser, when the next operator has a higher precedence
than our current token, instead of just getting the next integer
literal with `primary()`, we call ourselves with `binexpr(OpPrec[tokentype])`
to raise the operator precedence.
Once we hit a token at our precedence level or lower, we will simply:
```c
return (left);
```
This will either be a sub-tree with lots of nodes and operators at
a higher precedence that the operator that called us, or it might
be a single integer literal for an operator at the same predence as us.
Now we have a single function to do expression parsing. It uses a
small helper function to enforce the operator precedence, and thus
implements the semantics of our language.
## Putting Both Parsers Into Action
You can make two programs, one with each parser:
```
$ make parser # Pratt Parser
cc -o parser -g expr.c interp.c main.c scan.c tree.c
$ make parser2 # Precedence Climbing
cc -o parser2 -g expr2.c interp.c main.c scan.c tree.c
```
You can also test both parsers with the same input files from the
previous part of our journey:
```
$ make test
(./parser input01; \
./parser input02; \
./parser input03; \
./parser input04; \
./parser input05)
15 # input01 result
29 # input02 result
syntax error on line 1, token 5 # input03 result
Unrecognised character . on line 3 # input04 result
Unrecognised character a on line 1 # input05 result
$ make test2
(./parser2 input01; \
./parser2 input02; \
./parser2 input03; \
./parser2 input04; \
./parser2 input05)
15 # input01 result
29 # input02 result
syntax error on line 1, token 5 # input03 result
Unrecognised character . on line 3 # input04 result
Unrecognised character a on line 1 # input05 result
```
## Conclusion and What's Next
It's probably time to step back a bit and see where we've got to. We now have:
+ a scanner that recognises and returns the tokens in our language
+ a parser that recognises our grammar, reports syntax errors and
builds an Abstract Syntax Tree
+ a precedence table for the parser that implements the semantics of
our language
+ an interpreter that traverses the Abstract Syntax Tree depth-first
and calculates the result of the expression in the input
What we don't have yet is a compiler. But we are so close to making our
first compiler!
In the next part of our compiler writing journey, we will replace the
interpreter. In its place, we will write a translator that generates
x86-64 assembly code for each AST node that has a maths operator.
We will also generate some assembly preamble and postamble to
support the assembly code that the generator outputs. [Next step](../04_Assembly/Readme.md)
================================================
FILE: 03_Precedence/data.h
================================================
#ifndef extern_
#define extern_ extern
#endif
// Global variables
// Copyright (c) 2019 Warren Toomey, GPL3
extern_ int Line;
extern_ int Putback;
extern_ FILE *Infile;
extern_ struct token Token;
================================================
FILE: 03_Precedence/decl.h
================================================
// Function prototypes for all compiler files
// Copyright (c) 2019 Warren Toomey, GPL3
int scan(struct token *t);
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue);
struct ASTnode *mkastleaf(int op, int intvalue);
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue);
struct ASTnode *binexpr(int rbp);
int interpretAST(struct ASTnode *n);
================================================
FILE: 03_Precedence/defs.h
================================================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Structure and enum definitions
// Copyright (c) 2019 Warren Toomey, GPL3
// Token types
enum {
T_EOF, T_PLUS, T_MINUS, T_STAR, T_SLASH, T_INTLIT
};
// Token structure
struct token {
int token; // Token type, from the enum list above
int intvalue; // For T_INTLIT, the integer value
};
// AST node types
enum {
A_ADD, A_SUBTRACT, A_MULTIPLY, A_DIVIDE, A_INTLIT
};
// Abstract Syntax Tree structure
struct ASTnode {
int op; // "Operation" to be performed on this tree
struct ASTnode *left; // Left and right child trees
struct ASTnode *right;
int intvalue; // For A_INTLIT, the integer value
};
================================================
FILE: 03_Precedence/expr.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of expressions
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse a primary factor and return an
// AST node representing it.
static struct ASTnode *primary(void) {
struct ASTnode *n;
// For an INTLIT token, make a leaf AST node for it
// and scan in the next token. Otherwise, a syntax error
// for any other token type.
switch (Token.token) {
case T_INTLIT:
n = mkastleaf(A_INTLIT, Token.intvalue);
scan(&Token);
return (n);
default:
fprintf(stderr, "syntax error on line %d, token %d\n", Line, Token.token);
exit(1);
}
}
// Convert a binary operator token into an AST operation.
int arithop(int tokentype) {
switch (tokentype) {
case T_PLUS:
return (A_ADD);
case T_MINUS:
return (A_SUBTRACT);
case T_STAR:
return (A_MULTIPLY);
case T_SLASH:
return (A_DIVIDE);
default:
fprintf(stderr, "syntax error on line %d, token %d\n", Line, tokentype);
exit(1);
}
}
// Operator precedence for each token
static int OpPrec[] = { 0, 10, 10, 20, 20, 0 };
// Check that we have a binary operator and
// return its precedence.
static int op_precedence(int tokentype) {
int prec = OpPrec[tokentype];
if (prec == 0) {
fprintf(stderr, "syntax error on line %d, token %d\n", Line, tokentype);
exit(1);
}
return (prec);
}
// Return an AST tree whose root is a binary operator.
// Parameter ptp is the previous token's precedence.
struct ASTnode *binexpr(int ptp) {
struct ASTnode *left, *right;
int tokentype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
// While the precedence of this token is
// more than that of the previous token precedence
while (op_precedence(tokentype) > ptp) {
// Fetch in the next integer literal
scan(&Token);
// Recursively call binexpr() with the
// precedence of our token to build a sub-tree
right = binexpr(OpPrec[tokentype]);
// Join that sub-tree with ours. Convert the token
// into an AST operation at the same time.
left = mkastnode(arithop(tokentype), left, right, 0);
// Update the details of the current token.
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
}
// Return the tree we have when the precedence
// is the same or lower
return (left);
}
================================================
FILE: 03_Precedence/expr2.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of expressions with full recursive descent
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse a primary factor and return an
// AST node representing it.
static struct ASTnode *primary(void) {
struct ASTnode *n;
// For an INTLIT token, make a leaf AST node for it
// and scan in the next token. Otherwise, a syntax error
// for any other token type.
switch (Token.token) {
case T_INTLIT:
n = mkastleaf(A_INTLIT, Token.intvalue);
scan(&Token);
return (n);
default:
fprintf(stderr, "syntax error on line %d, token %d\n", Line, Token.token);
exit(1);
}
}
// Convert a binary operator token into an AST operation.
static int arithop(int tok) {
switch (tok) {
case T_PLUS:
return (A_ADD);
case T_MINUS:
return (A_SUBTRACT);
case T_STAR:
return (A_MULTIPLY);
case T_SLASH:
return (A_DIVIDE);
default:
fprintf(stderr, "syntax error on line %d, token %d\n", Line, tok);
exit(1);
}
}
struct ASTnode *additive_expr(void);
// Return an AST tree whose root is a '*' or '/' binary operator
struct ASTnode *multiplicative_expr(void) {
struct ASTnode *left, *right;
int tokentype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
// While the token is a '*' or '/'
while ((tokentype == T_STAR) || (tokentype == T_SLASH)) {
// Fetch in the next integer literal
scan(&Token);
right = primary();
// Join that with the left integer literal
left = mkastnode(arithop(tokentype), left, right, 0);
// Update the details of the current token.
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
break;
}
// Return whatever tree we have created
return (left);
}
// Return an AST tree whose root is a '+' or '-' binary operator
struct ASTnode *additive_expr(void) {
struct ASTnode *left, *right;
int tokentype;
// Get the left sub-tree at a higher precedence than us
left = multiplicative_expr();
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
// Cache the '+' or '-' token type
// Loop working on token at our level of precedence
while (1) {
// Fetch in the next integer literal
scan(&Token);
// Get the right sub-tree at a higher precedence than us
right = multiplicative_expr();
// Join the two sub-trees with our low-precedence operator
left = mkastnode(arithop(tokentype), left, right, 0);
// And get the next token at our precedence
tokentype = Token.token;
if (tokentype == T_EOF)
break;
}
// Return whatever tree we have created
return (left);
}
struct ASTnode *binexpr(int n) {
return (additive_expr());
}
================================================
FILE: 03_Precedence/input01
================================================
2 + 3 * 5 - 8 / 3
================================================
FILE: 03_Precedence/input02
================================================
13 -6+ 4*
5
+
08 / 3
================================================
FILE: 03_Precedence/input03
================================================
12 34 + -56 * / - - 8 + * 2
================================================
FILE: 03_Precedence/input04
================================================
23 +
18 -
45.6 * 2
/ 18
================================================
FILE: 03_Precedence/input05
================================================
23 * 456abcdefg
================================================
FILE: 03_Precedence/interp.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// AST tree interpreter
// Copyright (c) 2019 Warren Toomey, GPL3
// List of AST operators
static char *ASTop[] = { "+", "-", "*", "/" };
// Given an AST, interpret the
// operators in it and return
// a final value.
int interpretAST(struct ASTnode *n) {
int leftval, rightval;
// Get the left and right sub-tree values
if (n->left)
leftval = interpretAST(n->left);
if (n->right)
rightval = interpretAST(n->right);
// Debug: Print what we are about to do
// if (n->op == A_INTLIT)
// printf("int %d\n", n->intvalue);
// else
// printf("%d %s %d\n", leftval, ASTop[n->op], rightval);
switch (n->op) {
case A_ADD:
return (leftval + rightval);
case A_SUBTRACT:
return (leftval - rightval);
case A_MULTIPLY:
return (leftval * rightval);
case A_DIVIDE:
return (leftval / rightval);
case A_INTLIT:
return (n->intvalue);
default:
fprintf(stderr, "Unknown AST operator %d\n", n->op);
exit(1);
}
}
================================================
FILE: 03_Precedence/main.c
================================================
#include "defs.h"
#define extern_
#include "data.h"
#undef extern_
#include "decl.h"
#include <errno.h>
// Compiler setup and top-level execution
// Copyright (c) 2019 Warren Toomey, GPL3
// Initialise global variables
static void init() {
Line = 1;
Putback = '\n';
}
// Print out a usage if started incorrectly
static void usage(char *prog) {
fprintf(stderr, "Usage: %s infile\n", prog);
exit(1);
}
// Main program: check arguments and print a usage
// if we don't have an argument. Open up the input
// file and call scanfile() to scan the tokens in it.
void main(int argc, char *argv[]) {
struct ASTnode *n;
if (argc != 2)
usage(argv[0]);
init();
if ((Infile = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Unable to open %s: %s\n", argv[1], strerror(errno));
exit(1);
}
scan(&Token); // Get the first token from the input
n = binexpr(0); // Parse the expression in the file
printf("%d\n", interpretAST(n)); // Calculate the final result
exit(0);
}
================================================
FILE: 03_Precedence/scan.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Lexical scanning
// Copyright (c) 2019 Warren Toomey, GPL3
// Return the position of character c
// in string s, or -1 if c not found
static int chrpos(char *s, int c) {
char *p;
p = strchr(s, c);
return (p ? p - s : -1);
}
// Get the next character from the input file.
static int next(void) {
int c;
if (Putback) { // Use the character put
c = Putback; // back if there is one
Putback = 0;
return c;
}
c = fgetc(Infile); // Read from input file
if ('\n' == c)
Line++; // Increment line count
return c;
}
// Put back an unwanted character
static void putback(int c) {
Putback = c;
}
// Skip past input that we don't need to deal with,
// i.e. whitespace, newlines. Return the first
// character we do need to deal with.
static int skip(void) {
int c;
c = next();
while (' ' == c || '\t' == c || '\n' == c || '\r' == c || '\f' == c) {
c = next();
}
return (c);
}
// Scan and return an integer literal
// value from the input file.
static int scanint(int c) {
int k, val = 0;
// Convert each character into an int value
while ((k = chrpos("0123456789", c)) >= 0) {
val = val * 10 + k;
c = next();
}
// We hit a non-integer character, put it back.
putback(c);
return val;
}
// Scan and return the next token found in the input.
// Return 1 if token valid, 0 if no tokens left.
int scan(struct token *t) {
int c;
// Skip whitespace
c = skip();
// Determine the token based on
// the input character
switch (c) {
case EOF:
t->token = T_EOF;
return (0);
case '+':
t->token = T_PLUS;
break;
case '-':
t->token = T_MINUS;
break;
case '*':
t->token = T_STAR;
break;
case '/':
t->token = T_SLASH;
break;
default:
// If it's a digit, scan the
// literal integer value in
if (isdigit(c)) {
t->intvalue = scanint(c);
t->token = T_INTLIT;
break;
}
printf("Unrecognised character %c on line %d\n", c, Line);
exit(1);
}
// We found a token
return (1);
}
================================================
FILE: 03_Precedence/tree.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// AST tree functions
// Copyright (c) 2019 Warren Toomey, GPL3
// Build and return a generic AST node
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue) {
struct ASTnode *n;
// Malloc a new ASTnode
n = (struct ASTnode *) malloc(sizeof(struct ASTnode));
if (n == NULL) {
fprintf(stderr, "Unable to malloc in mkastnode()\n");
exit(1);
}
// Copy in the field values and return it
n->op = op;
n->left = left;
n->right = right;
n->intvalue = intvalue;
return (n);
}
// Make an AST leaf node
struct ASTnode *mkastleaf(int op, int intvalue) {
return (mkastnode(op, NULL, NULL, intvalue));
}
// Make a unary AST node: only one child
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue) {
return (mkastnode(op, left, NULL, intvalue));
}
================================================
FILE: 04_Assembly/Makefile
================================================
comp1: cg.c expr.c gen.c interp.c main.c scan.c tree.c
cc -o comp1 -g cg.c expr.c gen.c interp.c main.c scan.c tree.c
compn: cgn.c expr.c gen.c interp.c main.c scan.c tree.c
cc -o compn -g cgn.c expr.c gen.c interp.c main.c scan.c tree.c
clean:
rm -f comp1 compn *.o *.s out
test: comp1
./comp1 input01
cc -o out out.s
./out
./comp1 input02
cc -o out out.s
./out
testn: compn
./compn input01
nasm -f elf64 out.s
cc -no-pie -o out out.o
./out
./compn input02
nasm -f elf64 out.s
cc -no-pie -o out out.o
./out
================================================
FILE: 04_Assembly/Readme.md
================================================
# Part 4: An Actual Compiler
It's about time that I met my promise of actually writing a compiler.
So in this part of the journey we are going to replace the interpreter
in our program with code that generates x86-64 assembly code.
## Revising the Interpreter
Before we do, it will be worthwhile to revisit the interpreter code
in `interp.c`:
```c
int interpretAST(struct ASTnode *n) {
int leftval, rightval;
if (n->left) leftval = interpretAST(n->left);
if (n->right) rightval = interpretAST(n->right);
switch (n->op) {
case A_ADD: return (leftval + rightval);
case A_SUBTRACT: return (leftval - rightval);
case A_MULTIPLY: return (leftval * rightval);
case A_DIVIDE: return (leftval / rightval);
case A_INTLIT: return (n->intvalue);
default:
fprintf(stderr, "Unknown AST operator %d\n", n->op);
exit(1);
}
}
```
The `interpretAST()` function walks the given AST tree depth-first.
It evaluates any left sub-tree, then the right sub-tree. Finally, it
uses the `op` value at the base of the current tree to operate on
these children.
If the `op` value is one of the four maths operators, then this maths
operation is performed. If the `op` value indicates that the node
is simply an integer literal, the literal value is return.
The function returns the final value for this tree. And, as it is
recursive, it will calculate the final value for a whole tree
one sub-sub-tree at a time.
## Changing to Assembly Code Generation
We are going to write an assembly code generator which is generic.
This is, in turn, going to call out to a set of CPU-specific code
generation functions.
Here is the generic assembly code generator in `gen.c`:
```c
// Given an AST, generate
// assembly code recursively
static int genAST(struct ASTnode *n) {
int leftreg, rightreg;
// Get the left and right sub-tree values
if (n->left) leftreg = genAST(n->left);
if (n->right) rightreg = genAST(n->right);
switch (n->op) {
case A_ADD: return (cgadd(leftreg,rightreg));
case A_SUBTRACT: return (cgsub(leftreg,rightreg));
case A_MULTIPLY: return (cgmul(leftreg,rightreg));
case A_DIVIDE: return (cgdiv(leftreg,rightreg));
case A_INTLIT: return (cgload(n->intvalue));
default:
fprintf(stderr, "Unknown AST operator %d\n", n->op);
exit(1);
}
}
```
Looks familar, huh?! We are doing the same depth-first tree traversal.
This time:
+ A_INTLIT: load a register with the literal value
+ Other operators: perform a maths function on the two registers
that hold the left-child's and right-child's value
Instead of passing values, the code in `genAST()` passes around
register identifiers. For example `cgload()` loads a value into a register and
returns the identity of the register with the loaded value.
`genAST()` itself returns the identity of the register that holds the final
value of the tree at this point. That's why the code at the top is
getting register identities:
```c
if (n->left) leftreg = genAST(n->left);
if (n->right) rightreg = genAST(n->right);
```
## Calling `genAST()`
`genAST()` is only going to calculate the value of the expression given to
it. We need to print out this final calculation. We're also going to need
to wrap the assembly code we generate with some leading code (the
*preamble*) and some trailing code (the *postamble*). This is done with
the other function in `gen.c`:
```c
void generatecode(struct ASTnode *n) {
int reg;
cgpreamble();
reg= genAST(n);
cgprintint(reg); // Print the register with the result as an int
cgpostamble();
}
```
## The x86-64 Code Generator
That's the generic code generator out of the road. Now we need to look
at the generation of some real assembly code. For now, I'm targetting
the x86-64 CPU as this is still one of the most common Linux platforms.
So, open up `cg.c` and let's get browsing.
### Allocating Registers
Any CPU has a limited number of registers. We will have to allocate
a register to hold the integer literal values, plus any calculation
that we perform on them. However, once we've used a value, we can
often discard the value and hence free up the register holding it.
Then we can re-use that register for another value.
There are three functions that deal with register allocation:
+ `freeall_registers()`: Set all registers as available
+ `alloc_register()`: Allocate a free register
+ `free_register()`: Free an allocated register
I'm not going to go through the code as it's straight forward but with
some error checking. Right now, if I run out of registers then the
program will crash. Later on, I'll deal with the situation when we have
run out of free registers.
The code works on generic registers: r0, r1, r2 and r3. There is a table
of strings with the actual register names:
```c
static char *reglist[4]= { "%r8", "%r9", "%r10", "%r11" };
```
This makes these functions fairly independent of the CPU architecture.
### Loading a Register
This is done in `cgload()`: a register is allocated, then a `movq`
instruction loads a literal value into the allocated register.
```c
// Load an integer literal value into a register.
// Return the number of the register
int cgload(int value) {
// Get a new register
int r= alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmovq\t$%d, %s\n", value, reglist[r]);
return(r);
}
```
### Adding Two Registers
`cgadd()` takes two register numbers and generates the code to add
them together. The result is saved in one of the two registers,
and the other one is then freed for future use:
```c
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\taddq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return(r2);
}
```
Note that addition is *commutative*, so I could have added `r2` to `r1`
instead of `r1` to `r2`. The identity of the register with the final
value is returned.
### Multiplying Two Registers
This is very similar to addition, and again the operation is
*commutative*, so any register can be returned:
```c
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timulq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return(r2);
}
```
### Subtracting Two Registers
Subtraction is *not* commutative: we have to get the order correct.
The second register is subtracted from the first, so we return the
first and free the second:
```c
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsubq\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r2);
return(r1);
}
```
### Dividing Two Registers
Division is also not commutative, so the previous notes apply. On
the x86-64, it's even more complicated. We need to load `%rax`
with the *dividend* from `r1`. This needs to be extended to eight
bytes with `cqo`. Then, `idivq` will divide `%rax` with the divisor
in `r2`, leaving the *quotient* in `%rax`, so we need to copy it
out to either `r1` or `r2`. Then we can free the other register.
```c
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmovq\t%s,%%rax\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidivq\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmovq\t%%rax,%s\n", reglist[r1]);
free_register(r2);
return(r1);
}
```
### Printing A Register
There isn't an x86-64 instruction to print a register out as a decimal
number. To solve this problem, the assembly preamble contains a function
called `printint()` that takes a register argument and calls `printf()`
to print this out in decimal.
I'm not going to give the code in `cgpreamble()`, but it also contains
the beginning code for `main()`, so that we can assemble our output file
to get a complete program. The code for `cgpostamble()`, also not given
here, simply calls `exit(0)` to end the program.
Here, however, is `cgprintint()`:
```c
void cgprintint(int r) {
fprintf(Outfile, "\tmovq\t%s, %%rdi\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
```
Linux x86-64 expects the first argument to a function to be in the `%rdi`
register, so we move our register into `%rdi` before we `call printint`.
## Doing Our First Compile
That's about it for the x86-64 code generator. There is some extra code
in `main()` to open out `out.s` as our output file. I've also left the
interpreter in the program so we can confirm that our assembly calculates
the same answer for the input expression as the interpreter.
Let's make the compiler and run it on `input01`:
```make
$ make
cc -o comp1 -g cg.c expr.c gen.c interp.c main.c scan.c tree.c
$ make test
./comp1 input01
15
cc -o out out.s
./out
15
```
Yes! The first 15 is the interpreter's output. The second 15 is the
assembly's output.
## Examining the Assembly Output
So, exactly what was the assembly output? Well, here is the input file:
```
2 + 3 * 5 - 8 / 3
```
and here is `out.s` for this input with comments:
```
.text # Preamble code
.LC0:
.string "%d\n" # "%d\n" for printf()
printint:
pushq %rbp
movq %rsp, %rbp # Set the frame pointer
subq $16, %rsp
movl %edi, -4(%rbp)
movl -4(%rbp), %eax # Get the printint() argument
movl %eax, %esi
leaq .LC0(%rip), %rdi # Get the pointer to "%d\n"
movl $0, %eax
call printf@PLT # Call printf()
nop
leave # and return
ret
.globl main
.type main, @function
main:
pushq %rbp
movq %rsp, %rbp # Set the frame pointer
# End of preamble code
movq $2, %r8 # %r8 = 2
movq $3, %r9 # %r9 = 3
movq $5, %r10 # %r10 = 5
imulq %r9, %r10 # %r10 = 3 * 5 = 15
addq %r8, %r10 # %r10 = 2 + 15 = 17
# %r8 and %r9 are now free again
movq $8, %r8 # %r8 = 8
movq $3, %r9 # %r9 = 3
movq %r8,%rax
cqo # Load dividend %rax with 8
idivq %r9 # Divide by 3
movq %rax,%r8 # Store quotient in %r8, i.e. 2
subq %r8, %r10 # %r10 = 17 - 2 = 15
movq %r10, %rdi # Copy 15 into %rdi in preparation
call printint # to call printint()
movl $0, %eax # Postamble: call exit(0)
popq %rbp
ret
```
Excellent! We now have a legitimate compiler: a program that takes
an input in one language and generates a translation of that input
in another language.
We still have to then assemble the output down to machine code and link
it with the support libraries, but this is something that we can
perform manually for now. Later on, we will write some code to do
this automatically.
## Conclusion and What's Next
Changing from the interpreter to a generic code generator was trivial, but then
we had to write some code to generate real assembly output. To do this,
we had to think about how to allocate registers: for now, we have a naive
solution. We also had to deal with some x86-64 oddities like the `idivq`
instruction.
Something I haven't touched on yet is: why bother with generating the AST for
an expression? Surely, we could have called `cgadd()` when we hit a '+'
token in our Pratt parser, ditto for the other operators. I'm going to
leave you to think about this, but I will come back to it in a step or
two.
In the next part of our compiler writing journey, we will add some
statements to our language, so that it starts to resemble a proper
computer language. [Next step](../05_Statements/Readme.md)
================================================
FILE: 04_Assembly/cg.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Code generator for x86-64
// Copyright (c) 2019 Warren Toomey, GPL3
// List of available registers
// and their names
static int freereg[4];
static char *reglist[4]= { "%r8", "%r9", "%r10", "%r11" };
// Set all registers as available
void freeall_registers(void)
{
freereg[0]= freereg[1]= freereg[2]= freereg[3]= 1;
}
// Allocate a free register. Return the number of
// the register. Die if no available registers.
static int alloc_register(void)
{
for (int i=0; i<4; i++) {
if (freereg[i]) {
freereg[i]= 0;
return(i);
}
}
fprintf(stderr, "Out of registers!\n");
exit(1);
}
// Return a register to the list of available registers.
// Check to see if it's not already there.
static void free_register(int reg)
{
if (freereg[reg] != 0) {
fprintf(stderr, "Error trying to free register %d\n", reg);
exit(1);
}
freereg[reg]= 1;
}
// Print out the assembly preamble
void cgpreamble()
{
freeall_registers();
fputs(
"\t.text\n"
".LC0:\n"
"\t.string\t\"%d\\n\"\n"
"printint:\n"
"\tpushq\t%rbp\n"
"\tmovq\t%rsp, %rbp\n"
"\tsubq\t$16, %rsp\n"
"\tmovl\t%edi, -4(%rbp)\n"
"\tmovl\t-4(%rbp), %eax\n"
"\tmovl\t%eax, %esi\n"
"\tleaq .LC0(%rip), %rdi\n"
"\tmovl $0, %eax\n"
"\tcall printf@PLT\n"
"\tnop\n"
"\tleave\n"
"\tret\n"
"\n"
"\t.globl\tmain\n"
"\t.type\tmain, @function\n"
"main:\n"
"\tpushq\t%rbp\n"
"\tmovq %rsp, %rbp\n",
Outfile);
}
// Print out the assembly postamble
void cgpostamble()
{
fputs(
"\tmovl $0, %eax\n"
"\tpopq %rbp\n"
"\tret\n",
Outfile);
}
// Load an integer literal value into a register.
// Return the number of the register
int cgload(int value) {
// Get a new register
int r= alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmovq\t$%d, %s\n", value, reglist[r]);
return(r);
}
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\taddq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return(r2);
}
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsubq\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r2);
return(r1);
}
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timulq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return(r2);
}
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmovq\t%s,%%rax\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidivq\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmovq\t%%rax,%s\n", reglist[r1]);
free_register(r2);
return(r1);
}
// Call printint() with the given register
void cgprintint(int r) {
fprintf(Outfile, "\tmovq\t%s, %%rdi\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
================================================
FILE: 04_Assembly/cgn.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Code generator for x86-64
// Copyright (c) 2019 Warren Toomey, GPL3
// List of available registers
// and their names
static int freereg[4];
static char *reglist[4]= { "r8", "r9", "r10", "r11" };
// Set all registers as available
void freeall_registers(void)
{
freereg[0]= freereg[1]= freereg[2]= freereg[3]= 1;
}
// Allocate a free register. Return the number of
// the register. Die if no available registers.
static int alloc_register(void)
{
for (int i=0; i<4; i++) {
if (freereg[i]) {
freereg[i]= 0;
return(i);
}
}
fprintf(stderr, "Out of registers!\n");
exit(1);
}
// Return a register to the list of available registers.
// Check to see if it's not already there.
static void free_register(int reg)
{
if (freereg[reg] != 0) {
fprintf(stderr, "Error trying to free register %d\n", reg);
exit(1);
}
freereg[reg]= 1;
}
// Print out the assembly preamble
void cgpreamble()
{
freeall_registers();
fputs(
"\tglobal\tmain\n"
"\textern\tprintf\n"
"\tsection\t.text\n"
"LC0:\tdb\t\"%d\",10,0\n"
"printint:\n"
"\tpush\trbp\n"
"\tmov\trbp, rsp\n"
"\tsub\trsp, 16\n"
"\tmov\t[rbp-4], edi\n"
"\tmov\teax, [rbp-4]\n"
"\tmov\tesi, eax\n"
"\tlea rdi, [rel LC0]\n"
"\tmov eax, 0\n"
"\tcall printf\n"
"\tnop\n"
"\tleave\n"
"\tret\n"
"\n"
"main:\n"
"\tpush\trbp\n"
"\tmov rbp, rsp\n",
Outfile);
}
// Print out the assembly postamble
void cgpostamble()
{
fputs(
"\tmov eax, 0\n"
"\tpop rbp\n"
"\tret\n",
Outfile);
}
// Load an integer literal value into a register.
// Return the number of the register
int cgload(int value) {
// Get a new register
int r= alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmov\t%s, %d\n", reglist[r], value);
return(r);
}
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\tadd\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r1);
return(r2);
}
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsub\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r2);
return(r1);
}
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timul\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r1);
return(r2);
}
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmov\trax, %s\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidiv\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmov\t%s, rax\n", reglist[r1]);
free_register(r2);
return(r1);
}
// Call printint() with the given register
void cgprintint(int r) {
fprintf(Outfile, "\tmov\trdi, %s\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
================================================
FILE: 04_Assembly/data.h
================================================
#ifndef extern_
#define extern_ extern
#endif
// Global variables
// Copyright (c) 2019 Warren Toomey, GPL3
extern_ int Line;
extern_ int Putback;
extern_ FILE *Infile;
extern_ FILE *Outfile;
extern_ struct token Token;
================================================
FILE: 04_Assembly/decl.h
================================================
// Function prototypes for all compiler files
// Copyright (c) 2019 Warren Toomey, GPL3
int scan(struct token *t);
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue);
struct ASTnode *mkastleaf(int op, int intvalue);
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue);
struct ASTnode *binexpr(int rbp);
int interpretAST(struct ASTnode *n);
void generatecode(struct ASTnode *n);
void freeall_registers(void);
void cgpreamble();
void cgpostamble();
int cgload(int value);
int cgadd(int r1, int r2);
int cgsub(int r1, int r2);
int cgmul(int r1, int r2);
int cgdiv(int r1, int r2);
void cgprintint(int r);
================================================
FILE: 04_Assembly/defs.h
================================================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Structure and enum definitions
// Copyright (c) 2019 Warren Toomey, GPL3
// Token types
enum {
T_EOF, T_PLUS, T_MINUS, T_STAR, T_SLASH, T_INTLIT
};
// Token structure
struct token {
int token; // Token type, from the enum list above
int intvalue; // For T_INTLIT, the integer value
};
// AST node types
enum {
A_ADD, A_SUBTRACT, A_MULTIPLY, A_DIVIDE, A_INTLIT
};
// Abstract Syntax Tree structure
struct ASTnode {
int op; // "Operation" to be performed on this tree
struct ASTnode *left; // Left and right child trees
struct ASTnode *right;
int intvalue; // For A_INTLIT, the integer value
};
================================================
FILE: 04_Assembly/expr.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of expressions
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse a primary factor and return an
// AST node representing it.
static struct ASTnode *primary(void) {
struct ASTnode *n;
// For an INTLIT token, make a leaf AST node for it
// and scan in the next token. Otherwise, a syntax error
// for any other token type.
switch (Token.token) {
case T_INTLIT:
n = mkastleaf(A_INTLIT, Token.intvalue);
scan(&Token);
return (n);
default:
fprintf(stderr, "syntax error on line %d, token %d\n", Line, Token.token);
exit(1);
}
}
// Convert a binary operator token into an AST operation.
int arithop(int tokentype) {
switch (tokentype) {
case T_PLUS:
return (A_ADD);
case T_MINUS:
return (A_SUBTRACT);
case T_STAR:
return (A_MULTIPLY);
case T_SLASH:
return (A_DIVIDE);
default:
fprintf(stderr, "syntax error on line %d, token %d\n", Line, tokentype);
exit(1);
}
}
// Operator precedence for each token
static int OpPrec[] = { 0, 10, 10, 20, 20, 0 };
// Check that we have a binary operator and
// return its precedence.
static int op_precedence(int tokentype) {
int prec = OpPrec[tokentype];
if (prec == 0) {
fprintf(stderr, "syntax error on line %d, token %d\n", Line, tokentype);
exit(1);
}
return (prec);
}
// Return an AST tree whose root is a binary operator.
// Parameter ptp is the previous token's precedence.
struct ASTnode *binexpr(int ptp) {
struct ASTnode *left, *right;
int tokentype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
// While the precedence of this token is
// more than that of the previous token precedence
while (op_precedence(tokentype) > ptp) {
// Fetch in the next integer literal
scan(&Token);
// Recursively call binexpr() with the
// precedence of our token to build a sub-tree
right = binexpr(OpPrec[tokentype]);
// Join that sub-tree with ours. Convert the token
// into an AST operation at the same time.
left = mkastnode(arithop(tokentype), left, right, 0);
// Update the details of the current token.
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
}
// Return the tree we have when the precedence
// is the same or lower
return (left);
}
================================================
FILE: 04_Assembly/gen.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Generic code generator
// Copyright (c) 2019 Warren Toomey, GPL3
// Given an AST, generate
// assembly code recursively
static int genAST(struct ASTnode *n) {
int leftreg, rightreg;
// Get the left and right sub-tree values
if (n->left)
leftreg = genAST(n->left);
if (n->right)
rightreg = genAST(n->right);
switch (n->op) {
case A_ADD:
return (cgadd(leftreg,rightreg));
case A_SUBTRACT:
return (cgsub(leftreg,rightreg));
case A_MULTIPLY:
return (cgmul(leftreg,rightreg));
case A_DIVIDE:
return (cgdiv(leftreg,rightreg));
case A_INTLIT:
return (cgload(n->intvalue));
default:
fprintf(stderr, "Unknown AST operator %d\n", n->op);
exit(1);
}
}
void generatecode(struct ASTnode *n) {
int reg;
cgpreamble();
reg= genAST(n);
cgprintint(reg);
cgpostamble();
}
================================================
FILE: 04_Assembly/input01
================================================
2 + 3 * 5 - 8 / 3
================================================
FILE: 04_Assembly/input02
================================================
13 -6+ 4*
5
+
08 / 3
================================================
FILE: 04_Assembly/interp.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// AST tree interpreter
// Copyright (c) 2019 Warren Toomey, GPL3
// List of AST operators
static char *ASTop[] = { "+", "-", "*", "/" };
// Given an AST, interpret the
// operators in it and return
// a final value.
int interpretAST(struct ASTnode *n) {
int leftval, rightval;
// Get the left and right sub-tree values
if (n->left)
leftval = interpretAST(n->left);
if (n->right)
rightval = interpretAST(n->right);
// Debug: Print what we are about to do
// if (n->op == A_INTLIT)
// printf("int %d\n", n->intvalue);
// else
// printf("%d %s %d\n", leftval, ASTop[n->op], rightval);
switch (n->op) {
case A_ADD:
return (leftval + rightval);
case A_SUBTRACT:
return (leftval - rightval);
case A_MULTIPLY:
return (leftval * rightval);
case A_DIVIDE:
return (leftval / rightval);
case A_INTLIT:
return (n->intvalue);
default:
fprintf(stderr, "Unknown AST operator %d\n", n->op);
exit(1);
}
}
================================================
FILE: 04_Assembly/main.c
================================================
#include "defs.h"
#define extern_
#include "data.h"
#undef extern_
#include "decl.h"
#include <errno.h>
// Compiler setup and top-level execution
// Copyright (c) 2019 Warren Toomey, GPL3
// Initialise global variables
static void init() {
Line = 1;
Putback = '\n';
}
// Print out a usage if started incorrectly
static void usage(char *prog) {
fprintf(stderr, "Usage: %s infile\n", prog);
exit(1);
}
// Main program: check arguments and print a usage
// if we don't have an argument. Open up the input
// file and call scanfile() to scan the tokens in it.
void main(int argc, char *argv[]) {
struct ASTnode *n;
if (argc != 2)
usage(argv[0]);
init();
// Open up the input file
if ((Infile = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Unable to open %s: %s\n", argv[1], strerror(errno));
exit(1);
}
// Create the output file
if ((Outfile = fopen("out.s", "w")) == NULL) {
fprintf(stderr, "Unable to create out.s: %s\n", strerror(errno));
exit(1);
}
scan(&Token); // Get the first token from the input
n = binexpr(0); // Parse the expression in the file
printf("%d\n", interpretAST(n)); // Calculate the final result
generatecode(n);
fclose(Outfile);
exit(0);
}
================================================
FILE: 04_Assembly/scan.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Lexical scanning
// Copyright (c) 2019 Warren Toomey, GPL3
// Return the position of character c
// in string s, or -1 if c not found
static int chrpos(char *s, int c) {
char *p;
p = strchr(s, c);
return (p ? p - s : -1);
}
// Get the next character from the input file.
static int next(void) {
int c;
if (Putback) { // Use the character put
c = Putback; // back if there is one
Putback = 0;
return c;
}
c = fgetc(Infile); // Read from input file
if ('\n' == c)
Line++; // Increment line count
return c;
}
// Put back an unwanted character
static void putback(int c) {
Putback = c;
}
// Skip past input that we don't need to deal with,
// i.e. whitespace, newlines. Return the first
// character we do need to deal with.
static int skip(void) {
int c;
c = next();
while (' ' == c || '\t' == c || '\n' == c || '\r' == c || '\f' == c) {
c = next();
}
return (c);
}
// Scan and return an integer literal
// value from the input file.
static int scanint(int c) {
int k, val = 0;
// Convert each character into an int value
while ((k = chrpos("0123456789", c)) >= 0) {
val = val * 10 + k;
c = next();
}
// We hit a non-integer character, put it back.
putback(c);
return val;
}
// Scan and return the next token found in the input.
// Return 1 if token valid, 0 if no tokens left.
int scan(struct token *t) {
int c;
// Skip whitespace
c = skip();
// Determine the token based on
// the input character
switch (c) {
case EOF:
t->token = T_EOF;
return (0);
case '+':
t->token = T_PLUS;
break;
case '-':
t->token = T_MINUS;
break;
case '*':
t->token = T_STAR;
break;
case '/':
t->token = T_SLASH;
break;
default:
// If it's a digit, scan the
// literal integer value in
if (isdigit(c)) {
t->intvalue = scanint(c);
t->token = T_INTLIT;
break;
}
printf("Unrecognised character %c on line %d\n", c, Line);
exit(1);
}
// We found a token
return (1);
}
================================================
FILE: 04_Assembly/tree.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// AST tree functions
// Copyright (c) 2019 Warren Toomey, GPL3
// Build and return a generic AST node
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue) {
struct ASTnode *n;
// Malloc a new ASTnode
n = (struct ASTnode *) malloc(sizeof(struct ASTnode));
if (n == NULL) {
fprintf(stderr, "Unable to malloc in mkastnode()\n");
exit(1);
}
// Copy in the field values and return it
n->op = op;
n->left = left;
n->right = right;
n->intvalue = intvalue;
return (n);
}
// Make an AST leaf node
struct ASTnode *mkastleaf(int op, int intvalue) {
return (mkastnode(op, NULL, NULL, intvalue));
}
// Make a unary AST node: only one child
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue) {
return (mkastnode(op, left, NULL, intvalue));
}
================================================
FILE: 05_Statements/Makefile
================================================
comp1: cg.c expr.c gen.c main.c misc.c scan.c stmt.c tree.c
cc -o comp1 -g cg.c expr.c gen.c main.c misc.c scan.c stmt.c tree.c
compn: cgn.c expr.c gen.c main.c misc.c scan.c stmt.c tree.c
cc -o compn -g cgn.c expr.c gen.c main.c misc.c scan.c stmt.c tree.c
clean:
rm -f comp1 compn *.o *.s out
test: comp1 input01
./comp1 input01
cc -o out out.s
./out
testn: compn input01
./compn input01
nasm -f elf64 out.s
cc -no-pie -o out out.o
./out
================================================
FILE: 05_Statements/Readme.md
================================================
# Part 5: Statements
It's time to add some "proper" statements to the grammar of our language.
I want to be able to write lines of code like this:
```
print 2 + 3 * 5;
print 18 - 6/3 + 4*2;
```
Of course, as we are ignoring whitespace, there's no necessity that
all the tokens for one statement are on the same line. Each statement
starts with the keyword `print` and is terminated with a semicolon. So
these are going to become new tokens in our language.
## BNF Description of the Grammar
We've already seen the BNF notation for expressions. Now let's define
the BNF syntax for the above types of statements:
```
statements: statement
| statement statements
;
statement: 'print' expression ';'
;
```
An input file consists of several statements. They are either one statement,
or a statement followed by more statements. Each statement starts with the
keyword `print`, then one expression, then a semicolon.
## Changes to the Lexical Scanner
Before we can get to the code that parses the above syntax, we need to
add a few more bits and pieces to the existing code. Let's start with
the lexical scanner.
Adding a token for semicolons will be easy. Now, the `print` keyword.
Later on, we'll have many keywords in the language, plus identifiers
for our variables, so we'll need to add some code which helps us to
deal with them.
In `scan.c`, I've added this code which I've borrowed from the SubC
compiler. It reads in alphanumeric characters into a
buffer until it hits a non-alphanumeric character.
```c
// Scan an identifier from the input file and
// store it in buf[]. Return the identifier's length
static int scanident(int c, char *buf, int lim) {
int i = 0;
// Allow digits, alpha and underscores
while (isalpha(c) || isdigit(c) || '_' == c) {
// Error if we hit the identifier length limit,
// else append to buf[] and get next character
if (lim - 1 == i) {
printf("identifier too long on line %d\n", Line);
exit(1);
} else if (i < lim - 1) {
buf[i++] = c;
}
c = next();
}
// We hit a non-valid character, put it back.
// NUL-terminate the buf[] and return the length
putback(c);
buf[i] = '\0';
return (i);
}
```
We also need a function to recognise keywords in the language. One way
would be to have a list of keywords, and to walk the list and `strcmp()`
each one against the buffer from `scanident()`. The code from SubC has
an optimisation: match against the first letter before doing the `strcmp()`.
This speeds up the comparison against dozens of keywords. Right now we
don't need this optimisation but I've put it in for later:
```c
// Given a word from the input, return the matching
// keyword token number or 0 if it's not a keyword.
// Switch on the first letter so that we don't have
// to waste time strcmp()ing against all the keywords.
static int keyword(char *s) {
switch (*s) {
case 'p':
if (!strcmp(s, "print"))
return (T_PRINT);
break;
}
return (0);
}
```
Now, at the bottom of the switch statement in `scan()`, we add this code
to recognise semicolons and keywords:
```c
case ';':
t->token = T_SEMI;
break;
default:
// If it's a digit, scan the
// literal integer value in
if (isdigit(c)) {
t->intvalue = scanint(c);
t->token = T_INTLIT;
break;
} else if (isalpha(c) || '_' == c) {
// Read in a keyword or identifier
scanident(c, Text, TEXTLEN);
// If it's a recognised keyword, return that token
if (tokentype = keyword(Text)) {
t->token = tokentype;
break;
}
// Not a recognised keyword, so an error for now
printf("Unrecognised symbol %s on line %d\n", Text, Line);
exit(1);
}
// The character isn't part of any recognised token, error
printf("Unrecognised character %c on line %d\n", c, Line);
exit(1);
```
I've also added a global `Text` buffer to store the keywords and
identifiers:
```c
#define TEXTLEN 512 // Length of symbols in input
extern_ char Text[TEXTLEN + 1]; // Last identifier scanned
```
## Changes to the Expression Parser
Up to now our input files have contained just a single expression; therefore,
in our Pratt parser code in `binexpr()` (in `expr.c`), we had this code to
exit the parser:
```c
// If no tokens left, return just the left node
tokentype = Token.token;
if (tokentype == T_EOF)
return (left);
```
With our new grammar, each expression is terminated by a semicolon. Thus,
we need to change the code in the expression parser to spot the `T_SEMI`
tokens and exit the expression parsing:
```c
// Return an AST tree whose root is a binary operator.
// Parameter ptp is the previous token's precedence.
struct ASTnode *binexpr(int ptp) {
struct ASTnode *left, *right;
int tokentype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If we hit a semicolon, return just the left node
tokentype = Token.token;
if (tokentype == T_SEMI)
return (left);
while (op_precedence(tokentype) > ptp) {
...
// Update the details of the current token.
// If we hit a semicolon, return just the left node
tokentype = Token.token;
if (tokentype == T_SEMI)
return (left);
}
}
```
## Changes to the Code Generator
I want to keep the generic code generator in `gen.c`
separate from the CPU-specific code in `cg.c`. That also means
that the rest of the compiler should only ever call the functions in
`gen.c`, and only `gen.c` should call the code in `cg.c`.
To this end, I've defined some new "front-end" functions in `gen.c`:
```c
void genpreamble() { cgpreamble(); }
void genpostamble() { cgpostamble(); }
void genfreeregs() { freeall_registers(); }
void genprintint(int reg) { cgprintint(reg); }
```
## Adding the Parser for Statements
We have a new file `stmt.c`. This will hold the parsing code for all
the main statements in our language. Right now, we need to parse the
BNF grammar for statements which I gave up above. This is done with
this single function. I've converted the recursive definition into
a loop:
```c
// Parse one or more statements
void statements(void) {
struct ASTnode *tree;
int reg;
while (1) {
// Match a 'print' as the first token
match(T_PRINT, "print");
// Parse the following expression and
// generate the assembly code
tree = binexpr(0);
reg = genAST(tree);
genprintint(reg);
genfreeregs();
// Match the following semicolon
// and stop if we are at EOF
semi();
if (Token.token == T_EOF)
return;
}
}
```
In each loop, the code finds a T_PRINT token. It then calls `binexpr()` to
parse the expression. Finally, it finds the T_SEMI token. If a T_EOF token
follows, we break out of the loop.
After each expression tree, the code in `gen.c` is called to convert
the tree into assembly code and to call the assembly `printint()` function
to print out the final value.
## Some Helper Functions
There are a couple of new helper functions in the above code, which I've put
into a new file, `misc.c`:
```c
// Ensure that the current token is t,
// and fetch the next token. Otherwise
// throw an error
void match(int t, char *what) {
if (Token.token == t) {
scan(&Token);
} else {
printf("%s expected on line %d\n", what, Line);
exit(1);
}
}
// Match a semicon and fetch the next token
void semi(void) {
match(T_SEMI, ";");
}
```
These form part of the syntax checking in the parser. Later on, I'll add
more short functions to call `match()` to make our syntax checking easier.
## Changes to `main()`
`main()` used to call `binexpr()` directly to parse the single expression
in the old input files. Now it does this:
```c
scan(&Token); // Get the first token from the input
genpreamble(); // Output the preamble
statements(); // Parse the statements in the input
genpostamble(); // Output the postamble
fclose(Outfile); // Close the output file and exit
exit(0);
```
## Trying It Out
That's about it for the new and changed code. Let's give the new code
a whirl. Here is the new input file, `input01`:
```
print 12 * 3;
print
18 - 2
* 4; print
1 + 2 +
9 - 5/2 + 3*5;
```
Yes I've decided to check that we have have tokens spread out across multiple
lines. To compile and run the input file, do a `make test`:
```make
$ make test
cc -o comp1 -g cg.c expr.c gen.c main.c misc.c scan.c stmt.c tree.c
./comp1 input01
cc -o out out.s
./out
36
10
25
```
And it works!
## Conclusion and What's Next
We've added our first "real" statement grammar to our language. I've defined
it in BNF notation, but it was easier to implement it with a loop and not
recursively. Don't worry, we'll go back to doing recursive parsing soon.
Along the way we had to modify the scanner, add support for keywords and
identifiers, and to more cleanly separate the generic code generator and
the CPU-specific generator.
In the next part of our compiler writing journey, we will add variables
to the language. This will require a significant amount of work. [Next step](../06_Variables/Readme.md)
================================================
FILE: 05_Statements/cg.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Code generator for x86-64
// Copyright (c) 2019 Warren Toomey, GPL3
// List of available registers
// and their names
static int freereg[4];
static char *reglist[4] = { "%r8", "%r9", "%r10", "%r11" };
// Set all registers as available
void freeall_registers(void) {
freereg[0] = freereg[1] = freereg[2] = freereg[3] = 1;
}
// Allocate a free register. Return the number of
// the register. Die if no available registers.
static int alloc_register(void) {
for (int i = 0; i < 4; i++) {
if (freereg[i]) {
freereg[i] = 0;
return (i);
}
}
fprintf(stderr, "Out of registers!\n");
exit(1);
}
// Return a register to the list of available registers.
// Check to see if it's not already there.
static void free_register(int reg) {
if (freereg[reg] != 0) {
fprintf(stderr, "Error trying to free register %d\n", reg);
exit(1);
}
freereg[reg] = 1;
}
// Print out the assembly preamble
void cgpreamble() {
freeall_registers();
fputs("\t.text\n"
".LC0:\n"
"\t.string\t\"%d\\n\"\n"
"printint:\n"
"\tpushq\t%rbp\n"
"\tmovq\t%rsp, %rbp\n"
"\tsubq\t$16, %rsp\n"
"\tmovl\t%edi, -4(%rbp)\n"
"\tmovl\t-4(%rbp), %eax\n"
"\tmovl\t%eax, %esi\n"
"\tleaq .LC0(%rip), %rdi\n"
"\tmovl $0, %eax\n"
"\tcall printf@PLT\n"
"\tnop\n"
"\tleave\n"
"\tret\n"
"\n"
"\t.globl\tmain\n"
"\t.type\tmain, @function\n"
"main:\n" "\tpushq\t%rbp\n" "\tmovq %rsp, %rbp\n", Outfile);
}
// Print out the assembly postamble
void cgpostamble() {
fputs("\tmovl $0, %eax\n" "\tpopq %rbp\n" "\tret\n", Outfile);
}
// Load an integer literal value into a register.
// Return the number of the register
int cgload(int value) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmovq\t$%d, %s\n", value, reglist[r]);
return (r);
}
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\taddq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return (r2);
}
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsubq\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r2);
return (r1);
}
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timulq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return (r2);
}
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmovq\t%s,%%rax\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidivq\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmovq\t%%rax,%s\n", reglist[r1]);
free_register(r2);
return (r1);
}
// Call printint() with the given register
void cgprintint(int r) {
fprintf(Outfile, "\tmovq\t%s, %%rdi\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
================================================
FILE: 05_Statements/cgn.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Code generator for x86-64
// Copyright (c) 2019 Warren Toomey, GPL3
// List of available registers
// and their names
static int freereg[4];
static char *reglist[4] = { "r8", "r9", "r10", "r11" };
// Set all registers as available
void freeall_registers(void) {
freereg[0] = freereg[1] = freereg[2] = freereg[3] = 1;
}
// Allocate a free register. Return the number of
// the register. Die if no available registers.
static int alloc_register(void) {
for (int i = 0; i < 4; i++) {
if (freereg[i]) {
freereg[i] = 0;
return (i);
}
}
fprintf(stderr, "Out of registers!\n");
exit(1);
}
// Return a register to the list of available registers.
// Check to see if it's not already there.
static void free_register(int reg) {
if (freereg[reg] != 0) {
fprintf(stderr, "Error trying to free register %d\n", reg);
exit(1);
}
freereg[reg] = 1;
}
// Print out the assembly preamble
void cgpreamble() {
freeall_registers();
fputs("\tglobal\tmain\n"
"\textern\tprintf\n"
"\tsection\t.text\n"
"LC0:\tdb\t\"%d\",10,0\n"
"printint:\n"
"\tpush\trbp\n"
"\tmov\trbp, rsp\n"
"\tsub\trsp, 16\n"
"\tmov\t[rbp-4], edi\n"
"\tmov\teax, [rbp-4]\n"
"\tmov\tesi, eax\n"
"\tlea rdi, [rel LC0]\n"
"\tmov eax, 0\n"
"\tcall printf\n"
"\tnop\n"
"\tleave\n"
"\tret\n"
"\n"
"main:\n" "\tpush\trbp\n" "\tmov rbp, rsp\n", Outfile);
}
// Print out the assembly postamble
void cgpostamble() {
fputs("\tmov eax, 0\n" "\tpop rbp\n" "\tret\n", Outfile);
}
// Load an integer literal value into a register.
// Return the number of the register
int cgload(int value) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmov\t%s, %d\n", reglist[r], value);
return (r);
}
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\tadd\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r1);
return (r2);
}
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsub\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r2);
return (r1);
}
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timul\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r1);
return (r2);
}
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmov\trax, %s\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidiv\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmov\t%s, rax\n", reglist[r1]);
free_register(r2);
return (r1);
}
// Call printint() with the given register
void cgprintint(int r) {
fprintf(Outfile, "\tmov\trdi, %s\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
================================================
FILE: 05_Statements/data.h
================================================
#ifndef extern_
#define extern_ extern
#endif
// Global variables
// Copyright (c) 2019 Warren Toomey, GPL3
extern_ int Line; // Current line number
extern_ int Putback; // Character put back by scanner
extern_ FILE *Infile; // Input and output files
extern_ FILE *Outfile;
extern_ struct token Token; // Last token scanned
extern_ char Text[TEXTLEN + 1]; // Last identifier scanned
================================================
FILE: 05_Statements/decl.h
================================================
// Function prototypes for all compiler files
// Copyright (c) 2019 Warren Toomey, GPL3
// scan.c
int scan(struct token *t);
// tree.c
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue);
struct ASTnode *mkastleaf(int op, int intvalue);
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue);
// gen.c
int genAST(struct ASTnode *n);
void genpreamble();
void genpostamble();
void genfreeregs();
void genprintint(int reg);
// cg.c
void freeall_registers(void);
void cgpreamble();
void cgpostamble();
int cgload(int value);
int cgadd(int r1, int r2);
int cgsub(int r1, int r2);
int cgmul(int r1, int r2);
int cgdiv(int r1, int r2);
void cgprintint(int r);
// expr.c
struct ASTnode *binexpr(int ptp);
// stmt.c
void statements(void);
// misc.c
void match(int t, char *what);
void semi(void);
================================================
FILE: 05_Statements/defs.h
================================================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Structure and enum definitions
// Copyright (c) 2019 Warren Toomey, GPL3
#define TEXTLEN 512 // Length of symbols in input
// Token types
enum {
T_EOF, T_PLUS, T_MINUS, T_STAR, T_SLASH, T_INTLIT, T_SEMI, T_PRINT
};
// Token structure
struct token {
int token; // Token type, from the enum list above
int intvalue; // For T_INTLIT, the integer value
};
// AST node types
enum {
A_ADD, A_SUBTRACT, A_MULTIPLY, A_DIVIDE, A_INTLIT
};
// Abstract Syntax Tree structure
struct ASTnode {
int op; // "Operation" to be performed on this tree
struct ASTnode *left; // Left and right child trees
struct ASTnode *right;
int intvalue; // For A_INTLIT, the integer value
};
================================================
FILE: 05_Statements/expr.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of expressions
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse a primary factor and return an
// AST node representing it.
static struct ASTnode *primary(void) {
struct ASTnode *n;
// For an INTLIT token, make a leaf AST node for it
// and scan in the next token. Otherwise, a syntax error
// for any other token type.
switch (Token.token) {
case T_INTLIT:
n = mkastleaf(A_INTLIT, Token.intvalue);
scan(&Token);
return (n);
default:
fprintf(stderr, "syntax error on line %d, token %d\n", Line,
Token.token);
exit(1);
}
}
// Convert a binary operator token into an AST operation.
static int arithop(int tokentype) {
switch (tokentype) {
case T_PLUS:
return (A_ADD);
case T_MINUS:
return (A_SUBTRACT);
case T_STAR:
return (A_MULTIPLY);
case T_SLASH:
return (A_DIVIDE);
default:
fprintf(stderr, "syntax error on line %d, token %d\n", Line, tokentype);
exit(1);
}
}
// Operator precedence for each token
static int OpPrec[] = { 0, 10, 10, 20, 20, 0 };
// Check that we have a binary operator and
// return its precedence.
static int op_precedence(int tokentype) {
int prec = OpPrec[tokentype];
if (prec == 0) {
fprintf(stderr, "syntax error on line %d, token %d\n", Line, tokentype);
exit(1);
}
return (prec);
}
// Return an AST tree whose root is a binary operator.
// Parameter ptp is the previous token's precedence.
struct ASTnode *binexpr(int ptp) {
struct ASTnode *left, *right;
int tokentype;
// Get the integer literal on the left.
// Fetch the next token at the same time.
left = primary();
// If we hit a semicolon, return just the left node
tokentype = Token.token;
if (tokentype == T_SEMI)
return (left);
// While the precedence of this token is
// more than that of the previous token precedence
while (op_precedence(tokentype) > ptp) {
// Fetch in the next integer literal
scan(&Token);
// Recursively call binexpr() with the
// precedence of our token to build a sub-tree
right = binexpr(OpPrec[tokentype]);
// Join that sub-tree with ours. Convert the token
// into an AST operation at the same time.
left = mkastnode(arithop(tokentype), left, right, 0);
// Update the details of the current token.
// If we hit a semicolon, return just the left node
tokentype = Token.token;
if (tokentype == T_SEMI)
return (left);
}
// Return the tree we have when the precedence
// is the same or lower
return (left);
}
================================================
FILE: 05_Statements/gen.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Generic code generator
// Copyright (c) 2019 Warren Toomey, GPL3
// Given an AST, generate
// assembly code recursively
int genAST(struct ASTnode *n) {
int leftreg, rightreg;
// Get the left and right sub-tree values
if (n->left)
leftreg = genAST(n->left);
if (n->right)
rightreg = genAST(n->right);
switch (n->op) {
case A_ADD:
return (cgadd(leftreg, rightreg));
case A_SUBTRACT:
return (cgsub(leftreg, rightreg));
case A_MULTIPLY:
return (cgmul(leftreg, rightreg));
case A_DIVIDE:
return (cgdiv(leftreg, rightreg));
case A_INTLIT:
return (cgload(n->intvalue));
default:
fprintf(stderr, "Unknown AST operator %d\n", n->op);
exit(1);
}
}
void genpreamble() {
cgpreamble();
}
void genpostamble() {
cgpostamble();
}
void genfreeregs() {
freeall_registers();
}
void genprintint(int reg) {
cgprintint(reg);
}
================================================
FILE: 05_Statements/input01
================================================
print 12 * 3;
print
18 - 2
* 4; print
1 + 2 +
9 - 5/2 + 3*5;
================================================
FILE: 05_Statements/main.c
================================================
#include "defs.h"
#define extern_
#include "data.h"
#undef extern_
#include "decl.h"
#include <errno.h>
// Compiler setup and top-level execution
// Copyright (c) 2019 Warren Toomey, GPL3
// Initialise global variables
static void init() {
Line = 1;
Putback = '\n';
}
// Print out a usage if started incorrectly
static void usage(char *prog) {
fprintf(stderr, "Usage: %s infile\n", prog);
exit(1);
}
// Main program: check arguments and print a usage
// if we don't have an argument. Open up the input
// file and call scanfile() to scan the tokens in it.
void main(int argc, char *argv[]) {
if (argc != 2)
usage(argv[0]);
init();
// Open up the input file
if ((Infile = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Unable to open %s: %s\n", argv[1], strerror(errno));
exit(1);
}
// Create the output file
if ((Outfile = fopen("out.s", "w")) == NULL) {
fprintf(stderr, "Unable to create out.s: %s\n", strerror(errno));
exit(1);
}
scan(&Token); // Get the first token from the input
genpreamble(); // Output the preamble
statements(); // Parse the statements in the input
genpostamble(); // Output the postamble
fclose(Outfile); // Close the output file and exit
exit(0);
}
================================================
FILE: 05_Statements/misc.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Miscellaneous functions
// Copyright (c) 2019 Warren Toomey, GPL3
// Ensure that the current token is t,
// and fetch the next token. Otherwise
// throw an error
void match(int t, char *what) {
if (Token.token == t) {
scan(&Token);
} else {
printf("%s expected on line %d\n", what, Line);
exit(1);
}
}
// Match a semicon and fetch the next token
void semi(void) {
match(T_SEMI, ";");
}
================================================
FILE: 05_Statements/scan.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Lexical scanning
// Copyright (c) 2019 Warren Toomey, GPL3
// Return the position of character c
// in string s, or -1 if c not found
static int chrpos(char *s, int c) {
char *p;
p = strchr(s, c);
return (p ? p - s : -1);
}
// Get the next character from the input file.
static int next(void) {
int c;
if (Putback) { // Use the character put
c = Putback; // back if there is one
Putback = 0;
return (c);
}
c = fgetc(Infile); // Read from input file
if ('\n' == c)
Line++; // Increment line count
return (c);
}
// Put back an unwanted character
static void putback(int c) {
Putback = c;
}
// Skip past input that we don't need to deal with,
// i.e. whitespace, newlines. Return the first
// character we do need to deal with.
static int skip(void) {
int c;
c = next();
while (' ' == c || '\t' == c || '\n' == c || '\r' == c || '\f' == c) {
c = next();
}
return (c);
}
// Scan and return an integer literal
// value from the input file.
static int scanint(int c) {
int k, val = 0;
// Convert each character into an int value
while ((k = chrpos("0123456789", c)) >= 0) {
val = val * 10 + k;
c = next();
}
// We hit a non-integer character, put it back.
putback(c);
return (val);
}
// Scan an identifier from the input file and
// store it in buf[]. Return the identifier's length
static int scanident(int c, char *buf, int lim) {
int i = 0;
// Allow digits, alpha and underscores
while (isalpha(c) || isdigit(c) || '_' == c) {
// Error if we hit the identifier length limit,
// else append to buf[] and get next character
if (lim - 1 == i) {
printf("identifier too long on line %d\n", Line);
exit(1);
} else if (i < lim - 1) {
buf[i++] = c;
}
c = next();
}
// We hit a non-valid character, put it back.
// NUL-terminate the buf[] and return the length
putback(c);
buf[i] = '\0';
return (i);
}
// Given a word from the input, return the matching
// keyword token number or 0 if it's not a keyword.
// Switch on the first letter so that we don't have
// to waste time strcmp()ing against all the keywords.
static int keyword(char *s) {
switch (*s) {
case 'p':
if (!strcmp(s, "print"))
return (T_PRINT);
break;
}
return (0);
}
// Scan and return the next token found in the input.
// Return 1 if token valid, 0 if no tokens left.
int scan(struct token *t) {
int c, tokentype;
// Skip whitespace
c = skip();
// Determine the token based on
// the input character
switch (c) {
case EOF:
t->token = T_EOF;
return (0);
case '+':
t->token = T_PLUS;
break;
case '-':
t->token = T_MINUS;
break;
case '*':
t->token = T_STAR;
break;
case '/':
t->token = T_SLASH;
break;
case ';':
t->token = T_SEMI;
break;
default:
// If it's a digit, scan the
// literal integer value in
if (isdigit(c)) {
t->intvalue = scanint(c);
t->token = T_INTLIT;
break;
} else if (isalpha(c) || '_' == c) {
// Read in a keyword or identifier
scanident(c, Text, TEXTLEN);
// If it's a recognised keyword, return that token
if (tokentype = keyword(Text)) {
t->token = tokentype;
break;
}
// Not a recognised keyword, so an error for now
printf("Unrecognised symbol %s on line %d\n", Text, Line);
exit(1);
}
// The character isn't part of any recognised token, error
printf("Unrecognised character %c on line %d\n", c, Line);
exit(1);
}
// We found a token
return (1);
}
================================================
FILE: 05_Statements/stmt.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of statements
// Copyright (c) 2019 Warren Toomey, GPL3
// statements: statement
// | statement statements
// ;
//
// statement: 'print' expression ';'
// ;
// Parse one or more statements
void statements(void) {
struct ASTnode *tree;
int reg;
while (1) {
// Match a 'print' as the first token
match(T_PRINT, "print");
// Parse the following expression and
// generate the assembly code
tree = binexpr(0);
reg = genAST(tree);
genprintint(reg);
genfreeregs();
// Match the following semicolon
// and stop if we are at EOF
semi();
if (Token.token == T_EOF)
return;
}
}
================================================
FILE: 05_Statements/tree.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// AST tree functions
// Copyright (c) 2019 Warren Toomey, GPL3
// Build and return a generic AST node
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue) {
struct ASTnode *n;
// Malloc a new ASTnode
n = (struct ASTnode *) malloc(sizeof(struct ASTnode));
if (n == NULL) {
fprintf(stderr, "Unable to malloc in mkastnode()\n");
exit(1);
}
// Copy in the field values and return it
n->op = op;
n->left = left;
n->right = right;
n->intvalue = intvalue;
return (n);
}
// Make an AST leaf node
struct ASTnode *mkastleaf(int op, int intvalue) {
return (mkastnode(op, NULL, NULL, intvalue));
}
// Make a unary AST node: only one child
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue) {
return (mkastnode(op, left, NULL, intvalue));
}
================================================
FILE: 06_Variables/Makefile
================================================
SRCS= cg.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c
SRCN= cgn.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c
comp1: $(SRCS)
cc -o comp1 -g $(SRCS)
compn: $(SRCN)
cc -o compn -g $(SRCN)
clean:
rm -f comp1 compn *.o *.s out
test: comp1 input01 input02
./comp1 input01
cc -o out out.s
./out
./comp1 input02
cc -o out out.s
./out
testn: compn input01 input02
./compn input01
nasm -f elf64 out.s
cc -no-pie -o out out.o
./out
./compn input02
nasm -f elf64 out.s
cc -no-pie -o out out.o
./out
================================================
FILE: 06_Variables/Readme.md
================================================
# Part 6: Variables
I've just finished adding global variables to the compiler and, as I
suspected, it was a lot of work. Also, pretty much every file in the
compiler got modified in the process. So this part of the journey is
going to be long.
## What Do We Want from Variables?
We want to be able to:
+ Declare variables
+ Use variables to get stored values
+ Assign to variables
Here is `input02` which will be our test program:
```
int fred;
int jim;
fred= 5;
jim= 12;
print fred + jim;
```
The most obvious change is that the grammar now has
variable declarations, assignment statements and variables names in
expressions. However, before we get to that, let's look at how we
implement variables.
## The Symbol Table
Every compiler is going to need a
[symbol table](https://en.wikipedia.org/wiki/Symbol_table). Later on,
we will hold more than just global variables. But for now, here is
the structure of an entry in the table (from `defs.h`):
```c
// Symbol table structure
struct symtable {
char *name; // Name of a symbol
};
```
We have an array of symbols in `data.h`:
```c
#define NSYMBOLS 1024 // Number of symbol table entries
extern_ struct symtable Gsym[NSYMBOLS]; // Global symbol table
static int Globs = 0; // Position of next free global symbol slot
```
`Globs` is actually in `sym.c`, the file that manages the symbol table.
In here we have these management functions:
+ `int findglob(char *s)`: Determine if the symbol s is in the global
symbol table. Return its slot position or -1 if not found.
+ `static int newglob(void)`: Get the position of a new global symbol
slot, or die if we've run out of positions.
+ `int addglob(char *name)`: Add a global symbol to the symbol table.
Return the slot number in the symbol table.
The code is fairly straight forward, so I won't bother to give the code
here in the discussion. With these functions, we can find symbols and
add new symbols to the symbol table.
## Scanning and New Tokens
If you look at the example input file, we need a few new tokens:
+ 'int', known as T_INT
+ '=', known as T_EQUALS
+ identifier names, known as T_IDENT
The scanning of '=' is easy to add to `scan()`:
```c
case '=':
t->token = T_EQUALS; break;
```
We can add the 'int' keyword to `keyword()`:
```c
case 'i':
if (!strcmp(s, "int"))
return (T_INT);
break;
```
For identifiers, we are already using `scanident()` to store words into the
`Text` variable. Instead of dying if a word is not a keyword, we can
return a T_IDENT token:
```c
if (isalpha(c) || '_' == c) {
// Read in a keyword or identifier
scanident(c, Text, TEXTLEN);
// If it's a recognised keyword, return that token
if (tokentype = keyword(Text)) {
t->token = tokentype;
break;
}
// Not a recognised keyword, so it must be an identifier
t->token = T_IDENT;
break;
}
```
## The New Grammar
We're about ready to look at the changes to the grammar of our input
language. As before, I'll define it with BNF notation:
```
statements: statement
| statement statements
;
statement: 'print' expression ';'
| 'int' identifier ';'
| identifier '=' expression ';'
;
identifier: T_IDENT
;
```
An identifier is returned as a T_IDENT token, and we already have the code
to parse print statements. But, as we now have three types of statements,
it makes sense to write a function to deal with each one. Our top-level
`statements()` function in `stmt.c` now looks like:
```c
// Parse one or more statements
void statements(void) {
while (1) {
switch (Token.token) {
case T_PRINT:
print_statement();
break;
case T_INT:
var_declaration();
break;
case T_IDENT:
assignment_statement();
break;
case T_EOF:
return;
default:
fatald("Syntax error, token", Token.token);
}
}
}
```
I've moved the old print statement code into `print_statement()` and
you can browse that yourself.
## Variable Declarations
Let's look at variable declarations. This
is in a new file, `decl.c`, as we are going to have lots of other types
of declarations in the future.
```c
// Parse the declaration of a variable
void var_declaration(void) {
// Ensure we have an 'int' token followed by an identifier
// and a semicolon. Text now has the identifier's name.
// Add it as a known identifier
match(T_INT, "int");
ident();
addglob(Text);
genglobsym(Text);
semi();
}
```
The `ident()` and `semi()` functions are wrappers around `match()`:
```c
void semi(void) { match(T_SEMI, ";"); }
void ident(void) { match(T_IDENT, "identifier"); }
```
Back to `var_declaration()`, once we have scanned in the idenfiier into
the `Text` buffer, we can add this to the global symbol table with
`addglob(Text)`. The code in there allows a variable to be declared
multiple times (for now).
## Assignment Statements
Here's the code for `assignment_statement()` in `stmt.c`:
```c
void assignment_statement(void) {
struct ASTnode *left, *right, *tree;
int id;
// Ensure we have an identifier
ident();
// Check it's been defined then make a leaf node for it
if ((id = findglob(Text)) == -1) {
fatals("Undeclared variable", Text);
}
right = mkastleaf(A_LVIDENT, id);
// Ensure we have an equals sign
match(T_EQUALS, "=");
// Parse the following expression
left = binexpr(0);
// Make an assignment AST tree
tree = mkastnode(A_ASSIGN, left, right, 0);
// Generate the assembly code for the assignment
genAST(tree, -1);
genfreeregs();
// Match the following semicolon
semi();
}
```
We have a couple of new AST node types. A_ASSIGN takes the expression in
the left-hand child and assigns it to the right-hand child. And the
right-hand child will be an A_LVIDENT node.
Why did I call this node *A_LVIDENT*? Because it represents an *lvalue*
identifier. So what's an
[lvalue](https://en.wikipedia.org/wiki/Value_(computer_science)#lrvalue)?
An lvalue is a value that is tied to a specific location. Here, it's the
address in memory which holds a variable's value. When we do:
```
area = width * height;
```
we *assign* the result of the right-hand side (i.e. the *rvalue*) to the
variable in the left-hand side (i.e. the *lvalue*). The *rvalue* isn't tied
to a specific location. Here, the expression result is probably in some
arbitrary register.
Also note that, although the assignment statement has the syntax
```
identifier '=' expression ';'
```
we will make the expression the left sub-tree of the A_ASSIGN node
and save the A_LVIDENT details in the right sub-tree. Why? Because
we need to evaluate the expression *before* we save it into the variable.
## Changes to the AST Structure
We now need to store either an integer literal value in A_INTLIT AST nodes, or
the details of the symbol for A_IDENT AST nodes. I've added a *union* to the
AST structure to do this (in `defs.h`):
```c
// Abstract Syntax Tree structure
struct ASTnode {
int op; // "Operation" to be performed on this tree
struct ASTnode *left; // Left and right child trees
struct ASTnode *right;
union {
int intvalue; // For A_INTLIT, the integer value
int id; // For A_IDENT, the symbol slot number
} v;
};
```
## Generating the Assignment Code
Let's now look at the changes to `genAST()` in `gen.c`
```c
int genAST(struct ASTnode *n, int reg) {
int leftreg, rightreg;
// Get the left and right sub-tree values
if (n->left)
leftreg = genAST(n->left, -1);
if (n->right)
rightreg = genAST(n->right, leftreg);
switch (n->op) {
...
case A_INTLIT:
return (cgloadint(n->v.intvalue));
case A_IDENT:
return (cgloadglob(Gsym[n->v.id].name));
case A_LVIDENT:
return (cgstorglob(reg, Gsym[n->v.id].name));
case A_ASSIGN:
// The work has already been done, return the result
return (rightreg);
default:
fatald("Unknown AST operator", n->op);
}
```
Note that we evaluate the left-hand AST child first, and we get back
a register number that holds the left-hand sub-tree's value. We now
pass this register number to the right-hand sub-tree. We need to do
this for A_LVIDENT nodes, so that the `cgstorglob()` function in `cg.c`
knows which register holds the rvalue result of the assignment expression.
So, consider this AST tree:
```
A_ASSIGN
/ \
A_INTLIT A_LVIDENT
(3) (5)
```
We call `leftreg = genAST(n->left, -1);` to evaluate the A_INTLIT operation.
This will `return (cgloadint(n->v.intvalue));`, i.e. load a register with the
value 3 and return the register id.
Then, we call `rightreg = genAST(n->right, leftreg);` to evaluate the
A_LVIDENT operation. This will
`return (cgstorglob(reg, Gsym[n->v.id].name));`, i.e. store the
register into the variable whose name is in `Gsym[5]`.
Then we switch to the A_ASSIGN case. Well, all our work has already been done.
The rvalue is still in a register, so let's leave it there and return it.
Later, we'll be able to do expressions like:
```
a= b= c = 0;
```
where an assignment is not just a statement but also an expression.
## Generating x86-64 Code
You would have noticed that I changed the name of the old `cgload()`
function to `cgloadint()`. This is more specific. We now have a
function to load the value out of a global variable (in `cg.c`):
```c
int cgloadglob(char *identifier) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmovq\t%s(\%%rip), %s\n", identifier, reglist[r]);
return (r);
}
```
Similarly, we need a function to save a register into a variable:
```c
// Store a register's value into a variable
int cgstorglob(int r, char *identifier) {
fprintf(Outfile, "\tmovq\t%s, %s(\%%rip)\n", reglist[r], identifier);
return (r);
}
```
We also need a function to create a new global integer variable:
```c
// Generate a global symbol
void cgglobsym(char *sym) {
fprintf(Outfile, "\t.comm\t%s,8,8\n", sym);
}
```
Of course, we can't let the parser access this code directly. Instead,
there is a function in the generic code generator in `gen.c`
that acts as the interface:
```c
void genglobsym(char *s) { cgglobsym(s); }
```
## Variables in Expressions
So now we can assign to variables. But how do we get a variable's value into
an expression. Well, we already have a `primary()` function to get an
integer literal. Let's modify it to also load a variable's value:
```c
// Parse a primary factor and return an
// AST node representing it.
static struct ASTnode *primary(void) {
struct ASTnode *n;
int id;
switch (Token.token) {
case T_INTLIT:
// For an INTLIT token, make a leaf AST node for it.
n = mkastleaf(A_INTLIT, Token.intvalue);
break;
case T_IDENT:
// Check that this identifier exists
id = findglob(Text);
if (id == -1)
fatals("Unknown variable", Text);
// Make a leaf AST node for it
n = mkastleaf(A_IDENT, id);
break;
default:
fatald("Syntax error, token", Token.token);
}
// Scan in the next token and return the leaf node
scan(&Token);
return (n);
}
```
Note the syntax checking in the T_IDENT case to ensure the variable has
been declared before we try to use it.
Also note that the AST leaf node that *retrieves* a variable's value is
an A_IDENT node. The leaf that saves into a variable is an A_LVIDENT node.
This is the difference between *rvalues* and *lvalues*.
## Trying It Out
I think that's about it for variable declarations, so let's try it out
with the `input02` file:
```
int fred;
int jim;
fred= 5;
jim= 12;
print fred + jim;
```
We can `make test` to do this:
```
$ make test
cc -o comp1 -g cg.c decl.c expr.c gen.c main.c misc.c scan.c
stmt.c sym.c tree.c
...
./comp1 input02
cc -o out out.s
./out
17
```
As you can see, we calculated `fred + jim` which is 5 + 12 or 17.
Here are the new assembly lines in `out.s`:
```
.comm fred,8,8 # Declare fred
.comm jim,8,8 # Declare jim
...
movq $5, %r8
movq %r8, fred(%rip) # fred = 5
movq $12, %r8
movq %r8, jim(%rip) # jim = 12
movq fred(%rip), %r8
movq jim(%rip), %r9
addq %r8, %r9 # fred + jim
```
## Other Changes
I've probably made a few other changes. The only main one that I can
remember is to create some helper functions in `misc.c` to make it
easier to report fatal errors:
```c
// Print out fatal messages
void fatal(char *s) {
fprintf(stderr, "%s on line %d\n", s, Line); exit(1);
}
void fatals(char *s1, char *s2) {
fprintf(stderr, "%s:%s on line %d\n", s1, s2, Line); exit(1);
}
void fatald(char *s, int d) {
fprintf(stderr, "%s:%d on line %d\n", s, d, Line); exit(1);
}
void fatalc(char *s, int c) {
fprintf(stderr, "%s:%c on line %d\n", s, c, Line); exit(1);
}
```
## Conclusion and What's Next
So that was a lot of work. We had to write the beginnings of symbol
table management. We had to deal with two new statement types. We
had to add some new tokens and some new AST node types. Finally, we
had to add some code to generate the correct x86-64 assembly output.
Try writing a few example input files and see if the compiler works
as it should, especially if it detects syntax errors and semantic
errors (variable use without a declaration).
In the next part of our compiler writing journey, we will
add the six comparison operators to our language. That will
allow us to start on the control structures in the part after that. [Next step](../07_Comparisons/Readme.md)
================================================
FILE: 06_Variables/cg.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Code generator for x86-64
// Copyright (c) 2019 Warren Toomey, GPL3
// List of available registers and their names
static int freereg[4];
static char *reglist[4] = { "%r8", "%r9", "%r10", "%r11" };
// Set all registers as available
void freeall_registers(void) {
freereg[0] = freereg[1] = freereg[2] = freereg[3] = 1;
}
// Allocate a free register. Return the number of
// the register. Die if no available registers.
static int alloc_register(void) {
for (int i = 0; i < 4; i++) {
if (freereg[i]) {
freereg[i] = 0;
return (i);
}
}
fatal("Out of registers");
}
// Return a register to the list of available registers.
// Check to see if it's not already there.
static void free_register(int reg) {
if (freereg[reg] != 0)
fatald("Error trying to free register", reg);
freereg[reg] = 1;
}
// Print out the assembly preamble
void cgpreamble() {
freeall_registers();
fputs("\t.text\n"
".LC0:\n"
"\t.string\t\"%d\\n\"\n"
"printint:\n"
"\tpushq\t%rbp\n"
"\tmovq\t%rsp, %rbp\n"
"\tsubq\t$16, %rsp\n"
"\tmovl\t%edi, -4(%rbp)\n"
"\tmovl\t-4(%rbp), %eax\n"
"\tmovl\t%eax, %esi\n"
"\tleaq .LC0(%rip), %rdi\n"
"\tmovl $0, %eax\n"
"\tcall printf@PLT\n"
"\tnop\n"
"\tleave\n"
"\tret\n"
"\n"
"\t.globl\tmain\n"
"\t.type\tmain, @function\n"
"main:\n" "\tpushq\t%rbp\n" "\tmovq %rsp, %rbp\n", Outfile);
}
// Print out the assembly postamble
void cgpostamble() {
fputs("\tmovl $0, %eax\n" "\tpopq %rbp\n" "\tret\n", Outfile);
}
// Load an integer literal value into a register.
// Return the number of the register
int cgloadint(int value) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmovq\t$%d, %s\n", value, reglist[r]);
return (r);
}
// Load a value from a variable into a register.
// Return the number of the register
int cgloadglob(char *identifier) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmovq\t%s(\%%rip), %s\n", identifier, reglist[r]);
return (r);
}
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\taddq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return (r2);
}
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsubq\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r2);
return (r1);
}
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timulq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return (r2);
}
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmovq\t%s,%%rax\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidivq\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmovq\t%%rax,%s\n", reglist[r1]);
free_register(r2);
return (r1);
}
// Call printint() with the given register
void cgprintint(int r) {
fprintf(Outfile, "\tmovq\t%s, %%rdi\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
// Store a register's value into a variable
int cgstorglob(int r, char *identifier) {
fprintf(Outfile, "\tmovq\t%s, %s(\%%rip)\n", reglist[r], identifier);
return (r);
}
// Generate a global symbol
void cgglobsym(char *sym) {
fprintf(Outfile, "\t.comm\t%s,8,8\n", sym);
}
================================================
FILE: 06_Variables/cgn.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Code generator for x86-64
// Copyright (c) 2019 Warren Toomey, GPL3
// List of available registers and their names
static int freereg[4];
static char *reglist[4] = { "r8", "r9", "r10", "r11" };
// Set all registers as available
void freeall_registers(void) {
freereg[0] = freereg[1] = freereg[2] = freereg[3] = 1;
}
// Allocate a free register. Return the number of
// the register. Die if no available registers.
static int alloc_register(void) {
for (int i = 0; i < 4; i++) {
if (freereg[i]) {
freereg[i] = 0;
return (i);
}
}
fatal("Out of registers");
}
// Return a register to the list of available registers.
// Check to see if it's not already there.
static void free_register(int reg) {
if (freereg[reg] != 0)
fatald("Error trying to free register", reg);
freereg[reg] = 1;
}
// Print out the assembly preamble
void cgpreamble() {
freeall_registers();
fputs("\tglobal\tmain\n"
"\textern\tprintf\n"
"\tsection\t.text\n"
"LC0:\tdb\t\"%d\",10,0\n"
"printint:\n"
"\tpush\trbp\n"
"\tmov\trbp, rsp\n"
"\tsub\trsp, 16\n"
"\tmov\t[rbp-4], edi\n"
"\tmov\teax, [rbp-4]\n"
"\tmov\tesi, eax\n"
"\tlea rdi, [rel LC0]\n"
"\tmov eax, 0\n"
"\tcall printf\n"
"\tnop\n"
"\tleave\n"
"\tret\n"
"\n"
"main:\n" "\tpush\trbp\n" "\tmov rbp, rsp\n", Outfile);
}
// Print out the assembly postamble
void cgpostamble() {
fputs("\tmov eax, 0\n" "\tpop rbp\n" "\tret\n", Outfile);
}
// Load an integer literal value into a register.
// Return the number of the register
int cgloadint(int value) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmov\t%s, %d\n", reglist[r], value);
return (r);
}
// Load a value from a variable into a register.
// Return the number of the register
int cgloadglob(char *identifier) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmov\t%s, [%s]\n", reglist[r], identifier);
return (r);
}
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\tadd\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r1);
return (r2);
}
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsub\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r2);
return (r1);
}
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timul\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r1);
return (r2);
}
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmov\trax, %s\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidiv\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmov\t%s, rax\n", reglist[r1]);
free_register(r2);
return (r1);
}
// Call printint() with the given register
void cgprintint(int r) {
fprintf(Outfile, "\tmov\trdi, %s\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
// Store a register's value into a variable
int cgstorglob(int r, char *identifier) {
fprintf(Outfile, "\tmov\t[%s], %s\n", identifier, reglist[r]);
return (r);
}
// Generate a global symbol
void cgglobsym(char *sym) {
fprintf(Outfile, "\tcommon\t%s 8:8\n", sym);
}
================================================
FILE: 06_Variables/data.h
================================================
#ifndef extern_
#define extern_ extern
#endif
// Global variables
// Copyright (c) 2019 Warren Toomey, GPL3
extern_ int Line; // Current line number
extern_ int Putback; // Character put back by scanner
extern_ FILE *Infile; // Input and output files
extern_ FILE *Outfile;
extern_ struct token Token; // Last token scanned
extern_ char Text[TEXTLEN + 1]; // Last identifier scanned
extern_ struct symtable Gsym[NSYMBOLS]; // Global symbol table
================================================
FILE: 06_Variables/decl.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of declarations
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse the declaration of a variable
void var_declaration(void) {
// Ensure we have an 'int' token followed by an identifier
// and a semicolon. Text now has the identifier's name.
// Add it as a known identifier
match(T_INT, "int");
ident();
addglob(Text);
genglobsym(Text);
semi();
}
================================================
FILE: 06_Variables/decl.h
================================================
// Function prototypes for all compiler files
// Copyright (c) 2019 Warren Toomey, GPL3
// scan.c
int scan(struct token *t);
// tree.c
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue);
struct ASTnode *mkastleaf(int op, int intvalue);
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue);
// gen.c
int genAST(struct ASTnode *n, int reg);
void genpreamble();
void genpostamble();
void genfreeregs();
void genprintint(int reg);
void genglobsym(char *s);
// cg.c
void freeall_registers(void);
void cgpreamble();
void cgpostamble();
int cgloadint(int value);
int cgloadglob(char *identifier);
int cgadd(int r1, int r2);
int cgsub(int r1, int r2);
int cgmul(int r1, int r2);
int cgdiv(int r1, int r2);
void cgprintint(int r);
int cgstorglob(int r, char *identifier);
void cgglobsym(char *sym);
// expr.c
struct ASTnode *binexpr(int ptp);
// stmt.c
void statements(void);
// misc.c
void match(int t, char *what);
void semi(void);
void ident(void);
void fatal(char *s);
void fatals(char *s1, char *s2);
void fatald(char *s, int d);
void fatalc(char *s, int c);
// sym.c
int findglob(char *s);
int addglob(char *name);
// decl.c
void var_declaration(void);
================================================
FILE: 06_Variables/defs.h
================================================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Structure and enum definitions
// Copyright (c) 2019 Warren Toomey, GPL3
#define TEXTLEN 512 // Length of symbols in input
#define NSYMBOLS 1024 // Number of symbol table entries
// Token types
enum {
T_EOF, T_PLUS, T_MINUS, T_STAR, T_SLASH, T_INTLIT, T_SEMI, T_EQUALS,
T_IDENT,
// Keywords
T_PRINT, T_INT
};
// Token structure
struct token {
int token; // Token type, from the enum list above
int intvalue; // For T_INTLIT, the integer value
};
// AST node types
enum {
A_ADD, A_SUBTRACT, A_MULTIPLY, A_DIVIDE, A_INTLIT,
A_IDENT, A_LVIDENT, A_ASSIGN
};
// Abstract Syntax Tree structure
struct ASTnode {
int op; // "Operation" to be performed on this tree
struct ASTnode *left; // Left and right child trees
struct ASTnode *right;
union {
int intvalue; // For A_INTLIT, the integer value
int id; // For A_IDENT, the symbol slot number
} v;
};
// Symbol table structure
struct symtable {
char *name; // Name of a symbol
};
================================================
FILE: 06_Variables/expr.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of expressions
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse a primary factor and return an
// AST node representing it.
static struct ASTnode *primary(void) {
struct ASTnode *n;
int id;
switch (Token.token) {
case T_INTLIT:
// For an INTLIT token, make a leaf AST node for it.
n = mkastleaf(A_INTLIT, Token.intvalue);
break;
case T_IDENT:
// Check that this identifier exists
id = findglob(Text);
if (id == -1)
fatals("Unknown variable", Text);
// Make a leaf AST node for it
n = mkastleaf(A_IDENT, id);
break;
default:
fatald("Syntax error, token", Token.token);
}
// Scan in the next token and return the leaf node
scan(&Token);
return (n);
}
// Convert a binary operator token into an AST operation.
static int arithop(int tokentype) {
switch (tokentype) {
case T_PLUS:
return (A_ADD);
case T_MINUS:
return (A_SUBTRACT);
case T_STAR:
return (A_MULTIPLY);
case T_SLASH:
return (A_DIVIDE);
default:
fatald("Syntax error, token", tokentype);
}
}
// Operator precedence for each token
static int OpPrec[] = { 0, 10, 10, 20, 20, 0 };
// Check that we have a binary operator and
// return its precedence.
static int op_precedence(int tokentype) {
int prec = OpPrec[tokentype];
if (prec == 0)
fatald("Syntax error, token", tokentype);
return (prec);
}
// Return an AST tree whose root is a binary operator.
// Parameter ptp is the previous token's precedence.
struct ASTnode *binexpr(int ptp) {
struct ASTnode *left, *right;
int tokentype;
// Get the primary tree on the left.
// Fetch the next token at the same time.
left = primary();
// If we hit a semicolon, return just the left node
tokentype = Token.token;
if (tokentype == T_SEMI)
return (left);
// While the precedence of this token is
// more than that of the previous token precedence
while (op_precedence(tokentype) > ptp) {
// Fetch in the next integer literal
scan(&Token);
// Recursively call binexpr() with the
// precedence of our token to build a sub-tree
right = binexpr(OpPrec[tokentype]);
// Join that sub-tree with ours. Convert the token
// into an AST operation at the same time.
left = mkastnode(arithop(tokentype), left, right, 0);
// Update the details of the current token.
// If we hit a semicolon, return just the left node
tokentype = Token.token;
if (tokentype == T_SEMI)
return (left);
}
// Return the tree we have when the precedence
// is the same or lower
return (left);
}
================================================
FILE: 06_Variables/gen.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Generic code generator
// Copyright (c) 2019 Warren Toomey, GPL3
// Given an AST, generate assembly code recursively.
// Return the register id with the tree's final value
int genAST(struct ASTnode *n, int reg) {
int leftreg, rightreg;
// Get the left and right sub-tree values
if (n->left)
leftreg = genAST(n->left, -1);
if (n->right)
rightreg = genAST(n->right, leftreg);
switch (n->op) {
case A_ADD:
return (cgadd(leftreg, rightreg));
case A_SUBTRACT:
return (cgsub(leftreg, rightreg));
case A_MULTIPLY:
return (cgmul(leftreg, rightreg));
case A_DIVIDE:
return (cgdiv(leftreg, rightreg));
case A_INTLIT:
return (cgloadint(n->v.intvalue));
case A_IDENT:
return (cgloadglob(Gsym[n->v.id].name));
case A_LVIDENT:
return (cgstorglob(reg, Gsym[n->v.id].name));
case A_ASSIGN:
// The work has already been done, return the result
return (rightreg);
default:
fatald("Unknown AST operator", n->op);
}
}
void genpreamble() {
cgpreamble();
}
void genpostamble() {
cgpostamble();
}
void genfreeregs() {
freeall_registers();
}
void genprintint(int reg) {
cgprintint(reg);
}
void genglobsym(char *s) {
cgglobsym(s);
}
================================================
FILE: 06_Variables/input01
================================================
print 12 * 3;
print
18 - 2
* 4; print
1 + 2 +
9 - 5/2 + 3*5;
================================================
FILE: 06_Variables/input02
================================================
int fred;
int jim;
fred= 5;
jim= 12;
print fred + jim;
================================================
FILE: 06_Variables/input03
================================================
int x;
x= 1; print x;
x= x + 1; print x;
x= x + 1; print x;
x= x + 1; print x;
x= x + 1; print x;
================================================
FILE: 06_Variables/main.c
================================================
#include "defs.h"
#define extern_
#include "data.h"
#undef extern_
#include "decl.h"
#include <errno.h>
// Compiler setup and top-level execution
// Copyright (c) 2019 Warren Toomey, GPL3
// Initialise global variables
static void init() {
Line = 1;
Putback = '\n';
}
// Print out a usage if started incorrectly
static void usage(char *prog) {
fprintf(stderr, "Usage: %s infile\n", prog);
exit(1);
}
// Main program: check arguments and print a usage
// if we don't have an argument. Open up the input
// file and call scanfile() to scan the tokens in it.
void main(int argc, char *argv[]) {
if (argc != 2)
usage(argv[0]);
init();
// Open up the input file
if ((Infile = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Unable to open %s: %s\n", argv[1], strerror(errno));
exit(1);
}
// Create the output file
if ((Outfile = fopen("out.s", "w")) == NULL) {
fprintf(stderr, "Unable to create out.s: %s\n", strerror(errno));
exit(1);
}
scan(&Token); // Get the first token from the input
genpreamble(); // Output the preamble
statements(); // Parse the statements in the input
genpostamble(); // Output the postamble
fclose(Outfile); // Close the output file and exit
exit(0);
}
================================================
FILE: 06_Variables/misc.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Miscellaneous functions
// Copyright (c) 2019 Warren Toomey, GPL3
// Ensure that the current token is t,
// and fetch the next token. Otherwise
// throw an error
void match(int t, char *what) {
if (Token.token == t) {
scan(&Token);
} else {
fatals("Expected", what);
}
}
// Match a semicolon and fetch the next token
void semi(void) {
match(T_SEMI, ";");
}
// Match an identifier and fetch the next token
void ident(void) {
match(T_IDENT, "identifier");
}
// Print out fatal messages
void fatal(char *s) {
fprintf(stderr, "%s on line %d\n", s, Line); exit(1);
}
void fatals(char *s1, char *s2) {
fprintf(stderr, "%s:%s on line %d\n", s1, s2, Line); exit(1);
}
void fatald(char *s, int d) {
fprintf(stderr, "%s:%d on line %d\n", s, d, Line); exit(1);
}
void fatalc(char *s, int c) {
fprintf(stderr, "%s:%c on line %d\n", s, c, Line); exit(1);
}
================================================
FILE: 06_Variables/scan.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Lexical scanning
// Copyright (c) 2019 Warren Toomey, GPL3
// Return the position of character c
// in string s, or -1 if c not found
static int chrpos(char *s, int c) {
char *p;
p = strchr(s, c);
return (p ? p - s : -1);
}
// Get the next character from the input file.
static int next(void) {
int c;
if (Putback) { // Use the character put
c = Putback; // back if there is one
Putback = 0;
return (c);
}
c = fgetc(Infile); // Read from input file
if ('\n' == c)
Line++; // Increment line count
return (c);
}
// Put back an unwanted character
static void putback(int c) {
Putback = c;
}
// Skip past input that we don't need to deal with,
// i.e. whitespace, newlines. Return the first
// character we do need to deal with.
static int skip(void) {
int c;
c = next();
while (' ' == c || '\t' == c || '\n' == c || '\r' == c || '\f' == c) {
c = next();
}
return (c);
}
// Scan and return an integer literal
// value from the input file.
static int scanint(int c) {
int k, val = 0;
// Convert each character into an int value
while ((k = chrpos("0123456789", c)) >= 0) {
val = val * 10 + k;
c = next();
}
// We hit a non-integer character, put it back.
putback(c);
return (val);
}
// Scan an identifier from the input file and
// store it in buf[]. Return the identifier's length
static int scanident(int c, char *buf, int lim) {
int i = 0;
// Allow digits, alpha and underscores
while (isalpha(c) || isdigit(c) || '_' == c) {
// Error if we hit the identifier length limit,
// else append to buf[] and get next character
if (lim - 1 == i) {
fatal("Identifier too long");
} else if (i < lim - 1) {
buf[i++] = c;
}
c = next();
}
// We hit a non-valid character, put it back.
// NUL-terminate the buf[] and return the length
putback(c);
buf[i] = '\0';
return (i);
}
// Given a word from the input, return the matching
// keyword token number or 0 if it's not a keyword.
// Switch on the first letter so that we don't have
// to waste time strcmp()ing against all the keywords.
static int keyword(char *s) {
switch (*s) {
case 'i':
if (!strcmp(s, "int"))
return (T_INT);
break;
case 'p':
if (!strcmp(s, "print"))
return (T_PRINT);
break;
}
return (0);
}
// Scan and return the next token found in the input.
// Return 1 if token valid, 0 if no tokens left.
int scan(struct token *t) {
int c, tokentype;
// Skip whitespace
c = skip();
// Determine the token based on
// the input character
switch (c) {
case EOF:
t->token = T_EOF;
return (0);
case '+':
t->token = T_PLUS;
break;
case '-':
t->token = T_MINUS;
break;
case '*':
t->token = T_STAR;
break;
case '/':
t->token = T_SLASH;
break;
case ';':
t->token = T_SEMI;
break;
case '=':
t->token = T_EQUALS;
break;
default:
// If it's a digit, scan the
// literal integer value in
if (isdigit(c)) {
t->intvalue = scanint(c);
t->token = T_INTLIT;
break;
} else if (isalpha(c) || '_' == c) {
// Read in a keyword or identifier
scanident(c, Text, TEXTLEN);
// If it's a recognised keyword, return that token
if (tokentype = keyword(Text)) {
t->token = tokentype;
break;
}
// Not a recognised keyword, so it must be an identifier
t->token = T_IDENT;
break;
}
// The character isn't part of any recognised token, error
fatalc("Unrecognised character", c);
}
// We found a token
return (1);
}
================================================
FILE: 06_Variables/stmt.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of statements
// Copyright (c) 2019 Warren Toomey, GPL3
// statements: statement
// | statement statements
// ;
//
// statement: 'print' expression ';'
// | 'int' identifier ';'
// | identifier '=' expression ';'
// ;
//
// identifier: T_IDENT
// ;
void print_statement(void) {
struct ASTnode *tree;
int reg;
// Match a 'print' as the first token
match(T_PRINT, "print");
// Parse the following expression and
// generate the assembly code
tree = binexpr(0);
reg = genAST(tree, -1);
genprintint(reg);
genfreeregs();
// Match the following semicolon
semi();
}
void assignment_statement(void) {
struct ASTnode *left, *right, *tree;
int id;
// Ensure we have an identifier
ident();
// Check it's been defined then make a leaf node for it
if ((id = findglob(Text)) == -1) {
fatals("Undeclared variable", Text);
}
right = mkastleaf(A_LVIDENT, id);
// Ensure we have an equals sign
match(T_EQUALS, "=");
// Parse the following expression
left = binexpr(0);
// Make an assignment AST tree
tree = mkastnode(A_ASSIGN, left, right, 0);
// Generate the assembly code for the assignment
genAST(tree, -1);
genfreeregs();
// Match the following semicolon
semi();
}
// Parse one or more statements
void statements(void) {
while (1) {
switch (Token.token) {
case T_PRINT:
print_statement();
break;
case T_INT:
var_declaration();
break;
case T_IDENT:
assignment_statement();
break;
case T_EOF:
return;
default:
fatald("Syntax error, token", Token.token);
}
}
}
================================================
FILE: 06_Variables/sym.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Symbol table functions
// Copyright (c) 2019 Warren Toomey, GPL3
static int Globs = 0; // Position of next free global symbol slot
// Determine if the symbol s is in the global symbol table.
// Return its slot position or -1 if not found.
int findglob(char *s) {
int i;
for (i = 0; i < Globs; i++) {
if (*s == *Gsym[i].name && !strcmp(s, Gsym[i].name))
return (i);
}
return (-1);
}
// Get the position of a new global symbol slot, or die
// if we've run out of positions.
static int newglob(void) {
int p;
if ((p = Globs++) >= NSYMBOLS)
fatal("Too many global symbols");
return (p);
}
// Add a global symbol to the symbol table.
// Return the slot number in the symbol table
int addglob(char *name) {
int y;
// If this is already in the symbol table, return the existing slot
if ((y = findglob(name)) != -1)
return (y);
// Otherwise get a new slot, fill it in and
// return the slot number
y = newglob();
Gsym[y].name = strdup(name);
return (y);
}
================================================
FILE: 06_Variables/tree.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// AST tree functions
// Copyright (c) 2019 Warren Toomey, GPL3
// Build and return a generic AST node
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue) {
struct ASTnode *n;
// Malloc a new ASTnode
n = (struct ASTnode *) malloc(sizeof(struct ASTnode));
if (n == NULL)
fatal("Unable to malloc in mkastnode()");
// Copy in the field values and return it
n->op = op;
n->left = left;
n->right = right;
n->v.intvalue = intvalue;
return (n);
}
// Make an AST leaf node
struct ASTnode *mkastleaf(int op, int intvalue) {
return (mkastnode(op, NULL, NULL, intvalue));
}
// Make a unary AST node: only one child
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue) {
return (mkastnode(op, left, NULL, intvalue));
}
================================================
FILE: 07_Comparisons/Makefile
================================================
SRCS= cg.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c
SRCN= cgn.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c
comp1: $(SRCS)
cc -o comp1 -g $(SRCS)
compn: $(SRCN)
cc -o compn -g $(SRCN)
clean:
rm -f comp1 compn *.o *.s out
test: comp1 input04
./comp1 input04
cc -o out out.s
./out
testn: compn input04
./compn input04
nasm -f elf64 out.s
cc -no-pie -o out out.o
./out
================================================
FILE: 07_Comparisons/Readme.md
================================================
# Part 7: Comparison Operators
I was going to add IF statements next, but then I realised that I'd
better add some comparison operators first. This turned out to be quite
easy, because they are binary operators like the existing ones.
So let's quickly see what the changes are to add the six comparison
operators: `==`, `!=`, `<`, `>`, `<=` and `>=`.
## Adding New Tokens
We will have six new tokens, so let's add them to `defs.h`:
```c
// Token types
enum {
T_EOF,
T_PLUS, T_MINUS,
T_STAR, T_SLASH,
T_EQ, T_NE,
T_LT, T_GT, T_LE, T_GE,
T_INTLIT, T_SEMI, T_ASSIGN, T_IDENT,
// Keywords
T_PRINT, T_INT
};
```
I've rearranged the tokens so that the ones with precedence come, in
low-to-high precedence order, before the tokens that don't have any
precedence.
## Scanning The Tokens
Now we have to scan them in. Note that we have to distinguish between
`=` and `==`, `<` and `<=`, `>` and `>=`. So we will need to read in
an extra character from the input and put it back if we don't need it.
Here's the new code in `scan()` from `scan.c`:
```c
case '=':
if ((c = next()) == '=') {
t->token = T_EQ;
} else {
putback(c);
t->token = T_ASSIGN;
}
break;
case '!':
if ((c = next()) == '=') {
t->token = T_NE;
} else {
fatalc("Unrecognised character", c);
}
break;
case '<':
if ((c = next()) == '=') {
t->token = T_LE;
} else {
putback(c);
t->token = T_LT;
}
break;
case '>':
if ((c = next()) == '=') {
t->token = T_GE;
} else {
putback(c);
t->token = T_GT;
}
break;
```
I also changed the name of the `=` token to T_ASSIGN to ensure I didn't get
confused between it and the new T_EQ token.
## New Expression Code
We can now scan in the six new tokens. So now we have to parse them when
they appear in expressions, and also enforce their operator precedence.
By now you would have worked out that:
+ I'm building what will become a self-compiling compiler
+ in the C language
+ using the SubC compiler as a reference.
The implication is that I'm writing a compiler for enough of a subset of
C (just as SubC) so that it will compile itself. Therefore, I should use
the normal
[C operator precedence order](https://en.cppreference.com/w/c/language/operator_precedence). This means that the comparison operators have lower precedence
than multiply and divide.
I also realised that the switch statement I was using to map tokens to AST
node types was only going to get bigger. So I decided to rearrange the
AST node types so that there is a 1:1 mapping between them for all the
binary operators (in `defs.h`):
```c
// AST node types. The first few line up
// with the related tokens
enum {
A_ADD=1, A_SUBTRACT, A_MULTIPLY, A_DIVIDE,
A_EQ, A_NE, A_LT, A_GT, A_LE, A_GE,
A_INTLIT,
A_IDENT, A_LVIDENT, A_ASSIGN
};
```
Now in `expr.c`, I can simplify the token to AST node conversion and also
add in the new tokens' precedence:
```c
// Convert a binary operator token into an AST operation.
// We rely on a 1:1 mapping from token to AST operation
static int arithop(int tokentype) {
if (tokentype > T_EOF && tokentype < T_INTLIT)
return(tokentype);
fatald("Syntax error, token", tokentype);
}
// Operator precedence for each token. Must
// match up with the order of tokens in defs.h
static int OpPrec[] = {
0, 10, 10, // T_EOF, T_PLUS, T_MINUS
20, 20, // T_STAR, T_SLASH
30, 30, // T_EQ, T_NE
40, 40, 40, 40 // T_LT, T_GT, T_LE, T_GE
};
```
That's it for the parsing and operator precedence!
## Code Generation
As the six new operators are binary operators, it's easy to modify the
generic code generator in `gen.c` to deal with them:
```c
case A_EQ:
return (cgequal(leftreg, rightreg));
case A_NE:
return (cgnotequal(leftreg, rightreg));
case A_LT:
return (cglessthan(leftreg, rightreg));
case A_GT:
return (cggreaterthan(leftreg, rightreg));
case A_LE:
return (cglessequal(leftreg, rightreg));
case A_GE:
return (cggreaterequal(leftreg, rightreg));
```
## x86-64 Code Generation
Now it gets a bit tricky. In C, the comparison operators return a value.
If they evaluate true, their result is 1. If they evaluate false, their
result is 0. We need to write x86-64 assembly code to reflect this.
Luckily there are some x86-64 instructions to do this. Unfortunately,
there are some issues to deal with along the way. Consider this
x86-64 instruction:
```
cmpq %r8,%r9
```
The above `cmpq` instruction performs %r9 - %r8 and sets several status
flags including the negative and zero flags. Thus, we can look at the
flag combinations to see the result of the comparisons:
| Comparison | Operation | Flags If True |
|------------|-----------|---------------|
| %r8 == %r9 | %r9 - %r8 | Zero |
| %r8 != %r9 | %r9 - %r8 | Not Zero |
| %r8 > %r9 | %r9 - %r8 | Not Zero, Negative |
| %r8 < %r9 | %r9 - %r8 | Not Zero, Not Negative |
| %r8 >= %r9 | %r9 - %r8 | Zero or Negative |
| %r8 <= %r9 | %r9 - %r8 | Zero or Not Negative |
There are six x86-64 instructions which set a register to 1 or 0 based on
the two flag values: `sete`, `setne`, `setg`, `setl`, `setge`
and `setle` in the order of the above table rows.
The problem is, these instructions only set the lowest byte of a register.
If the register already has bits set outside of the lowest byte, they will
stay set. So we might set a variable to 1, but if it already has the value
1000 (decimal), then it will now be 1001 which is not what we want.
The solution is to `andq` the register after the `setX` instruction to
get rid of the unwanted bits. In `cg.c` there is a general comparison
function to do this:
```c
// Compare two registers.
static int cgcompare(int r1, int r2, char *how) {
fprintf(Outfile, "\tcmpq\t%s, %s\n", reglist[r2], reglist[r1]);
fprintf(Outfile, "\t%s\t%s\n", how, breglist[r2]);
fprintf(Outfile, "\tandq\t$255,%s\n", reglist[r2]);
free_register(r1);
return (r2);
}
```
where `how` is one of the `setX` instructions. Note that we perform
```
cmpq reglist[r2], reglist[r1]
```
because this is actually `reglist[r1] - reglist[r2]` which is what we really
want.
## x86-64 Registers
We need to take a short diversion here to discuss the registers in the
x86-64 architecture. x86-64 has several 64-bit general purpose registers,
but we can also use different register names to access and work on
subsections of these registers.

The above image from *stack.imgur.com* shows that, for the 64-bit *r8* register,
we can access the low 32 bits of this register by using the "*r8d*" register.
Similarly, the "*r8w*" register is the low 16 bits and the "*r8b*" register
is the low 8 bits of the *r8* register.
In the `cgcompare()` function, the code uses the `reglist[]` array to
compare the two 64-bit registers, but then sets a flag in the 8-bit
version of the second register by using the names in the `breglist[]` array.
The x86-64 architecture only allows the `setX` instructions to operate on
the 8-bit register names, thus the need for the `breglist[]` array.
## Creating Several Compare Instructions
Now that we have this general function, we can write the six actual
comparison functions:
```c
int cgequal(int r1, int r2) { return(cgcompare(r1, r2, "sete")); }
int cgnotequal(int r1, int r2) { return(cgcompare(r1, r2, "setne")); }
int cglessthan(int r1, int r2) { return(cgcompare(r1, r2, "setl")); }
int cggreaterthan(int r1, int r2) { return(cgcompare(r1, r2, "setg")); }
int cglessequal(int r1, int r2) { return(cgcompare(r1, r2, "setle")); }
int cggreaterequal(int r1, int r2) { return(cgcompare(r1, r2, "setge")); }
```
As with the other binary operator functions, one register is freed and
the other register returns with the result.
# Putting It Into Action
Have a look at the `input04` input file:
```c
int x;
x= 7 < 9; print x;
x= 7 <= 9; print x;
x= 7 != 9; print x;
x= 7 == 7; print x;
x= 7 >= 7; print x;
x= 7 <= 7; print x;
x= 9 > 7; print x;
x= 9 >= 7; print x;
x= 9 != 7; print x;
```
All of these comparisons are true, so we should print nine 1s out. Do
a `make test` to confirm this.
Let's look at the assembly code output by the first comparison:
```
movq $7, %r8
movq $9, %r9
cmpq %r9, %r8 # Perform %r8 - %r9, i.e. 7 - 9
setl %r9b # Set %r9b to 1 if 7 is less than 9
andq $255,%r9 # Remove all other bits in %r9
movq %r9, x(%rip) # Save the result in x
movq x(%rip), %r8
movq %r8, %rdi
call printint # Print x out
```
Yes there is some inefficient assembly code above. We haven't even started
to worry about optimised code yet. To quote Donald Knuth:
> **Premature optimization is the root of all evil (or at least most of it)
in programming.**
## Conclusion and What's Next
That was a nice and easy addition to the compiler. The next part of the
journey will be much more complicated.
In the next part of our compiler writing journey, we will add IF statements
to the compiler and make use of the comparison operators that we just added. [Next step](../08_If_Statements/Readme.md)
================================================
FILE: 07_Comparisons/cg.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Code generator for x86-64
// Copyright (c) 2019 Warren Toomey, GPL3
// List of available registers and their names
// We need a list of byte registers, too
static int freereg[4];
static char *reglist[4] = { "%r8", "%r9", "%r10", "%r11" };
static char *breglist[4] = { "%r8b", "%r9b", "%r10b", "%r11b" };
// Set all registers as available
void freeall_registers(void) {
freereg[0] = freereg[1] = freereg[2] = freereg[3] = 1;
}
// Allocate a free register. Return the number of
// the register. Die if no available registers.
static int alloc_register(void) {
for (int i = 0; i < 4; i++) {
if (freereg[i]) {
freereg[i] = 0;
return (i);
}
}
fatal("Out of registers");
}
// Return a register to the list of available registers.
// Check to see if it's not already there.
static void free_register(int reg) {
if (freereg[reg] != 0)
fatald("Error trying to free register", reg);
freereg[reg] = 1;
}
// Print out the assembly preamble
void cgpreamble() {
freeall_registers();
fputs("\t.text\n"
".LC0:\n"
"\t.string\t\"%d\\n\"\n"
"printint:\n"
"\tpushq\t%rbp\n"
"\tmovq\t%rsp, %rbp\n"
"\tsubq\t$16, %rsp\n"
"\tmovl\t%edi, -4(%rbp)\n"
"\tmovl\t-4(%rbp), %eax\n"
"\tmovl\t%eax, %esi\n"
"\tleaq .LC0(%rip), %rdi\n"
"\tmovl $0, %eax\n"
"\tcall printf@PLT\n"
"\tnop\n"
"\tleave\n"
"\tret\n"
"\n"
"\t.globl\tmain\n"
"\t.type\tmain, @function\n"
"main:\n" "\tpushq\t%rbp\n" "\tmovq %rsp, %rbp\n", Outfile);
}
// Print out the assembly postamble
void cgpostamble() {
fputs("\tmovl $0, %eax\n" "\tpopq %rbp\n" "\tret\n", Outfile);
}
// Load an integer literal value into a register.
// Return the number of the register
int cgloadint(int value) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmovq\t$%d, %s\n", value, reglist[r]);
return (r);
}
// Load a value from a variable into a register.
// Return the number of the register
int cgloadglob(char *identifier) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmovq\t%s(\%%rip), %s\n", identifier, reglist[r]);
return (r);
}
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\taddq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return (r2);
}
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsubq\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r2);
return (r1);
}
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timulq\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r1);
return (r2);
}
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmovq\t%s,%%rax\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidivq\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmovq\t%%rax,%s\n", reglist[r1]);
free_register(r2);
return (r1);
}
// Call printint() with the given register
void cgprintint(int r) {
fprintf(Outfile, "\tmovq\t%s, %%rdi\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
// Store a register's value into a variable
int cgstorglob(int r, char *identifier) {
fprintf(Outfile, "\tmovq\t%s, %s(\%%rip)\n", reglist[r], identifier);
return (r);
}
// Generate a global symbol
void cgglobsym(char *sym) {
fprintf(Outfile, "\t.comm\t%s,8,8\n", sym);
}
// Compare two registers.
static int cgcompare(int r1, int r2, char *how) {
fprintf(Outfile, "\tcmpq\t%s, %s\n", reglist[r2], reglist[r1]);
fprintf(Outfile, "\t%s\t%s\n", how, breglist[r2]);
fprintf(Outfile, "\tandq\t$255,%s\n", reglist[r2]);
free_register(r1);
return (r2);
}
int cgequal(int r1, int r2) { return(cgcompare(r1, r2, "sete")); }
int cgnotequal(int r1, int r2) { return(cgcompare(r1, r2, "setne")); }
int cglessthan(int r1, int r2) { return(cgcompare(r1, r2, "setl")); }
int cggreaterthan(int r1, int r2) { return(cgcompare(r1, r2, "setg")); }
int cglessequal(int r1, int r2) { return(cgcompare(r1, r2, "setle")); }
int cggreaterequal(int r1, int r2) { return(cgcompare(r1, r2, "setge")); }
================================================
FILE: 07_Comparisons/cgn.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Code generator for x86-64
// Copyright (c) 2019 Warren Toomey, GPL3
// List of available registers and their names
static int freereg[4];
static char *reglist[4] = { "r8", "r9", "r10", "r11" };
static char *breglist[4] = { "r8b", "r9b", "r10b", "r11b" };
// Set all registers as available
void freeall_registers(void) {
freereg[0] = freereg[1] = freereg[2] = freereg[3] = 1;
}
// Allocate a free register. Return the number of
// the register. Die if no available registers.
static int alloc_register(void) {
for (int i = 0; i < 4; i++) {
if (freereg[i]) {
freereg[i] = 0;
return (i);
}
}
fatal("Out of registers");
}
// Return a register to the list of available registers.
// Check to see if it's not already there.
static void free_register(int reg) {
if (freereg[reg] != 0)
fatald("Error trying to free register", reg);
freereg[reg] = 1;
}
// Print out the assembly preamble
void cgpreamble() {
freeall_registers();
fputs("\tglobal\tmain\n"
"\textern\tprintf\n"
"\tsection\t.text\n"
"LC0:\tdb\t\"%d\",10,0\n"
"printint:\n"
"\tpush\trbp\n"
"\tmov\trbp, rsp\n"
"\tsub\trsp, 16\n"
"\tmov\t[rbp-4], edi\n"
"\tmov\teax, [rbp-4]\n"
"\tmov\tesi, eax\n"
"\tlea rdi, [rel LC0]\n"
"\tmov eax, 0\n"
"\tcall printf\n"
"\tnop\n"
"\tleave\n"
"\tret\n"
"\n"
"main:\n" "\tpush\trbp\n" "\tmov rbp, rsp\n", Outfile);
}
// Print out the assembly postamble
void cgpostamble() {
fputs("\tmov eax, 0\n" "\tpop rbp\n" "\tret\n", Outfile);
}
// Load an integer literal value into a register.
// Return the number of the register
int cgloadint(int value) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmov\t%s, %d\n", reglist[r], value);
return (r);
}
// Load a value from a variable into a register.
// Return the number of the register
int cgloadglob(char *identifier) {
// Get a new register
int r = alloc_register();
// Print out the code to initialise it
fprintf(Outfile, "\tmov\t%s, [%s]\n", reglist[r], identifier);
return (r);
}
// Add two registers together and return
// the number of the register with the result
int cgadd(int r1, int r2) {
fprintf(Outfile, "\tadd\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r1);
return (r2);
}
// Subtract the second register from the first and
// return the number of the register with the result
int cgsub(int r1, int r2) {
fprintf(Outfile, "\tsub\t%s, %s\n", reglist[r1], reglist[r2]);
free_register(r2);
return (r1);
}
// Multiply two registers together and return
// the number of the register with the result
int cgmul(int r1, int r2) {
fprintf(Outfile, "\timul\t%s, %s\n", reglist[r2], reglist[r1]);
free_register(r1);
return (r2);
}
// Divide the first register by the second and
// return the number of the register with the result
int cgdiv(int r1, int r2) {
fprintf(Outfile, "\tmov\trax, %s\n", reglist[r1]);
fprintf(Outfile, "\tcqo\n");
fprintf(Outfile, "\tidiv\t%s\n", reglist[r2]);
fprintf(Outfile, "\tmov\t%s, rax\n", reglist[r1]);
free_register(r2);
return (r1);
}
// Call printint() with the given register
void cgprintint(int r) {
fprintf(Outfile, "\tmov\trdi, %s\n", reglist[r]);
fprintf(Outfile, "\tcall\tprintint\n");
free_register(r);
}
// Store a register's value into a variable
int cgstorglob(int r, char *identifier) {
fprintf(Outfile, "\tmov\t[%s], %s\n", identifier, reglist[r]);
return (r);
}
// Generate a global symbol
void cgglobsym(char *sym) {
fprintf(Outfile, "\tcommon\t%s 8:8\n", sym);
}
// Compare two registers.
static int cgcompare(int r1, int r2, char *how) {
fprintf(Outfile, "\tcmp\t%s, %s\n", reglist[r1], reglist[r2]);
fprintf(Outfile, "\t%s\t%s\n", how, breglist[r2]);
fprintf(Outfile, "\tand\t%s, 255\n", reglist[r2]);
free_register(r1);
return (r2);
}
int cgequal(int r1, int r2) { return(cgcompare(r1, r2, "sete")); }
int cgnotequal(int r1, int r2) { return(cgcompare(r1, r2, "setne")); }
int cglessthan(int r1, int r2) { return(cgcompare(r1, r2, "setl")); }
int cggreaterthan(int r1, int r2) { return(cgcompare(r1, r2, "setg")); }
int cglessequal(int r1, int r2) { return(cgcompare(r1, r2, "setle")); }
int cggreaterequal(int r1, int r2) { return(cgcompare(r1, r2, "setge")); }
================================================
FILE: 07_Comparisons/data.h
================================================
#ifndef extern_
#define extern_ extern
#endif
// Global variables
// Copyright (c) 2019 Warren Toomey, GPL3
extern_ int Line; // Current line number
extern_ int Putback; // Character put back by scanner
extern_ FILE *Infile; // Input and output files
extern_ FILE *Outfile;
extern_ struct token Token; // Last token scanned
extern_ char Text[TEXTLEN + 1]; // Last identifier scanned
extern_ struct symtable Gsym[NSYMBOLS]; // Global symbol table
================================================
FILE: 07_Comparisons/decl.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of declarations
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse the declaration of a variable
void var_declaration(void) {
// Ensure we have an 'int' token followed by an identifier
// and a semicolon. Text now has the identifier's name.
// Add it as a known identifier
match(T_INT, "int");
ident();
addglob(Text);
genglobsym(Text);
semi();
}
================================================
FILE: 07_Comparisons/decl.h
================================================
// Function prototypes for all compiler files
// Copyright (c) 2019 Warren Toomey, GPL3
// scan.c
int scan(struct token *t);
// tree.c
struct ASTnode *mkastnode(int op, struct ASTnode *left,
struct ASTnode *right, int intvalue);
struct ASTnode *mkastleaf(int op, int intvalue);
struct ASTnode *mkastunary(int op, struct ASTnode *left, int intvalue);
// gen.c
int genAST(struct ASTnode *n, int reg);
void genpreamble();
void genpostamble();
void genfreeregs();
void genprintint(int reg);
void genglobsym(char *s);
// cg.c
void freeall_registers(void);
void cgpreamble();
void cgpostamble();
int cgloadint(int value);
int cgloadglob(char *identifier);
int cgadd(int r1, int r2);
int cgsub(int r1, int r2);
int cgmul(int r1, int r2);
int cgdiv(int r1, int r2);
void cgprintint(int r);
int cgstorglob(int r, char *identifier);
void cgglobsym(char *sym);
int cgequal(int r1, int r2);
int cgnotequal(int r1, int r2);
int cglessthan(int r1, int r2);
int cggreaterthan(int r1, int r2);
int cglessequal(int r1, int r2);
int cggreaterequal(int r1, int r2);
// expr.c
struct ASTnode *binexpr(int ptp);
// stmt.c
void statements(void);
// misc.c
void match(int t, char *what);
void semi(void);
void ident(void);
void fatal(char *s);
void fatals(char *s1, char *s2);
void fatald(char *s, int d);
void fatalc(char *s, int c);
// sym.c
int findglob(char *s);
int addglob(char *name);
// decl.c
void var_declaration(void);
================================================
FILE: 07_Comparisons/defs.h
================================================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Structure and enum definitions
// Copyright (c) 2019 Warren Toomey, GPL3
#define TEXTLEN 512 // Length of symbols in input
#define NSYMBOLS 1024 // Number of symbol table entries
// Token types
enum {
T_EOF,
T_PLUS, T_MINUS,
T_STAR, T_SLASH,
T_EQ, T_NE,
T_LT, T_GT, T_LE, T_GE,
T_INTLIT, T_SEMI, T_ASSIGN, T_IDENT,
// Keywords
T_PRINT, T_INT
};
// Token structure
struct token {
int token; // Token type, from the enum list above
int intvalue; // For T_INTLIT, the integer value
};
// AST node types. The first few line up
// with the related tokens
enum {
A_ADD=1, A_SUBTRACT, A_MULTIPLY, A_DIVIDE,
A_EQ, A_NE, A_LT, A_GT, A_LE, A_GE,
A_INTLIT,
A_IDENT, A_LVIDENT, A_ASSIGN
};
// Abstract Syntax Tree structure
struct ASTnode {
int op; // "Operation" to be performed on this tree
struct ASTnode *left; // Left and right child trees
struct ASTnode *right;
union {
int intvalue; // For A_INTLIT, the integer value
int id; // For A_IDENT, the symbol slot number
} v;
};
// Symbol table structure
struct symtable {
char *name; // Name of a symbol
};
================================================
FILE: 07_Comparisons/expr.c
================================================
#include "defs.h"
#include "data.h"
#include "decl.h"
// Parsing of expressions
// Copyright (c) 2019 Warren Toomey, GPL3
// Parse a prima
Showing preview only (234K chars total). Download the full file or copy to clipboard to get everything.
gitextract_us1gy_yo/ ├── 00_Introduction/ │ ├── Figs/ │ │ └── parsing_steps.dia │ └── Readme.md ├── 01_Scanner/ │ ├── Makefile │ ├── Readme.md │ ├── data.h │ ├── decl.h │ ├── defs.h │ ├── input01 │ ├── input02 │ ├── input03 │ ├── input04 │ ├── input05 │ ├── main.c │ └── scan.c ├── 02_Parser/ │ ├── Makefile │ ├── Readme.md │ ├── data.h │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── input01 │ ├── input02 │ ├── input03 │ ├── input04 │ ├── input05 │ ├── interp.c │ ├── main.c │ ├── scan.c │ └── tree.c ├── 03_Precedence/ │ ├── Makefile │ ├── Readme.md │ ├── data.h │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── expr2.c │ ├── input01 │ ├── input02 │ ├── input03 │ ├── input04 │ ├── input05 │ ├── interp.c │ ├── main.c │ ├── scan.c │ └── tree.c ├── 04_Assembly/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── input01 │ ├── input02 │ ├── interp.c │ ├── main.c │ ├── scan.c │ └── tree.c ├── 05_Statements/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── input01 │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ └── tree.c ├── 06_Variables/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── input01 │ ├── input02 │ ├── input03 │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ └── tree.c ├── 07_Comparisons/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── input01 │ ├── input02 │ ├── input03 │ ├── input04 │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ └── tree.c ├── 08_If_Statements/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── input01 │ ├── input02 │ ├── input03 │ ├── input04 │ ├── input05 │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ └── tree.c ├── 09_While_Loops/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01 │ │ ├── input02 │ │ ├── input03 │ │ ├── input04 │ │ ├── input05 │ │ ├── input06 │ │ ├── mktests │ │ ├── mktestsn │ │ ├── out.input01 │ │ ├── out.input02 │ │ ├── out.input03 │ │ ├── out.input04 │ │ ├── out.input05 │ │ ├── out.input06 │ │ ├── runtests │ │ └── runtestsn │ └── tree.c ├── 10_For_Loops/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01 │ │ ├── input02 │ │ ├── input03 │ │ ├── input04 │ │ ├── input05 │ │ ├── input06 │ │ ├── input07 │ │ ├── mktests │ │ ├── mktestsn │ │ ├── out.input01 │ │ ├── out.input02 │ │ ├── out.input03 │ │ ├── out.input04 │ │ ├── out.input05 │ │ ├── out.input06 │ │ ├── out.input07 │ │ ├── runtests │ │ └── runtestsn │ └── tree.c ├── 11_Functions_pt1/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01 │ │ ├── input02 │ │ ├── input03 │ │ ├── input04 │ │ ├── input05 │ │ ├── input06 │ │ ├── input07 │ │ ├── input08 │ │ ├── input09 │ │ ├── mktests │ │ ├── mktestsn │ │ ├── out.input01 │ │ ├── out.input02 │ │ ├── out.input03 │ │ ├── out.input04 │ │ ├── out.input05 │ │ ├── out.input06 │ │ ├── out.input07 │ │ ├── out.input08 │ │ ├── out.input09 │ │ ├── runtests │ │ └── runtestsn │ └── tree.c ├── 12_Types_pt1/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01 │ │ ├── input02 │ │ ├── input03 │ │ ├── input04 │ │ ├── input05 │ │ ├── input06 │ │ ├── input07 │ │ ├── input08 │ │ ├── input09 │ │ ├── input10 │ │ ├── mktests │ │ ├── mktestsn │ │ ├── out.input01 │ │ ├── out.input02 │ │ ├── out.input03 │ │ ├── out.input04 │ │ ├── out.input05 │ │ ├── out.input06 │ │ ├── out.input07 │ │ ├── out.input08 │ │ ├── out.input09 │ │ ├── out.input10 │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 13_Functions_pt2/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01 │ │ ├── input02 │ │ ├── input03 │ │ ├── input04 │ │ ├── input05 │ │ ├── input06 │ │ ├── input07 │ │ ├── input08 │ │ ├── input09 │ │ ├── input10 │ │ ├── input11 │ │ ├── input12 │ │ ├── input13 │ │ ├── input14 │ │ ├── mktests │ │ ├── mktestsn │ │ ├── out.input01 │ │ ├── out.input02 │ │ ├── out.input03 │ │ ├── out.input04 │ │ ├── out.input05 │ │ ├── out.input06 │ │ ├── out.input07 │ │ ├── out.input08 │ │ ├── out.input09 │ │ ├── out.input10 │ │ ├── out.input11 │ │ ├── out.input12 │ │ ├── out.input13 │ │ ├── out.input14 │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 14_ARM_Platform/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01 │ │ ├── input02 │ │ ├── input03 │ │ ├── input04 │ │ ├── input05 │ │ ├── input06 │ │ ├── input07 │ │ ├── input08 │ │ ├── input09 │ │ ├── input10 │ │ ├── input11 │ │ ├── input12 │ │ ├── input13 │ │ ├── input14 │ │ ├── mktests │ │ ├── mktestsn │ │ ├── out.input01 │ │ ├── out.input02 │ │ ├── out.input03 │ │ ├── out.input04 │ │ ├── out.input05 │ │ ├── out.input06 │ │ ├── out.input07 │ │ ├── out.input08 │ │ ├── out.input09 │ │ ├── out.input10 │ │ ├── out.input11 │ │ ├── out.input12 │ │ ├── out.input13 │ │ ├── out.input14 │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 15_Pointers_pt1/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 16_Global_Vars/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 17_Scaling_Offsets/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 18_Lvalues_Revisited/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 19_Arrays_pt1/ │ ├── Makefile │ ├── Notes │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 20_Char_Str_Literals/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 21_More_Operators/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 22_Design_Locals/ │ └── Readme.md ├── 23_Local_Variables/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 24_Function_Params/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── input27a.c │ ├── input27b.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 25_Function_Arguments/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 26_Prototypes/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 27_Testing_Errors/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── lib/ │ │ └── printint.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 28_Runtime_Flags/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 29_Refactoring/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 30_Design_Composites/ │ ├── Figs/ │ │ ├── newsymlists.dia │ │ └── structunion1.dia │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 31_Struct_Declarations/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 32_Struct_Access_pt1/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 33_Unions/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── input62.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── out.input62.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 34_Enums_and_Typedefs/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── err.input64.c │ │ ├── err.input65.c │ │ ├── err.input66.c │ │ ├── err.input68.c │ │ ├── err.input69.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── input62.c │ │ ├── input63.c │ │ ├── input64.c │ │ ├── input65.c │ │ ├── input66.c │ │ ├── input67.c │ │ ├── input68.c │ │ ├── input69.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── out.input62.c │ │ ├── out.input63.c │ │ ├── out.input67.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 35_Preprocessor/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── fcntl.h │ │ ├── stddef.h │ │ └── stdio.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── err.input64.c │ │ ├── err.input65.c │ │ ├── err.input66.c │ │ ├── err.input68.c │ │ ├── err.input69.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── input62.c │ │ ├── input63.c │ │ ├── input64.c │ │ ├── input65.c │ │ ├── input66.c │ │ ├── input67.c │ │ ├── input68.c │ │ ├── input69.c │ │ ├── input70.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── out.input62.c │ │ ├── out.input63.c │ │ ├── out.input67.c │ │ ├── out.input70.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 36_Break_Continue/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── fcntl.h │ │ ├── stddef.h │ │ └── stdio.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── err.input64.c │ │ ├── err.input65.c │ │ ├── err.input66.c │ │ ├── err.input68.c │ │ ├── err.input69.c │ │ ├── err.input72.c │ │ ├── err.input73.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── input62.c │ │ ├── input63.c │ │ ├── input64.c │ │ ├── input65.c │ │ ├── input66.c │ │ ├── input67.c │ │ ├── input68.c │ │ ├── input69.c │ │ ├── input70.c │ │ ├── input71.c │ │ ├── input72.c │ │ ├── input73.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── out.input62.c │ │ ├── out.input63.c │ │ ├── out.input67.c │ │ ├── out.input70.c │ │ ├── out.input71.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 37_Switch/ │ ├── Figs/ │ │ ├── switch_ast.dia │ │ ├── switch_logic.dia │ │ └── switch_logic2.dia │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── fcntl.h │ │ ├── stddef.h │ │ └── stdio.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── err.input64.c │ │ ├── err.input65.c │ │ ├── err.input66.c │ │ ├── err.input68.c │ │ ├── err.input69.c │ │ ├── err.input72.c │ │ ├── err.input73.c │ │ ├── err.input75.c │ │ ├── err.input76.c │ │ ├── err.input77.c │ │ ├── err.input78.c │ │ ├── err.input79.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── input62.c │ │ ├── input63.c │ │ ├── input64.c │ │ ├── input65.c │ │ ├── input66.c │ │ ├── input67.c │ │ ├── input68.c │ │ ├── input69.c │ │ ├── input70.c │ │ ├── input71.c │ │ ├── input72.c │ │ ├── input73.c │ │ ├── input74.c │ │ ├── input75.c │ │ ├── input76.c │ │ ├── input77.c │ │ ├── input78.c │ │ ├── input79.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── out.input62.c │ │ ├── out.input63.c │ │ ├── out.input67.c │ │ ├── out.input70.c │ │ ├── out.input71.c │ │ ├── out.input74.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 38_Dangling_Else/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── fcntl.h │ │ ├── stddef.h │ │ └── stdio.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── err.input64.c │ │ ├── err.input65.c │ │ ├── err.input66.c │ │ ├── err.input68.c │ │ ├── err.input69.c │ │ ├── err.input72.c │ │ ├── err.input73.c │ │ ├── err.input75.c │ │ ├── err.input76.c │ │ ├── err.input77.c │ │ ├── err.input78.c │ │ ├── err.input79.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── input62.c │ │ ├── input63.c │ │ ├── input64.c │ │ ├── input65.c │ │ ├── input66.c │ │ ├── input67.c │ │ ├── input68.c │ │ ├── input69.c │ │ ├── input70.c │ │ ├── input71.c │ │ ├── input72.c │ │ ├── input73.c │ │ ├── input74.c │ │ ├── input75.c │ │ ├── input76.c │ │ ├── input77.c │ │ ├── input78.c │ │ ├── input79.c │ │ ├── input80.c │ │ ├── input81.c │ │ ├── input82.c │ │ ├── input83.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── out.input62.c │ │ ├── out.input63.c │ │ ├── out.input67.c │ │ ├── out.input70.c │ │ ├── out.input71.c │ │ ├── out.input74.c │ │ ├── out.input80.c │ │ ├── out.input81.c │ │ ├── out.input82.c │ │ ├── out.input83.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 39_Var_Initialisation_pt1/ │ ├── Figs/ │ │ └── decl_call_graph.dia │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── fcntl.h │ │ ├── stddef.h │ │ └── stdio.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── err.input64.c │ │ ├── err.input65.c │ │ ├── err.input66.c │ │ ├── err.input68.c │ │ ├── err.input69.c │ │ ├── err.input72.c │ │ ├── err.input73.c │ │ ├── err.input75.c │ │ ├── err.input76.c │ │ ├── err.input77.c │ │ ├── err.input78.c │ │ ├── err.input79.c │ │ ├── err.input85.c │ │ ├── err.input86.c │ │ ├── err.input87.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── input62.c │ │ ├── input63.c │ │ ├── input64.c │ │ ├── input65.c │ │ ├── input66.c │ │ ├── input67.c │ │ ├── input68.c │ │ ├── input69.c │ │ ├── input70.c │ │ ├── input71.c │ │ ├── input72.c │ │ ├── input73.c │ │ ├── input74.c │ │ ├── input75.c │ │ ├── input76.c │ │ ├── input77.c │ │ ├── input78.c │ │ ├── input79.c │ │ ├── input80.c │ │ ├── input81.c │ │ ├── input82.c │ │ ├── input83.c │ │ ├── input84.c │ │ ├── input85.c │ │ ├── input86.c │ │ ├── input87.c │ │ ├── input88.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── out.input62.c │ │ ├── out.input63.c │ │ ├── out.input67.c │ │ ├── out.input70.c │ │ ├── out.input71.c │ │ ├── out.input74.c │ │ ├── out.input80.c │ │ ├── out.input81.c │ │ ├── out.input82.c │ │ ├── out.input83.c │ │ ├── out.input84.c │ │ ├── out.input88.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 40_Var_Initialisation_pt2/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── fcntl.h │ │ ├── stddef.h │ │ └── stdio.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input31.c │ │ ├── err.input32.c │ │ ├── err.input33.c │ │ ├── err.input34.c │ │ ├── err.input35.c │ │ ├── err.input36.c │ │ ├── err.input37.c │ │ ├── err.input38.c │ │ ├── err.input39.c │ │ ├── err.input40.c │ │ ├── err.input41.c │ │ ├── err.input42.c │ │ ├── err.input43.c │ │ ├── err.input44.c │ │ ├── err.input45.c │ │ ├── err.input46.c │ │ ├── err.input47.c │ │ ├── err.input48.c │ │ ├── err.input49.c │ │ ├── err.input50.c │ │ ├── err.input51.c │ │ ├── err.input52.c │ │ ├── err.input56.c │ │ ├── err.input57.c │ │ ├── err.input59.c │ │ ├── err.input60.c │ │ ├── err.input61.c │ │ ├── err.input64.c │ │ ├── err.input65.c │ │ ├── err.input66.c │ │ ├── err.input68.c │ │ ├── err.input69.c │ │ ├── err.input72.c │ │ ├── err.input73.c │ │ ├── err.input75.c │ │ ├── err.input76.c │ │ ├── err.input77.c │ │ ├── err.input78.c │ │ ├── err.input79.c │ │ ├── err.input85.c │ │ ├── err.input86.c │ │ ├── err.input87.c │ │ ├── err.input92.c │ │ ├── err.input93.c │ │ ├── err.input94.c │ │ ├── err.input95.c │ │ ├── err.input96.c │ │ ├── err.input97.c │ │ ├── err.input98.c │ │ ├── input01.c │ │ ├── input02.c │ │ ├── input03.c │ │ ├── input04.c │ │ ├── input05.c │ │ ├── input06.c │ │ ├── input07.c │ │ ├── input08.c │ │ ├── input09.c │ │ ├── input10.c │ │ ├── input11.c │ │ ├── input12.c │ │ ├── input13.c │ │ ├── input14.c │ │ ├── input15.c │ │ ├── input16.c │ │ ├── input17.c │ │ ├── input18.c │ │ ├── input18a.c │ │ ├── input19.c │ │ ├── input20.c │ │ ├── input21.c │ │ ├── input22.c │ │ ├── input23.c │ │ ├── input24.c │ │ ├── input25.c │ │ ├── input26.c │ │ ├── input27.c │ │ ├── input28.c │ │ ├── input29.c │ │ ├── input30.c │ │ ├── input31.c │ │ ├── input32.c │ │ ├── input33.c │ │ ├── input34.c │ │ ├── input35.c │ │ ├── input36.c │ │ ├── input37.c │ │ ├── input38.c │ │ ├── input39.c │ │ ├── input40.c │ │ ├── input41.c │ │ ├── input42.c │ │ ├── input43.c │ │ ├── input44.c │ │ ├── input45.c │ │ ├── input46.c │ │ ├── input47.c │ │ ├── input48.c │ │ ├── input49.c │ │ ├── input50.c │ │ ├── input51.c │ │ ├── input52.c │ │ ├── input53.c │ │ ├── input54.c │ │ ├── input55.c │ │ ├── input56.c │ │ ├── input57.c │ │ ├── input58.c │ │ ├── input59.c │ │ ├── input60.c │ │ ├── input61.c │ │ ├── input62.c │ │ ├── input63.c │ │ ├── input64.c │ │ ├── input65.c │ │ ├── input66.c │ │ ├── input67.c │ │ ├── input68.c │ │ ├── input69.c │ │ ├── input70.c │ │ ├── input71.c │ │ ├── input72.c │ │ ├── input73.c │ │ ├── input74.c │ │ ├── input75.c │ │ ├── input76.c │ │ ├── input77.c │ │ ├── input78.c │ │ ├── input79.c │ │ ├── input80.c │ │ ├── input81.c │ │ ├── input82.c │ │ ├── input83.c │ │ ├── input84.c │ │ ├── input85.c │ │ ├── input86.c │ │ ├── input87.c │ │ ├── input88.c │ │ ├── input89.c │ │ ├── input90.c │ │ ├── input91.c │ │ ├── input92.c │ │ ├── input93.c │ │ ├── input94.c │ │ ├── input95.c │ │ ├── input96.c │ │ ├── input97.c │ │ ├── input98.c │ │ ├── input99.c │ │ ├── mktests │ │ ├── out.input01.c │ │ ├── out.input02.c │ │ ├── out.input03.c │ │ ├── out.input04.c │ │ ├── out.input05.c │ │ ├── out.input06.c │ │ ├── out.input07.c │ │ ├── out.input08.c │ │ ├── out.input09.c │ │ ├── out.input10.c │ │ ├── out.input11.c │ │ ├── out.input12.c │ │ ├── out.input13.c │ │ ├── out.input14.c │ │ ├── out.input15.c │ │ ├── out.input16.c │ │ ├── out.input17.c │ │ ├── out.input18.c │ │ ├── out.input18a.c │ │ ├── out.input19.c │ │ ├── out.input20.c │ │ ├── out.input21.c │ │ ├── out.input22.c │ │ ├── out.input23.c │ │ ├── out.input24.c │ │ ├── out.input25.c │ │ ├── out.input26.c │ │ ├── out.input27.c │ │ ├── out.input28.c │ │ ├── out.input29.c │ │ ├── out.input30.c │ │ ├── out.input53.c │ │ ├── out.input54.c │ │ ├── out.input55.c │ │ ├── out.input58.c │ │ ├── out.input62.c │ │ ├── out.input63.c │ │ ├── out.input67.c │ │ ├── out.input70.c │ │ ├── out.input71.c │ │ ├── out.input74.c │ │ ├── out.input80.c │ │ ├── out.input81.c │ │ ├── out.input82.c │ │ ├── out.input83.c │ │ ├── out.input84.c │ │ ├── out.input88.c │ │ ├── out.input89.c │ │ ├── out.input90.c │ │ ├── out.input91.c │ │ ├── out.input99.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 41_Local_Var_Init/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── fcntl.h │ │ ├── stddef.h │ │ └── stdio.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 42_Casting/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 43_More_Operators/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 44_Fold_Optimisation/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 45_Globals_Again/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 46_Void_Functions/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 47_Sizeof/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 48_Static/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 49_Ternary/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 50_Mop_up_pt1/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 51_Arrays_pt2/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── err.input124.c │ │ ├── err.input126.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── input124.c │ │ ├── input125.c │ │ ├── input126.c │ │ ├── input127.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── out.input125.c │ │ ├── out.input127.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 52_Pointers_pt2/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── err.input124.c │ │ ├── err.input126.c │ │ ├── err.input129.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── input124.c │ │ ├── input125.c │ │ ├── input126.c │ │ ├── input127.c │ │ ├── input128.c │ │ ├── input129.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── out.input125.c │ │ ├── out.input127.c │ │ ├── out.input128.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 53_Mop_up_pt2/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── err.input124.c │ │ ├── err.input126.c │ │ ├── err.input129.c │ │ ├── err.input136.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── input124.c │ │ ├── input125.c │ │ ├── input126.c │ │ ├── input127.c │ │ ├── input128.c │ │ ├── input129.c │ │ ├── input130.c │ │ ├── input131.c │ │ ├── input132.c │ │ ├── input133.c │ │ ├── input134.c │ │ ├── input135.c │ │ ├── input136.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── out.input125.c │ │ ├── out.input127.c │ │ ├── out.input128.c │ │ ├── out.input130.c │ │ ├── out.input131.c │ │ ├── out.input132.c │ │ ├── out.input133.c │ │ ├── out.input134.c │ │ ├── out.input135.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 54_Reg_Spills/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── err.input124.c │ │ ├── err.input126.c │ │ ├── err.input129.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input034.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input097.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── input124.c │ │ ├── input125.c │ │ ├── input126.c │ │ ├── input127.c │ │ ├── input128.c │ │ ├── input129.c │ │ ├── input130.c │ │ ├── input131.c │ │ ├── input132.c │ │ ├── input133.c │ │ ├── input134.c │ │ ├── input135.c │ │ ├── input136.c │ │ ├── input137.c │ │ ├── input138.c │ │ ├── input139.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── out.input125.c │ │ ├── out.input127.c │ │ ├── out.input128.c │ │ ├── out.input130.c │ │ ├── out.input131.c │ │ ├── out.input132.c │ │ ├── out.input133.c │ │ ├── out.input134.c │ │ ├── out.input135.c │ │ ├── out.input136.c │ │ ├── out.input137.c │ │ ├── out.input138.c │ │ ├── out.input139.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ ├── types.c │ └── zresults ├── 55_Lazy_Evaluation/ │ └── Readme.md ├── 56_Local_Arrays/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── err.input124.c │ │ ├── err.input126.c │ │ ├── err.input129.c │ │ ├── err.input141.c │ │ ├── err.input142.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── input124.c │ │ ├── input125.c │ │ ├── input126.c │ │ ├── input127.c │ │ ├── input128.c │ │ ├── input129.c │ │ ├── input130.c │ │ ├── input131.c │ │ ├── input132.c │ │ ├── input133.c │ │ ├── input134.c │ │ ├── input135.c │ │ ├── input136.c │ │ ├── input137.c │ │ ├── input138.c │ │ ├── input139.c │ │ ├── input140.c │ │ ├── input141.c │ │ ├── input142.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── out.input125.c │ │ ├── out.input127.c │ │ ├── out.input128.c │ │ ├── out.input130.c │ │ ├── out.input131.c │ │ ├── out.input132.c │ │ ├── out.input133.c │ │ ├── out.input134.c │ │ ├── out.input135.c │ │ ├── out.input136.c │ │ ├── out.input137.c │ │ ├── out.input138.c │ │ ├── out.input139.c │ │ ├── out.input140.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 57_Mop_up_pt3/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── err.input124.c │ │ ├── err.input126.c │ │ ├── err.input129.c │ │ ├── err.input141.c │ │ ├── err.input142.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── input124.c │ │ ├── input125.c │ │ ├── input126.c │ │ ├── input127.c │ │ ├── input128.c │ │ ├── input129.c │ │ ├── input130.c │ │ ├── input131.c │ │ ├── input132.c │ │ ├── input133.c │ │ ├── input134.c │ │ ├── input135.c │ │ ├── input136.c │ │ ├── input137.c │ │ ├── input138.c │ │ ├── input139.c │ │ ├── input140.c │ │ ├── input141.c │ │ ├── input142.c │ │ ├── input143.c │ │ ├── input144.c │ │ ├── input145.c │ │ ├── mktests │ │ ├── nasmext.inc │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── out.input125.c │ │ ├── out.input127.c │ │ ├── out.input128.c │ │ ├── out.input130.c │ │ ├── out.input131.c │ │ ├── out.input132.c │ │ ├── out.input133.c │ │ ├── out.input134.c │ │ ├── out.input135.c │ │ ├── out.input136.c │ │ ├── out.input137.c │ │ ├── out.input138.c │ │ ├── out.input139.c │ │ ├── out.input140.c │ │ ├── out.input143.c │ │ ├── out.input144.c │ │ ├── out.input145.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 58_Ptr_Increments/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── err.input124.c │ │ ├── err.input126.c │ │ ├── err.input129.c │ │ ├── err.input141.c │ │ ├── err.input142.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── input124.c │ │ ├── input125.c │ │ ├── input126.c │ │ ├── input127.c │ │ ├── input128.c │ │ ├── input129.c │ │ ├── input130.c │ │ ├── input131.c │ │ ├── input132.c │ │ ├── input133.c │ │ ├── input134.c │ │ ├── input135.c │ │ ├── input136.c │ │ ├── input137.c │ │ ├── input138.c │ │ ├── input139.c │ │ ├── input140.c │ │ ├── input141.c │ │ ├── input142.c │ │ ├── input143.c │ │ ├── input144.c │ │ ├── input145.c │ │ ├── input146.c │ │ ├── input147.c │ │ ├── mktests │ │ ├── nasmext.inc │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── out.input125.c │ │ ├── out.input127.c │ │ ├── out.input128.c │ │ ├── out.input130.c │ │ ├── out.input131.c │ │ ├── out.input132.c │ │ ├── out.input133.c │ │ ├── out.input134.c │ │ ├── out.input135.c │ │ ├── out.input136.c │ │ ├── out.input137.c │ │ ├── out.input138.c │ │ ├── out.input139.c │ │ ├── out.input140.c │ │ ├── out.input143.c │ │ ├── out.input144.c │ │ ├── out.input145.c │ │ ├── out.input146.c │ │ ├── out.input147.c │ │ ├── runtests │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 59_WDIW_pt1/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├── err.input032.c │ │ ├── err.input033.c │ │ ├── err.input034.c │ │ ├── err.input035.c │ │ ├── err.input036.c │ │ ├── err.input037.c │ │ ├── err.input038.c │ │ ├── err.input039.c │ │ ├── err.input040.c │ │ ├── err.input041.c │ │ ├── err.input042.c │ │ ├── err.input043.c │ │ ├── err.input044.c │ │ ├── err.input045.c │ │ ├── err.input046.c │ │ ├── err.input047.c │ │ ├── err.input048.c │ │ ├── err.input049.c │ │ ├── err.input050.c │ │ ├── err.input051.c │ │ ├── err.input052.c │ │ ├── err.input056.c │ │ ├── err.input057.c │ │ ├── err.input059.c │ │ ├── err.input060.c │ │ ├── err.input061.c │ │ ├── err.input064.c │ │ ├── err.input065.c │ │ ├── err.input066.c │ │ ├── err.input068.c │ │ ├── err.input069.c │ │ ├── err.input072.c │ │ ├── err.input073.c │ │ ├── err.input075.c │ │ ├── err.input076.c │ │ ├── err.input077.c │ │ ├── err.input078.c │ │ ├── err.input079.c │ │ ├── err.input085.c │ │ ├── err.input086.c │ │ ├── err.input087.c │ │ ├── err.input092.c │ │ ├── err.input093.c │ │ ├── err.input094.c │ │ ├── err.input095.c │ │ ├── err.input096.c │ │ ├── err.input097.c │ │ ├── err.input098.c │ │ ├── err.input102.c │ │ ├── err.input103.c │ │ ├── err.input104.c │ │ ├── err.input105.c │ │ ├── err.input118.c │ │ ├── err.input124.c │ │ ├── err.input126.c │ │ ├── err.input129.c │ │ ├── err.input141.c │ │ ├── err.input142.c │ │ ├── input001.c │ │ ├── input002.c │ │ ├── input003.c │ │ ├── input004.c │ │ ├── input005.c │ │ ├── input006.c │ │ ├── input007.c │ │ ├── input008.c │ │ ├── input009.c │ │ ├── input010.c │ │ ├── input011.c │ │ ├── input012.c │ │ ├── input013.c │ │ ├── input014.c │ │ ├── input015.c │ │ ├── input016.c │ │ ├── input017.c │ │ ├── input018.c │ │ ├── input018a.c │ │ ├── input019.c │ │ ├── input020.c │ │ ├── input021.c │ │ ├── input022.c │ │ ├── input023.c │ │ ├── input024.c │ │ ├── input025.c │ │ ├── input026.c │ │ ├── input027.c │ │ ├── input028.c │ │ ├── input029.c │ │ ├── input030.c │ │ ├── input031.c │ │ ├── input032.c │ │ ├── input033.c │ │ ├── input035.c │ │ ├── input036.c │ │ ├── input037.c │ │ ├── input038.c │ │ ├── input039.c │ │ ├── input040.c │ │ ├── input041.c │ │ ├── input042.c │ │ ├── input043.c │ │ ├── input044.c │ │ ├── input045.c │ │ ├── input046.c │ │ ├── input047.c │ │ ├── input048.c │ │ ├── input049.c │ │ ├── input050.c │ │ ├── input051.c │ │ ├── input052.c │ │ ├── input053.c │ │ ├── input054.c │ │ ├── input055.c │ │ ├── input056.c │ │ ├── input057.c │ │ ├── input058.c │ │ ├── input059.c │ │ ├── input060.c │ │ ├── input061.c │ │ ├── input062.c │ │ ├── input063.c │ │ ├── input064.c │ │ ├── input065.c │ │ ├── input066.c │ │ ├── input067.c │ │ ├── input068.c │ │ ├── input069.c │ │ ├── input070.c │ │ ├── input071.c │ │ ├── input072.c │ │ ├── input073.c │ │ ├── input074.c │ │ ├── input075.c │ │ ├── input076.c │ │ ├── input077.c │ │ ├── input078.c │ │ ├── input079.c │ │ ├── input080.c │ │ ├── input081.c │ │ ├── input082.c │ │ ├── input083.c │ │ ├── input084.c │ │ ├── input085.c │ │ ├── input086.c │ │ ├── input087.c │ │ ├── input088.c │ │ ├── input089.c │ │ ├── input090.c │ │ ├── input091.c │ │ ├── input092.c │ │ ├── input093.c │ │ ├── input094.c │ │ ├── input095.c │ │ ├── input096.c │ │ ├── input098.c │ │ ├── input099.c │ │ ├── input100.c │ │ ├── input101.c │ │ ├── input102.c │ │ ├── input103.c │ │ ├── input104.c │ │ ├── input105.c │ │ ├── input106.c │ │ ├── input107.c │ │ ├── input108.c │ │ ├── input109.c │ │ ├── input110.c │ │ ├── input111.c │ │ ├── input112.c │ │ ├── input113.c │ │ ├── input114.c │ │ ├── input115.c │ │ ├── input116.c │ │ ├── input117.c │ │ ├── input118.c │ │ ├── input119.c │ │ ├── input120.c │ │ ├── input121.c │ │ ├── input122.c │ │ ├── input123.c │ │ ├── input124.c │ │ ├── input125.c │ │ ├── input126.c │ │ ├── input127.c │ │ ├── input128.c │ │ ├── input129.c │ │ ├── input130.c │ │ ├── input131.c │ │ ├── input132.c │ │ ├── input133.c │ │ ├── input134.c │ │ ├── input135.c │ │ ├── input136.c │ │ ├── input137.c │ │ ├── input138.c │ │ ├── input139.c │ │ ├── input140.c │ │ ├── input141.c │ │ ├── input142.c │ │ ├── input143.c │ │ ├── input144.c │ │ ├── input145.c │ │ ├── input146.c │ │ ├── input147.c │ │ ├── input148.c │ │ ├── mktests │ │ ├── out.input001.c │ │ ├── out.input002.c │ │ ├── out.input003.c │ │ ├── out.input004.c │ │ ├── out.input005.c │ │ ├── out.input006.c │ │ ├── out.input007.c │ │ ├── out.input008.c │ │ ├── out.input009.c │ │ ├── out.input010.c │ │ ├── out.input011.c │ │ ├── out.input012.c │ │ ├── out.input013.c │ │ ├── out.input014.c │ │ ├── out.input015.c │ │ ├── out.input016.c │ │ ├── out.input017.c │ │ ├── out.input018.c │ │ ├── out.input018a.c │ │ ├── out.input019.c │ │ ├── out.input020.c │ │ ├── out.input021.c │ │ ├── out.input022.c │ │ ├── out.input023.c │ │ ├── out.input024.c │ │ ├── out.input025.c │ │ ├── out.input026.c │ │ ├── out.input027.c │ │ ├── out.input028.c │ │ ├── out.input029.c │ │ ├── out.input030.c │ │ ├── out.input053.c │ │ ├── out.input054.c │ │ ├── out.input055.c │ │ ├── out.input058.c │ │ ├── out.input062.c │ │ ├── out.input063.c │ │ ├── out.input067.c │ │ ├── out.input070.c │ │ ├── out.input071.c │ │ ├── out.input074.c │ │ ├── out.input080.c │ │ ├── out.input081.c │ │ ├── out.input082.c │ │ ├── out.input083.c │ │ ├── out.input084.c │ │ ├── out.input088.c │ │ ├── out.input089.c │ │ ├── out.input090.c │ │ ├── out.input091.c │ │ ├── out.input099.c │ │ ├── out.input100.c │ │ ├── out.input101.c │ │ ├── out.input106.c │ │ ├── out.input107.c │ │ ├── out.input108.c │ │ ├── out.input109.c │ │ ├── out.input110.c │ │ ├── out.input111.c │ │ ├── out.input112.c │ │ ├── out.input113.c │ │ ├── out.input114.c │ │ ├── out.input115.c │ │ ├── out.input116.c │ │ ├── out.input117.c │ │ ├── out.input119.c │ │ ├── out.input120.c │ │ ├── out.input121.c │ │ ├── out.input122.c │ │ ├── out.input123.c │ │ ├── out.input125.c │ │ ├── out.input127.c │ │ ├── out.input128.c │ │ ├── out.input130.c │ │ ├── out.input131.c │ │ ├── out.input132.c │ │ ├── out.input133.c │ │ ├── out.input134.c │ │ ├── out.input135.c │ │ ├── out.input136.c │ │ ├── out.input137.c │ │ ├── out.input138.c │ │ ├── out.input139.c │ │ ├── out.input140.c │ │ ├── out.input143.c │ │ ├── out.input144.c │ │ ├── out.input145.c │ │ ├── out.input146.c │ │ ├── out.input147.c │ │ ├── out.input148.c │ │ ├── runtests │ │ ├── runtests0 │ │ └── runtestsn │ ├── tree.c │ └── types.c ├── 60_TripleTest/ │ ├── Makefile │ ├── Readme.md │ ├── cg.c │ ├── cg_arm.c │ ├── cgn.c │ ├── data.h │ ├── decl.c │ ├── decl.h │ ├── defs.h │ ├── expr.c │ ├── gen.c │ ├── include/ │ │ ├── ctype.h │ │ ├── errno.h │ │ ├── fcntl.h │ │ ├── stddef.h │ │ ├── stdio.h │ │ ├── stdlib.h │ │ ├── string.h │ │ └── unistd.h │ ├── main.c │ ├── misc.c │ ├── opt.c │ ├── scan.c │ ├── stmt.c │ ├── sym.c │ ├── tests/ │ │ ├── err.input031.c │ │ ├
Showing preview only (1,364K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (22026 symbols across 4843 files)
FILE: 01_Scanner/decl.h
type token (line 4) | struct token
FILE: 01_Scanner/defs.h
type token (line 18) | struct token {
FILE: 01_Scanner/main.c
function init (line 15) | static void init() {
function usage (line 21) | static void usage(char *prog) {
function scanfile (line 31) | static void scanfile() {
function main (line 45) | void main(int argc, char *argv[]) {
FILE: 01_Scanner/scan.c
function chrpos (line 13) | static int chrpos(char *s, int c) {
function next (line 21) | static int next(void) {
function putback (line 37) | static void putback(int c) {
function skip (line 44) | static int skip(void) {
function scanint (line 56) | static int scanint(int c) {
function scan (line 72) | int scan(struct token *t) {
FILE: 02_Parser/decl.h
type token (line 4) | struct token
type ASTnode (line 5) | struct ASTnode
type ASTnode (line 5) | struct ASTnode
type ASTnode (line 6) | struct ASTnode
type ASTnode (line 7) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
FILE: 02_Parser/defs.h
type token (line 15) | struct token {
type ASTnode (line 26) | struct ASTnode {
FILE: 02_Parser/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 29) | int arithop(int tok) {
type ASTnode (line 47) | struct ASTnode
type ASTnode (line 48) | struct ASTnode
FILE: 02_Parser/interp.c
function interpretAST (line 14) | int interpretAST(struct ASTnode *n) {
FILE: 02_Parser/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 02_Parser/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scan (line 69) | int scan(struct token *t) {
FILE: 02_Parser/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
FILE: 03_Precedence/decl.h
type token (line 4) | struct token
type ASTnode (line 5) | struct ASTnode
type ASTnode (line 5) | struct ASTnode
type ASTnode (line 6) | struct ASTnode
type ASTnode (line 7) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
FILE: 03_Precedence/defs.h
type token (line 15) | struct token {
type ASTnode (line 26) | struct ASTnode {
FILE: 03_Precedence/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 29) | int arithop(int tokentype) {
function op_precedence (line 50) | static int op_precedence(int tokentype) {
type ASTnode (line 61) | struct ASTnode
type ASTnode (line 62) | struct ASTnode
FILE: 03_Precedence/expr2.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 29) | static int arithop(int tok) {
type ASTnode (line 45) | struct ASTnode
type ASTnode (line 48) | struct ASTnode
type ASTnode (line 49) | struct ASTnode
type ASTnode (line 82) | struct ASTnode
type ASTnode (line 83) | struct ASTnode
type ASTnode (line 117) | struct ASTnode
FILE: 03_Precedence/interp.c
function interpretAST (line 14) | int interpretAST(struct ASTnode *n) {
FILE: 03_Precedence/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 03_Precedence/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scan (line 69) | int scan(struct token *t) {
FILE: 03_Precedence/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
FILE: 04_Assembly/cg.c
function freeall_registers (line 15) | void freeall_registers(void)
function alloc_register (line 22) | static int alloc_register(void)
function free_register (line 36) | static void free_register(int reg)
function cgpreamble (line 46) | void cgpreamble()
function cgpostamble (line 76) | void cgpostamble()
function cgload (line 87) | int cgload(int value) {
function cgadd (line 99) | int cgadd(int r1, int r2) {
function cgsub (line 107) | int cgsub(int r1, int r2) {
function cgmul (line 115) | int cgmul(int r1, int r2) {
function cgdiv (line 123) | int cgdiv(int r1, int r2) {
function cgprintint (line 133) | void cgprintint(int r) {
FILE: 04_Assembly/cgn.c
function freeall_registers (line 15) | void freeall_registers(void)
function alloc_register (line 22) | static int alloc_register(void)
function free_register (line 36) | static void free_register(int reg)
function cgpreamble (line 46) | void cgpreamble()
function cgpostamble (line 75) | void cgpostamble()
function cgload (line 86) | int cgload(int value) {
function cgadd (line 98) | int cgadd(int r1, int r2) {
function cgsub (line 106) | int cgsub(int r1, int r2) {
function cgmul (line 114) | int cgmul(int r1, int r2) {
function cgdiv (line 122) | int cgdiv(int r1, int r2) {
function cgprintint (line 132) | void cgprintint(int r) {
FILE: 04_Assembly/decl.h
type token (line 4) | struct token
type ASTnode (line 6) | struct ASTnode
type ASTnode (line 6) | struct ASTnode
type ASTnode (line 7) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
FILE: 04_Assembly/defs.h
type token (line 15) | struct token {
type ASTnode (line 26) | struct ASTnode {
FILE: 04_Assembly/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 29) | int arithop(int tokentype) {
function op_precedence (line 50) | static int op_precedence(int tokentype) {
type ASTnode (line 61) | struct ASTnode
type ASTnode (line 62) | struct ASTnode
FILE: 04_Assembly/gen.c
function genAST (line 10) | static int genAST(struct ASTnode *n) {
function generatecode (line 36) | void generatecode(struct ASTnode *n) {
FILE: 04_Assembly/interp.c
function interpretAST (line 14) | int interpretAST(struct ASTnode *n) {
FILE: 04_Assembly/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 04_Assembly/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scan (line 69) | int scan(struct token *t) {
FILE: 04_Assembly/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
FILE: 05_Statements/cg.c
function freeall_registers (line 15) | void freeall_registers(void) {
function alloc_register (line 21) | static int alloc_register(void) {
function free_register (line 34) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 68) | void cgpostamble() {
function cgload (line 74) | int cgload(int value) {
function cgadd (line 86) | int cgadd(int r1, int r2) {
function cgsub (line 94) | int cgsub(int r1, int r2) {
function cgmul (line 102) | int cgmul(int r1, int r2) {
function cgdiv (line 110) | int cgdiv(int r1, int r2) {
function cgprintint (line 120) | void cgprintint(int r) {
FILE: 05_Statements/cgn.c
function freeall_registers (line 15) | void freeall_registers(void) {
function alloc_register (line 21) | static int alloc_register(void) {
function free_register (line 34) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 67) | void cgpostamble() {
function cgload (line 73) | int cgload(int value) {
function cgadd (line 85) | int cgadd(int r1, int r2) {
function cgsub (line 93) | int cgsub(int r1, int r2) {
function cgmul (line 101) | int cgmul(int r1, int r2) {
function cgdiv (line 109) | int cgdiv(int r1, int r2) {
function cgprintint (line 119) | void cgprintint(int r) {
FILE: 05_Statements/decl.h
type token (line 5) | struct token
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
FILE: 05_Statements/defs.h
type token (line 17) | struct token {
type ASTnode (line 28) | struct ASTnode {
FILE: 05_Statements/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 30) | static int arithop(int tokentype) {
function op_precedence (line 51) | static int op_precedence(int tokentype) {
type ASTnode (line 62) | struct ASTnode
type ASTnode (line 63) | struct ASTnode
FILE: 05_Statements/gen.c
function genAST (line 10) | int genAST(struct ASTnode *n) {
function genpreamble (line 36) | void genpreamble() {
function genpostamble (line 39) | void genpostamble() {
function genfreeregs (line 42) | void genfreeregs() {
function genprintint (line 45) | void genprintint(int reg) {
FILE: 05_Statements/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 05_Statements/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 21) | void semi(void) {
FILE: 05_Statements/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 95) | static int keyword(char *s) {
function scan (line 107) | int scan(struct token *t) {
FILE: 05_Statements/stmt.c
function statements (line 17) | void statements(void) {
FILE: 05_Statements/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 30) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
FILE: 06_Variables/cg.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 32) | static void free_register(int reg) {
function cgpreamble (line 39) | void cgpreamble() {
function cgpostamble (line 64) | void cgpostamble() {
function cgloadint (line 70) | int cgloadint(int value) {
function cgloadglob (line 81) | int cgloadglob(char *identifier) {
function cgadd (line 92) | int cgadd(int r1, int r2) {
function cgsub (line 100) | int cgsub(int r1, int r2) {
function cgmul (line 108) | int cgmul(int r1, int r2) {
function cgdiv (line 116) | int cgdiv(int r1, int r2) {
function cgprintint (line 126) | void cgprintint(int r) {
function cgstorglob (line 133) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 139) | void cgglobsym(char *sym) {
FILE: 06_Variables/cgn.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 32) | static void free_register(int reg) {
function cgpreamble (line 39) | void cgpreamble() {
function cgpostamble (line 63) | void cgpostamble() {
function cgloadint (line 69) | int cgloadint(int value) {
function cgloadglob (line 80) | int cgloadglob(char *identifier) {
function cgadd (line 91) | int cgadd(int r1, int r2) {
function cgsub (line 99) | int cgsub(int r1, int r2) {
function cgmul (line 107) | int cgmul(int r1, int r2) {
function cgdiv (line 115) | int cgdiv(int r1, int r2) {
function cgprintint (line 125) | void cgprintint(int r) {
function cgstorglob (line 132) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 138) | void cgglobsym(char *sym) {
FILE: 06_Variables/decl.c
function var_declaration (line 10) | void var_declaration(void) {
FILE: 06_Variables/decl.h
type token (line 5) | struct token
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 36) | struct ASTnode
FILE: 06_Variables/defs.h
type token (line 21) | struct token {
type ASTnode (line 33) | struct ASTnode {
type symtable (line 44) | struct symtable {
FILE: 06_Variables/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 41) | static int arithop(int tokentype) {
function op_precedence (line 61) | static int op_precedence(int tokentype) {
type ASTnode (line 70) | struct ASTnode
type ASTnode (line 71) | struct ASTnode
FILE: 06_Variables/gen.c
function genAST (line 10) | int genAST(struct ASTnode *n, int reg) {
function genpreamble (line 42) | void genpreamble() {
function genpostamble (line 45) | void genpostamble() {
function genfreeregs (line 48) | void genfreeregs() {
function genprintint (line 51) | void genprintint(int reg) {
function genglobsym (line 55) | void genglobsym(char *s) {
FILE: 06_Variables/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 06_Variables/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function ident (line 25) | void ident(void) {
function fatal (line 30) | void fatal(char *s) {
function fatals (line 34) | void fatals(char *s1, char *s2) {
function fatald (line 38) | void fatald(char *s, int d) {
function fatalc (line 42) | void fatalc(char *s, int c) {
FILE: 06_Variables/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
function scan (line 110) | int scan(struct token *t) {
FILE: 06_Variables/stmt.c
function print_statement (line 20) | void print_statement(void) {
function assignment_statement (line 38) | void assignment_statement(void) {
function statements (line 70) | void statements(void) {
FILE: 06_Variables/sym.c
function findglob (line 12) | int findglob(char *s) {
function newglob (line 24) | static int newglob(void) {
function addglob (line 34) | int addglob(char *name) {
FILE: 06_Variables/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 28) | struct ASTnode
type ASTnode (line 33) | struct ASTnode
type ASTnode (line 33) | struct ASTnode
FILE: 07_Comparisons/cg.c
function freeall_registers (line 16) | void freeall_registers(void) {
function alloc_register (line 22) | static int alloc_register(void) {
function free_register (line 34) | static void free_register(int reg) {
function cgpreamble (line 41) | void cgpreamble() {
function cgpostamble (line 66) | void cgpostamble() {
function cgloadint (line 72) | int cgloadint(int value) {
function cgloadglob (line 83) | int cgloadglob(char *identifier) {
function cgadd (line 94) | int cgadd(int r1, int r2) {
function cgsub (line 102) | int cgsub(int r1, int r2) {
function cgmul (line 110) | int cgmul(int r1, int r2) {
function cgdiv (line 118) | int cgdiv(int r1, int r2) {
function cgprintint (line 128) | void cgprintint(int r) {
function cgstorglob (line 135) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 141) | void cgglobsym(char *sym) {
function cgcompare (line 146) | static int cgcompare(int r1, int r2, char *how) {
function cgequal (line 154) | int cgequal(int r1, int r2) { return(cgcompare(r1, r2, "sete")); }
function cgnotequal (line 155) | int cgnotequal(int r1, int r2) { return(cgcompare(r1, r2, "setne")); }
function cglessthan (line 156) | int cglessthan(int r1, int r2) { return(cgcompare(r1, r2, "setl")); }
function cggreaterthan (line 157) | int cggreaterthan(int r1, int r2) { return(cgcompare(r1, r2, "setg")); }
function cglessequal (line 158) | int cglessequal(int r1, int r2) { return(cgcompare(r1, r2, "setle")); }
function cggreaterequal (line 159) | int cggreaterequal(int r1, int r2) { return(cgcompare(r1, r2, "setge")); }
FILE: 07_Comparisons/cgn.c
function freeall_registers (line 15) | void freeall_registers(void) {
function alloc_register (line 21) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function cgpreamble (line 40) | void cgpreamble() {
function cgpostamble (line 64) | void cgpostamble() {
function cgloadint (line 70) | int cgloadint(int value) {
function cgloadglob (line 81) | int cgloadglob(char *identifier) {
function cgadd (line 92) | int cgadd(int r1, int r2) {
function cgsub (line 100) | int cgsub(int r1, int r2) {
function cgmul (line 108) | int cgmul(int r1, int r2) {
function cgdiv (line 116) | int cgdiv(int r1, int r2) {
function cgprintint (line 126) | void cgprintint(int r) {
function cgstorglob (line 133) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 139) | void cgglobsym(char *sym) {
function cgcompare (line 144) | static int cgcompare(int r1, int r2, char *how) {
function cgequal (line 152) | int cgequal(int r1, int r2) { return(cgcompare(r1, r2, "sete")); }
function cgnotequal (line 153) | int cgnotequal(int r1, int r2) { return(cgcompare(r1, r2, "setne")); }
function cglessthan (line 154) | int cglessthan(int r1, int r2) { return(cgcompare(r1, r2, "setl")); }
function cggreaterthan (line 155) | int cggreaterthan(int r1, int r2) { return(cgcompare(r1, r2, "setg")); }
function cglessequal (line 156) | int cglessequal(int r1, int r2) { return(cgcompare(r1, r2, "setle")); }
function cggreaterequal (line 157) | int cggreaterequal(int r1, int r2) { return(cgcompare(r1, r2, "setge")); }
FILE: 07_Comparisons/decl.c
function var_declaration (line 10) | void var_declaration(void) {
FILE: 07_Comparisons/decl.h
type token (line 5) | struct token
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 42) | struct ASTnode
FILE: 07_Comparisons/defs.h
type token (line 25) | struct token {
type ASTnode (line 40) | struct ASTnode {
type symtable (line 51) | struct symtable {
FILE: 07_Comparisons/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 42) | static int arithop(int tokentype) {
function op_precedence (line 59) | static int op_precedence(int tokentype) {
type ASTnode (line 68) | struct ASTnode
type ASTnode (line 69) | struct ASTnode
FILE: 07_Comparisons/gen.c
function genAST (line 10) | int genAST(struct ASTnode *n, int reg) {
function genpreamble (line 54) | void genpreamble() {
function genpostamble (line 57) | void genpostamble() {
function genfreeregs (line 60) | void genfreeregs() {
function genprintint (line 63) | void genprintint(int reg) {
function genglobsym (line 67) | void genglobsym(char *s) {
FILE: 07_Comparisons/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 07_Comparisons/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function ident (line 25) | void ident(void) {
function fatal (line 30) | void fatal(char *s) {
function fatals (line 34) | void fatals(char *s1, char *s2) {
function fatald (line 38) | void fatald(char *s, int d) {
function fatalc (line 42) | void fatalc(char *s, int c) {
FILE: 07_Comparisons/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
function scan (line 110) | int scan(struct token *t) {
FILE: 07_Comparisons/stmt.c
function print_statement (line 20) | void print_statement(void) {
function assignment_statement (line 38) | void assignment_statement(void) {
function statements (line 70) | void statements(void) {
FILE: 07_Comparisons/sym.c
function findglob (line 12) | int findglob(char *s) {
function newglob (line 24) | static int newglob(void) {
function addglob (line 34) | int addglob(char *name) {
FILE: 07_Comparisons/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 28) | struct ASTnode
type ASTnode (line 33) | struct ASTnode
type ASTnode (line 33) | struct ASTnode
FILE: 08_If_Statements/cg.c
function freeall_registers (line 16) | void freeall_registers(void) {
function alloc_register (line 22) | static int alloc_register(void) {
function free_register (line 34) | static void free_register(int reg) {
function cgpreamble (line 41) | void cgpreamble() {
function cgpostamble (line 66) | void cgpostamble() {
function cgloadint (line 72) | int cgloadint(int value) {
function cgloadglob (line 83) | int cgloadglob(char *identifier) {
function cgadd (line 94) | int cgadd(int r1, int r2) {
function cgsub (line 102) | int cgsub(int r1, int r2) {
function cgmul (line 110) | int cgmul(int r1, int r2) {
function cgdiv (line 118) | int cgdiv(int r1, int r2) {
function cgprintint (line 128) | void cgprintint(int r) {
function cgstorglob (line 135) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 141) | void cgglobsym(char *sym) {
function cgcompare_and_set (line 151) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 165) | void cglabel(int l) {
function cgjump (line 170) | void cgjump(int l) {
function cgcompare_and_jump (line 179) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
FILE: 08_If_Statements/cgn.c
function freeall_registers (line 15) | void freeall_registers(void) {
function alloc_register (line 21) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function cgpreamble (line 40) | void cgpreamble() {
function cgpostamble (line 64) | void cgpostamble() {
function cgloadint (line 70) | int cgloadint(int value) {
function cgloadglob (line 81) | int cgloadglob(char *identifier) {
function cgadd (line 92) | int cgadd(int r1, int r2) {
function cgsub (line 100) | int cgsub(int r1, int r2) {
function cgmul (line 108) | int cgmul(int r1, int r2) {
function cgdiv (line 116) | int cgdiv(int r1, int r2) {
function cgprintint (line 126) | void cgprintint(int r) {
function cgstorglob (line 133) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 139) | void cgglobsym(char *sym) {
function cgcompare_and_set (line 149) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 163) | void cglabel(int l) {
function cgjump (line 168) | void cgjump(int l) {
function cgcompare_and_jump (line 177) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
FILE: 08_If_Statements/decl.c
function var_declaration (line 10) | void var_declaration(void) {
FILE: 08_If_Statements/decl.h
type token (line 5) | struct token
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 41) | struct ASTnode
type ASTnode (line 44) | struct ASTnode
FILE: 08_If_Statements/defs.h
type token (line 26) | struct token {
type ASTnode (line 41) | struct ASTnode {
type symtable (line 56) | struct symtable {
FILE: 08_If_Statements/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 42) | static int arithop(int tokentype) {
function op_precedence (line 59) | static int op_precedence(int tokentype) {
type ASTnode (line 68) | struct ASTnode
type ASTnode (line 69) | struct ASTnode
FILE: 08_If_Statements/gen.c
function label (line 9) | static int label(void) {
function genIFAST (line 16) | static int genIFAST(struct ASTnode *n) {
function genAST (line 62) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 129) | void genpreamble() {
function genpostamble (line 132) | void genpostamble() {
function genfreeregs (line 135) | void genfreeregs() {
function genprintint (line 138) | void genprintint(int reg) {
function genglobsym (line 142) | void genglobsym(char *s) {
FILE: 08_If_Statements/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 08_If_Statements/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 08_If_Statements/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
function scan (line 116) | int scan(struct token *t) {
FILE: 08_If_Statements/stmt.c
type ASTnode (line 33) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 52) | struct ASTnode
type ASTnode (line 53) | struct ASTnode
type ASTnode (line 83) | struct ASTnode
type ASTnode (line 84) | struct ASTnode
type ASTnode (line 115) | struct ASTnode
type ASTnode (line 116) | struct ASTnode
type ASTnode (line 117) | struct ASTnode
FILE: 08_If_Statements/sym.c
function findglob (line 12) | int findglob(char *s) {
function newglob (line 24) | static int newglob(void) {
function addglob (line 34) | int addglob(char *name) {
FILE: 08_If_Statements/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 30) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
FILE: 09_While_Loops/cg.c
function freeall_registers (line 16) | void freeall_registers(void) {
function alloc_register (line 22) | static int alloc_register(void) {
function free_register (line 34) | static void free_register(int reg) {
function cgpreamble (line 41) | void cgpreamble() {
function cgpostamble (line 66) | void cgpostamble() {
function cgloadint (line 72) | int cgloadint(int value) {
function cgloadglob (line 83) | int cgloadglob(char *identifier) {
function cgadd (line 94) | int cgadd(int r1, int r2) {
function cgsub (line 102) | int cgsub(int r1, int r2) {
function cgmul (line 110) | int cgmul(int r1, int r2) {
function cgdiv (line 118) | int cgdiv(int r1, int r2) {
function cgprintint (line 128) | void cgprintint(int r) {
function cgstorglob (line 135) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 141) | void cgglobsym(char *sym) {
function cgcompare_and_set (line 151) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 165) | void cglabel(int l) {
function cgjump (line 170) | void cgjump(int l) {
function cgcompare_and_jump (line 179) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
FILE: 09_While_Loops/cgn.c
function freeall_registers (line 15) | void freeall_registers(void) {
function alloc_register (line 21) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function cgpreamble (line 40) | void cgpreamble() {
function cgpostamble (line 64) | void cgpostamble() {
function cgloadint (line 70) | int cgloadint(int value) {
function cgloadglob (line 81) | int cgloadglob(char *identifier) {
function cgadd (line 92) | int cgadd(int r1, int r2) {
function cgsub (line 100) | int cgsub(int r1, int r2) {
function cgmul (line 108) | int cgmul(int r1, int r2) {
function cgdiv (line 116) | int cgdiv(int r1, int r2) {
function cgprintint (line 126) | void cgprintint(int r) {
function cgstorglob (line 133) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 139) | void cgglobsym(char *sym) {
function cgcompare_and_set (line 149) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 163) | void cglabel(int l) {
function cgjump (line 168) | void cgjump(int l) {
function cgcompare_and_jump (line 177) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
FILE: 09_While_Loops/decl.c
function var_declaration (line 12) | void var_declaration(void) {
FILE: 09_While_Loops/decl.h
type token (line 5) | struct token
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 41) | struct ASTnode
type ASTnode (line 44) | struct ASTnode
FILE: 09_While_Loops/defs.h
type token (line 26) | struct token {
type ASTnode (line 42) | struct ASTnode {
type symtable (line 57) | struct symtable {
FILE: 09_While_Loops/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 42) | static int arithop(int tokentype) {
function op_precedence (line 59) | static int op_precedence(int tokentype) {
type ASTnode (line 68) | struct ASTnode
type ASTnode (line 69) | struct ASTnode
FILE: 09_While_Loops/gen.c
function label (line 9) | static int label(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 159) | void genpreamble() {
function genpostamble (line 162) | void genpostamble() {
function genfreeregs (line 165) | void genfreeregs() {
function genprintint (line 168) | void genprintint(int reg) {
function genglobsym (line 172) | void genglobsym(char *s) {
FILE: 09_While_Loops/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 09_While_Loops/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 09_While_Loops/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
function scan (line 120) | int scan(struct token *t) {
FILE: 09_While_Loops/stmt.c
type ASTnode (line 22) | struct ASTnode
type ASTnode (line 23) | struct ASTnode
type ASTnode (line 43) | struct ASTnode
type ASTnode (line 44) | struct ASTnode
type ASTnode (line 80) | struct ASTnode
type ASTnode (line 81) | struct ASTnode
type ASTnode (line 113) | struct ASTnode
type ASTnode (line 114) | struct ASTnode
type ASTnode (line 138) | struct ASTnode
type ASTnode (line 139) | struct ASTnode
type ASTnode (line 140) | struct ASTnode
FILE: 09_While_Loops/sym.c
function findglob (line 12) | int findglob(char *s) {
function newglob (line 24) | static int newglob(void) {
function addglob (line 34) | int addglob(char *name) {
FILE: 09_While_Loops/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 30) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
FILE: 10_For_Loops/cg.c
function freeall_registers (line 16) | void freeall_registers(void) {
function alloc_register (line 22) | static int alloc_register(void) {
function free_register (line 34) | static void free_register(int reg) {
function cgpreamble (line 41) | void cgpreamble() {
function cgpostamble (line 66) | void cgpostamble() {
function cgloadint (line 72) | int cgloadint(int value) {
function cgloadglob (line 83) | int cgloadglob(char *identifier) {
function cgadd (line 94) | int cgadd(int r1, int r2) {
function cgsub (line 102) | int cgsub(int r1, int r2) {
function cgmul (line 110) | int cgmul(int r1, int r2) {
function cgdiv (line 118) | int cgdiv(int r1, int r2) {
function cgprintint (line 128) | void cgprintint(int r) {
function cgstorglob (line 135) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 141) | void cgglobsym(char *sym) {
function cgcompare_and_set (line 151) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 165) | void cglabel(int l) {
function cgjump (line 170) | void cgjump(int l) {
function cgcompare_and_jump (line 179) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
FILE: 10_For_Loops/cgn.c
function freeall_registers (line 15) | void freeall_registers(void) {
function alloc_register (line 21) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function cgpreamble (line 40) | void cgpreamble() {
function cgpostamble (line 64) | void cgpostamble() {
function cgloadint (line 70) | int cgloadint(int value) {
function cgloadglob (line 81) | int cgloadglob(char *identifier) {
function cgadd (line 92) | int cgadd(int r1, int r2) {
function cgsub (line 100) | int cgsub(int r1, int r2) {
function cgmul (line 108) | int cgmul(int r1, int r2) {
function cgdiv (line 116) | int cgdiv(int r1, int r2) {
function cgprintint (line 126) | void cgprintint(int r) {
function cgstorglob (line 133) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 139) | void cgglobsym(char *sym) {
function cgcompare_and_set (line 149) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 163) | void cglabel(int l) {
function cgjump (line 168) | void cgjump(int l) {
function cgcompare_and_jump (line 177) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
FILE: 10_For_Loops/decl.c
function var_declaration (line 12) | void var_declaration(void) {
FILE: 10_For_Loops/decl.h
type token (line 5) | struct token
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 41) | struct ASTnode
type ASTnode (line 44) | struct ASTnode
FILE: 10_For_Loops/defs.h
type token (line 27) | struct token {
type ASTnode (line 43) | struct ASTnode {
type symtable (line 58) | struct symtable {
FILE: 10_For_Loops/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 42) | static int arithop(int tokentype) {
function op_precedence (line 59) | static int op_precedence(int tokentype) {
type ASTnode (line 68) | struct ASTnode
type ASTnode (line 69) | struct ASTnode
FILE: 10_For_Loops/gen.c
function label (line 9) | static int label(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 159) | void genpreamble() {
function genpostamble (line 162) | void genpostamble() {
function genfreeregs (line 165) | void genfreeregs() {
function genprintint (line 168) | void genprintint(int reg) {
function genglobsym (line 172) | void genglobsym(char *s) {
FILE: 10_For_Loops/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 10_For_Loops/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 10_For_Loops/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
function scan (line 124) | int scan(struct token *t) {
FILE: 10_For_Loops/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 25) | struct ASTnode
type ASTnode (line 26) | struct ASTnode
type ASTnode (line 44) | struct ASTnode
type ASTnode (line 45) | struct ASTnode
type ASTnode (line 79) | struct ASTnode
type ASTnode (line 80) | struct ASTnode
type ASTnode (line 112) | struct ASTnode
type ASTnode (line 113) | struct ASTnode
type ASTnode (line 143) | struct ASTnode
type ASTnode (line 144) | struct ASTnode
type ASTnode (line 145) | struct ASTnode
type ASTnode (line 146) | struct ASTnode
type ASTnode (line 184) | struct ASTnode
type ASTnode (line 206) | struct ASTnode
type ASTnode (line 207) | struct ASTnode
type ASTnode (line 208) | struct ASTnode
FILE: 10_For_Loops/sym.c
function findglob (line 12) | int findglob(char *s) {
function newglob (line 24) | static int newglob(void) {
function addglob (line 34) | int addglob(char *name) {
FILE: 10_For_Loops/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 30) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
FILE: 11_Functions_pt1/cg.c
function freeall_registers (line 16) | void freeall_registers(void) {
function alloc_register (line 22) | static int alloc_register(void) {
function free_register (line 34) | static void free_register(int reg) {
function cgpreamble (line 41) | void cgpreamble() {
function cgfuncpreamble (line 59) | void cgfuncpreamble(char *name) {
function cgfuncpostamble (line 69) | void cgfuncpostamble() {
function cgloadint (line 75) | int cgloadint(int value) {
function cgloadglob (line 86) | int cgloadglob(char *identifier) {
function cgadd (line 97) | int cgadd(int r1, int r2) {
function cgsub (line 105) | int cgsub(int r1, int r2) {
function cgmul (line 113) | int cgmul(int r1, int r2) {
function cgdiv (line 121) | int cgdiv(int r1, int r2) {
function cgprintint (line 131) | void cgprintint(int r) {
function cgstorglob (line 138) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 144) | void cgglobsym(char *sym) {
function cgcompare_and_set (line 154) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 168) | void cglabel(int l) {
function cgjump (line 173) | void cgjump(int l) {
function cgcompare_and_jump (line 182) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
FILE: 11_Functions_pt1/cgn.c
function freeall_registers (line 15) | void freeall_registers(void) {
function alloc_register (line 21) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function cgpreamble (line 40) | void cgpreamble() {
function cgfuncpreamble (line 59) | void cgfuncpreamble(char *name) {
function cgfuncpostamble (line 68) | void cgfuncpostamble() {
function cgloadint (line 74) | int cgloadint(int value) {
function cgloadglob (line 85) | int cgloadglob(char *identifier) {
function cgadd (line 96) | int cgadd(int r1, int r2) {
function cgsub (line 104) | int cgsub(int r1, int r2) {
function cgmul (line 112) | int cgmul(int r1, int r2) {
function cgdiv (line 120) | int cgdiv(int r1, int r2) {
function cgprintint (line 130) | void cgprintint(int r) {
function cgstorglob (line 137) | int cgstorglob(int r, char *identifier) {
function cgglobsym (line 143) | void cgglobsym(char *sym) {
function cgcompare_and_set (line 153) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 167) | void cglabel(int l) {
function cgjump (line 172) | void cgjump(int l) {
function cgcompare_and_jump (line 181) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
FILE: 11_Functions_pt1/decl.c
function var_declaration (line 12) | void var_declaration(void) {
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 30) | struct ASTnode
FILE: 11_Functions_pt1/decl.h
type token (line 5) | struct token
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 42) | struct ASTnode
type ASTnode (line 45) | struct ASTnode
type ASTnode (line 66) | struct ASTnode
FILE: 11_Functions_pt1/defs.h
type token (line 27) | struct token {
type ASTnode (line 43) | struct ASTnode {
type symtable (line 58) | struct symtable {
FILE: 11_Functions_pt1/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 42) | static int arithop(int tokentype) {
function op_precedence (line 59) | static int op_precedence(int tokentype) {
type ASTnode (line 68) | struct ASTnode
type ASTnode (line 69) | struct ASTnode
FILE: 11_Functions_pt1/gen.c
function label (line 9) | static int label(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 165) | void genpreamble() {
function genfreeregs (line 168) | void genfreeregs() {
function genprintint (line 171) | void genprintint(int reg) {
function genglobsym (line 174) | void genglobsym(char *s) {
FILE: 11_Functions_pt1/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 11_Functions_pt1/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 11_Functions_pt1/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
function scan (line 128) | int scan(struct token *t) {
FILE: 11_Functions_pt1/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 25) | struct ASTnode
type ASTnode (line 26) | struct ASTnode
type ASTnode (line 44) | struct ASTnode
type ASTnode (line 45) | struct ASTnode
type ASTnode (line 79) | struct ASTnode
type ASTnode (line 80) | struct ASTnode
type ASTnode (line 112) | struct ASTnode
type ASTnode (line 113) | struct ASTnode
type ASTnode (line 143) | struct ASTnode
type ASTnode (line 144) | struct ASTnode
type ASTnode (line 145) | struct ASTnode
type ASTnode (line 146) | struct ASTnode
type ASTnode (line 184) | struct ASTnode
type ASTnode (line 206) | struct ASTnode
type ASTnode (line 207) | struct ASTnode
type ASTnode (line 208) | struct ASTnode
FILE: 11_Functions_pt1/sym.c
function findglob (line 12) | int findglob(char *s) {
function newglob (line 24) | static int newglob(void) {
function addglob (line 34) | int addglob(char *name) {
FILE: 11_Functions_pt1/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 30) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
FILE: 12_Types_pt1/cg.c
function freeall_registers (line 16) | void freeall_registers(void) {
function alloc_register (line 22) | static int alloc_register(void) {
function free_register (line 34) | static void free_register(int reg) {
function cgpreamble (line 41) | void cgpreamble() {
function cgfuncpreamble (line 59) | void cgfuncpreamble(char *name) {
function cgfuncpostamble (line 69) | void cgfuncpostamble() {
function cgloadint (line 76) | int cgloadint(int value, int type) {
function cgloadglob (line 86) | int cgloadglob(int id) {
function cgadd (line 100) | int cgadd(int r1, int r2) {
function cgsub (line 108) | int cgsub(int r1, int r2) {
function cgmul (line 116) | int cgmul(int r1, int r2) {
function cgdiv (line 124) | int cgdiv(int r1, int r2) {
function cgprintint (line 134) | void cgprintint(int r) {
function cgstorglob (line 141) | int cgstorglob(int r, int id) {
function cgglobsym (line 151) | void cgglobsym(int id) {
function cgcompare_and_set (line 165) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 179) | void cglabel(int l) {
function cgjump (line 184) | void cgjump(int l) {
function cgcompare_and_jump (line 193) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 208) | int cgwiden(int r, int oldtype, int newtype) {
FILE: 12_Types_pt1/cgn.c
function freeall_registers (line 15) | void freeall_registers(void) {
function alloc_register (line 21) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function cgpreamble (line 40) | void cgpreamble() {
function cgfuncpreamble (line 59) | void cgfuncpreamble(char *name) {
function cgfuncpostamble (line 68) | void cgfuncpostamble() {
function cgloadint (line 75) | int cgloadint(int value, int type) {
function cgloadglob (line 85) | int cgloadglob(int id) {
function cgadd (line 99) | int cgadd(int r1, int r2) {
function cgsub (line 107) | int cgsub(int r1, int r2) {
function cgmul (line 115) | int cgmul(int r1, int r2) {
function cgdiv (line 123) | int cgdiv(int r1, int r2) {
function cgprintint (line 133) | void cgprintint(int r) {
function cgstorglob (line 140) | int cgstorglob(int r, int id) {
function cgglobsym (line 150) | void cgglobsym(int id) {
function cgcompare_and_set (line 164) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 178) | void cglabel(int l) {
function cgjump (line 183) | void cgjump(int l) {
function cgcompare_and_jump (line 192) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 207) | int cgwiden(int r, int oldtype, int newtype) {
FILE: 12_Types_pt1/decl.c
function parse_type (line 11) | int parse_type(int t) {
function var_declaration (line 24) | void var_declaration(void) {
type ASTnode (line 45) | struct ASTnode
type ASTnode (line 46) | struct ASTnode
FILE: 12_Types_pt1/decl.h
type token (line 5) | struct token
type ASTnode (line 8) | struct ASTnode
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 17) | struct ASTnode
type ASTnode (line 45) | struct ASTnode
type ASTnode (line 48) | struct ASTnode
type ASTnode (line 69) | struct ASTnode
FILE: 12_Types_pt1/defs.h
type token (line 27) | struct token {
type ASTnode (line 48) | struct ASTnode {
type symtable (line 69) | struct symtable {
FILE: 12_Types_pt1/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
function arithop (line 46) | static int arithop(int tokentype) {
function op_precedence (line 63) | static int op_precedence(int tokentype) {
type ASTnode (line 72) | struct ASTnode
type ASTnode (line 73) | struct ASTnode
FILE: 12_Types_pt1/gen.c
function label (line 9) | static int label(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 168) | void genpreamble() {
function genfreeregs (line 171) | void genfreeregs() {
function genprintint (line 174) | void genprintint(int reg) {
function genglobsym (line 177) | void genglobsym(int id) {
FILE: 12_Types_pt1/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 12_Types_pt1/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 12_Types_pt1/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
function scan (line 132) | int scan(struct token *t) {
FILE: 12_Types_pt1/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 25) | struct ASTnode
type ASTnode (line 26) | struct ASTnode
type ASTnode (line 55) | struct ASTnode
type ASTnode (line 56) | struct ASTnode
type ASTnode (line 101) | struct ASTnode
type ASTnode (line 102) | struct ASTnode
type ASTnode (line 134) | struct ASTnode
type ASTnode (line 135) | struct ASTnode
type ASTnode (line 165) | struct ASTnode
type ASTnode (line 166) | struct ASTnode
type ASTnode (line 167) | struct ASTnode
type ASTnode (line 168) | struct ASTnode
type ASTnode (line 206) | struct ASTnode
type ASTnode (line 229) | struct ASTnode
type ASTnode (line 230) | struct ASTnode
type ASTnode (line 231) | struct ASTnode
FILE: 12_Types_pt1/sym.c
function findglob (line 12) | int findglob(char *s) {
function newglob (line 24) | static int newglob(void) {
function addglob (line 35) | int addglob(char *name, int type, int stype) {
FILE: 12_Types_pt1/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
FILE: 12_Types_pt1/types.c
function type_compatible (line 14) | int type_compatible(int *left, int *right, int onlyright) {
FILE: 13_Functions_pt2/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 35) | static void free_register(int reg) {
function cgpreamble (line 42) | void cgpreamble() {
function cgfuncpreamble (line 48) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 59) | void cgfuncpostamble(int id) {
function cgloadint (line 67) | int cgloadint(int value, int type) {
function cgloadglob (line 77) | int cgloadglob(int id) {
function cgadd (line 102) | int cgadd(int r1, int r2) {
function cgsub (line 110) | int cgsub(int r1, int r2) {
function cgmul (line 118) | int cgmul(int r1, int r2) {
function cgdiv (line 126) | int cgdiv(int r1, int r2) {
function cgprintint (line 136) | void cgprintint(int r) {
function cgcall (line 144) | int cgcall(int r, int id) {
function cgstorglob (line 155) | int cgstorglob(int r, int id) {
function cgprimsize (line 180) | int cgprimsize(int type) {
function cgglobsym (line 188) | void cgglobsym(int id) {
function cgcompare_and_set (line 202) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 216) | void cglabel(int l) {
function cgjump (line 221) | void cgjump(int l) {
function cgcompare_and_jump (line 230) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 245) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 251) | void cgreturn(int reg, int id) {
FILE: 13_Functions_pt2/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 35) | static void free_register(int reg) {
function cgpreamble (line 42) | void cgpreamble() {
function cgfuncpreamble (line 48) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 58) | void cgfuncpostamble(int id) {
function cgloadint (line 66) | int cgloadint(int value, int type) {
function cgloadglob (line 76) | int cgloadglob(int id) {
function cgadd (line 102) | int cgadd(int r1, int r2) {
function cgsub (line 110) | int cgsub(int r1, int r2) {
function cgmul (line 118) | int cgmul(int r1, int r2) {
function cgdiv (line 126) | int cgdiv(int r1, int r2) {
function cgprintint (line 136) | void cgprintint(int r) {
function cgcall (line 144) | int cgcall(int r, int id) {
function cgstorglob (line 155) | int cgstorglob(int r, int id) {
function cgprimsize (line 178) | int cgprimsize(int type) {
function cgglobsym (line 186) | void cgglobsym(int id) {
function cgcompare_and_set (line 200) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 214) | void cglabel(int l) {
function cgjump (line 219) | void cgjump(int l) {
function cgcompare_and_jump (line 228) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 243) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 249) | void cgreturn(int reg, int id) {
FILE: 13_Functions_pt2/decl.c
function parse_type (line 11) | int parse_type(int t) {
function var_declaration (line 26) | void var_declaration(void) {
type ASTnode (line 46) | struct ASTnode
type ASTnode (line 47) | struct ASTnode
FILE: 13_Functions_pt2/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 19) | struct ASTnode
type ASTnode (line 52) | struct ASTnode
type ASTnode (line 53) | struct ASTnode
type ASTnode (line 56) | struct ASTnode
type ASTnode (line 77) | struct ASTnode
FILE: 13_Functions_pt2/defs.h
type token (line 30) | struct token {
type ASTnode (line 52) | struct ASTnode {
type symtable (line 73) | struct symtable {
FILE: 13_Functions_pt2/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
function arithop (line 84) | static int arithop(int tokentype) {
function op_precedence (line 101) | static int op_precedence(int tokentype) {
type ASTnode (line 110) | struct ASTnode
type ASTnode (line 111) | struct ASTnode
FILE: 13_Functions_pt2/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 173) | void genpreamble() {
function genfreeregs (line 176) | void genfreeregs() {
function genprintint (line 179) | void genprintint(int reg) {
function genglobsym (line 182) | void genglobsym(int id) {
function genprimsize (line 185) | int genprimsize(int type) {
FILE: 13_Functions_pt2/lib/printint.c
function printint (line 2) | void printint(long x) {
FILE: 13_Functions_pt2/main.c
function init (line 12) | static void init() {
function usage (line 18) | static void usage(char *prog) {
function main (line 26) | void main(int argc, char *argv[]) {
FILE: 13_Functions_pt2/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 13_Functions_pt2/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
type token (line 139) | struct token
function reject_token (line 142) | void reject_token(struct token *t) {
function scan (line 150) | int scan(struct token *t) {
FILE: 13_Functions_pt2/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 28) | struct ASTnode
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 60) | struct ASTnode
type ASTnode (line 111) | struct ASTnode
type ASTnode (line 112) | struct ASTnode
type ASTnode (line 143) | struct ASTnode
type ASTnode (line 144) | struct ASTnode
type ASTnode (line 173) | struct ASTnode
type ASTnode (line 174) | struct ASTnode
type ASTnode (line 175) | struct ASTnode
type ASTnode (line 176) | struct ASTnode
type ASTnode (line 215) | struct ASTnode
type ASTnode (line 216) | struct ASTnode
type ASTnode (line 250) | struct ASTnode
type ASTnode (line 276) | struct ASTnode
type ASTnode (line 277) | struct ASTnode
type ASTnode (line 278) | struct ASTnode
FILE: 13_Functions_pt2/sym.c
function findglob (line 12) | int findglob(char *s) {
function newglob (line 24) | static int newglob(void) {
function addglob (line 35) | int addglob(char *name, int type, int stype, int endlabel) {
FILE: 13_Functions_pt2/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
FILE: 13_Functions_pt2/types.c
function type_compatible (line 14) | int type_compatible(int *left, int *right, int onlyright) {
FILE: 14_ARM_Platform/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 82) | int cgloadglob(int id) {
function cgadd (line 107) | int cgadd(int r1, int r2) {
function cgsub (line 115) | int cgsub(int r1, int r2) {
function cgmul (line 123) | int cgmul(int r1, int r2) {
function cgdiv (line 131) | int cgdiv(int r1, int r2) {
function cgprintint (line 141) | void cgprintint(int r) {
function cgcall (line 149) | int cgcall(int r, int id) {
function cgstorglob (line 160) | int cgstorglob(int r, int id) {
function cgprimsize (line 185) | int cgprimsize(int type) {
function cgglobsym (line 193) | void cgglobsym(int id) {
function cgcompare_and_set (line 207) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 221) | void cglabel(int l) {
function cgjump (line 226) | void cgjump(int l) {
function cgcompare_and_jump (line 235) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 250) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 256) | void cgreturn(int reg, int id) {
FILE: 14_ARM_Platform/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 158) | int cgadd(int r1, int r2) {
function cgsub (line 167) | int cgsub(int r1, int r2) {
function cgmul (line 176) | int cgmul(int r1, int r2) {
function cgdiv (line 185) | int cgdiv(int r1, int r2) {
function cgprintint (line 198) | void cgprintint(int r) {
function cgcall (line 207) | int cgcall(int r, int id) {
function cgstorglob (line 215) | int cgstorglob(int r, int id) {
function cgprimsize (line 240) | int cgprimsize(int type) {
function cgglobsym (line 248) | void cgglobsym(int id) {
function cgcompare_and_set (line 267) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 282) | void cglabel(int l) {
function cgjump (line 287) | void cgjump(int l) {
function cgcompare_and_jump (line 296) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 311) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 317) | void cgreturn(int reg, int id) {
FILE: 14_ARM_Platform/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 63) | void cgfuncpostamble(int id) {
function cgloadint (line 71) | int cgloadint(int value, int type) {
function cgloadglob (line 81) | int cgloadglob(int id) {
function cgadd (line 107) | int cgadd(int r1, int r2) {
function cgsub (line 115) | int cgsub(int r1, int r2) {
function cgmul (line 123) | int cgmul(int r1, int r2) {
function cgdiv (line 131) | int cgdiv(int r1, int r2) {
function cgprintint (line 141) | void cgprintint(int r) {
function cgcall (line 149) | int cgcall(int r, int id) {
function cgstorglob (line 160) | int cgstorglob(int r, int id) {
function cgprimsize (line 183) | int cgprimsize(int type) {
function cgglobsym (line 191) | void cgglobsym(int id) {
function cgcompare_and_set (line 205) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 219) | void cglabel(int l) {
function cgjump (line 224) | void cgjump(int l) {
function cgcompare_and_jump (line 233) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 248) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 254) | void cgreturn(int reg, int id) {
FILE: 14_ARM_Platform/decl.c
function parse_type (line 11) | int parse_type(int t) {
function var_declaration (line 27) | void var_declaration(void) {
type ASTnode (line 47) | struct ASTnode
type ASTnode (line 48) | struct ASTnode
FILE: 14_ARM_Platform/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 19) | struct ASTnode
type ASTnode (line 53) | struct ASTnode
type ASTnode (line 54) | struct ASTnode
type ASTnode (line 57) | struct ASTnode
type ASTnode (line 78) | struct ASTnode
FILE: 14_ARM_Platform/defs.h
type token (line 30) | struct token {
type ASTnode (line 52) | struct ASTnode {
type symtable (line 73) | struct symtable {
FILE: 14_ARM_Platform/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
function arithop (line 84) | static int arithop(int tokentype) {
function op_precedence (line 102) | static int op_precedence(int tokentype) {
type ASTnode (line 111) | struct ASTnode
type ASTnode (line 112) | struct ASTnode
FILE: 14_ARM_Platform/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 174) | void genpreamble() {
function genpostamble (line 177) | void genpostamble() {
function genfreeregs (line 180) | void genfreeregs() {
function genprintint (line 183) | void genprintint(int reg) {
function genglobsym (line 186) | void genglobsym(int id) {
function genprimsize (line 189) | int genprimsize(int type) {
FILE: 14_ARM_Platform/lib/printint.c
function printint (line 2) | void printint(long x) {
FILE: 14_ARM_Platform/main.c
function init (line 12) | static void init() {
function usage (line 19) | static void usage(char *prog) {
function main (line 27) | int main(int argc, char *argv[]) {
FILE: 14_ARM_Platform/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 14_ARM_Platform/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
type token (line 139) | struct token
function reject_token (line 142) | void reject_token(struct token *t) {
function scan (line 150) | int scan(struct token *t) {
FILE: 14_ARM_Platform/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 28) | struct ASTnode
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 58) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 110) | struct ASTnode
type ASTnode (line 111) | struct ASTnode
type ASTnode (line 142) | struct ASTnode
type ASTnode (line 143) | struct ASTnode
type ASTnode (line 172) | struct ASTnode
type ASTnode (line 173) | struct ASTnode
type ASTnode (line 174) | struct ASTnode
type ASTnode (line 175) | struct ASTnode
type ASTnode (line 214) | struct ASTnode
type ASTnode (line 215) | struct ASTnode
type ASTnode (line 249) | struct ASTnode
type ASTnode (line 276) | struct ASTnode
type ASTnode (line 277) | struct ASTnode
type ASTnode (line 278) | struct ASTnode
FILE: 14_ARM_Platform/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function addglob (line 33) | int addglob(char *name, int type, int stype, int endlabel) {
FILE: 14_ARM_Platform/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
FILE: 14_ARM_Platform/types.c
function type_compatible (line 14) | int type_compatible(int *left, int *right, int onlyright) {
FILE: 15_Pointers_pt1/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 82) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgprintint (line 144) | void cgprintint(int r) {
function cgcall (line 152) | int cgcall(int r, int id) {
function cgstorglob (line 163) | int cgstorglob(int r, int id) {
function cgprimsize (line 191) | int cgprimsize(int type) {
function cgglobsym (line 199) | void cgglobsym(int id) {
function cgcompare_and_set (line 213) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 227) | void cglabel(int l) {
function cgjump (line 232) | void cgjump(int l) {
function cgcompare_and_jump (line 241) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 256) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 262) | void cgreturn(int reg, int id) {
function cgaddress (line 283) | int cgaddress(int id) {
function cgderef (line 292) | int cgderef(int r, int type) {
FILE: 15_Pointers_pt1/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 166) | int cgadd(int r1, int r2) {
function cgsub (line 175) | int cgsub(int r1, int r2) {
function cgmul (line 184) | int cgmul(int r1, int r2) {
function cgdiv (line 193) | int cgdiv(int r1, int r2) {
function cgprintint (line 206) | void cgprintint(int r) {
function cgcall (line 215) | int cgcall(int r, int id) {
function cgstorglob (line 223) | int cgstorglob(int r, int id) {
function cgprimsize (line 251) | int cgprimsize(int type) {
function cgglobsym (line 259) | void cgglobsym(int id) {
function cgcompare_and_set (line 278) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 293) | void cglabel(int l) {
function cgjump (line 298) | void cgjump(int l) {
function cgcompare_and_jump (line 307) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 322) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 328) | void cgreturn(int reg, int id) {
function cgaddress (line 335) | int cgaddress(int id) {
function cgderef (line 347) | int cgderef(int r, int type) {
FILE: 15_Pointers_pt1/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 63) | void cgfuncpostamble(int id) {
function cgloadint (line 71) | int cgloadint(int value, int type) {
function cgloadglob (line 81) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgprintint (line 144) | void cgprintint(int r) {
function cgcall (line 152) | int cgcall(int r, int id) {
function cgstorglob (line 163) | int cgstorglob(int r, int id) {
function cgprimsize (line 189) | int cgprimsize(int type) {
function cgglobsym (line 197) | void cgglobsym(int id) {
function cgcompare_and_set (line 211) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 225) | void cglabel(int l) {
function cgjump (line 230) | void cgjump(int l) {
function cgcompare_and_jump (line 239) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 254) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 260) | void cgreturn(int reg, int id) {
function cgaddress (line 280) | int cgaddress(int id) {
function cgderef (line 289) | int cgderef(int r, int type) {
FILE: 15_Pointers_pt1/decl.c
function parse_type (line 12) | int parse_type(void) {
function var_declaration (line 47) | void var_declaration(void) {
type ASTnode (line 67) | struct ASTnode
type ASTnode (line 68) | struct ASTnode
FILE: 15_Pointers_pt1/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 19) | struct ASTnode
type ASTnode (line 55) | struct ASTnode
type ASTnode (line 56) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 80) | struct ASTnode
FILE: 15_Pointers_pt1/defs.h
type token (line 31) | struct token {
type ASTnode (line 54) | struct ASTnode {
type symtable (line 75) | struct symtable {
FILE: 15_Pointers_pt1/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
function arithop (line 84) | static int arithop(int tokentype) {
function op_precedence (line 102) | static int op_precedence(int tokentype) {
type ASTnode (line 116) | struct ASTnode
type ASTnode (line 117) | struct ASTnode
type ASTnode (line 156) | struct ASTnode
type ASTnode (line 157) | struct ASTnode
FILE: 15_Pointers_pt1/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 178) | void genpreamble() {
function genpostamble (line 181) | void genpostamble() {
function genfreeregs (line 184) | void genfreeregs() {
function genprintint (line 187) | void genprintint(int reg) {
function genglobsym (line 190) | void genglobsym(int id) {
function genprimsize (line 193) | int genprimsize(int type) {
FILE: 15_Pointers_pt1/lib/printint.c
function printint (line 2) | void printint(long x) {
FILE: 15_Pointers_pt1/main.c
function init (line 12) | static void init() {
function usage (line 19) | static void usage(char *prog) {
function main (line 27) | int main(int argc, char *argv[]) {
FILE: 15_Pointers_pt1/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 15_Pointers_pt1/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
type token (line 139) | struct token
function reject_token (line 142) | void reject_token(struct token *t) {
function scan (line 150) | int scan(struct token *t) {
FILE: 15_Pointers_pt1/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 28) | struct ASTnode
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 58) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 110) | struct ASTnode
type ASTnode (line 111) | struct ASTnode
type ASTnode (line 142) | struct ASTnode
type ASTnode (line 143) | struct ASTnode
type ASTnode (line 172) | struct ASTnode
type ASTnode (line 173) | struct ASTnode
type ASTnode (line 174) | struct ASTnode
type ASTnode (line 175) | struct ASTnode
type ASTnode (line 214) | struct ASTnode
type ASTnode (line 215) | struct ASTnode
type ASTnode (line 249) | struct ASTnode
type ASTnode (line 276) | struct ASTnode
type ASTnode (line 277) | struct ASTnode
type ASTnode (line 278) | struct ASTnode
FILE: 15_Pointers_pt1/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function addglob (line 33) | int addglob(char *name, int type, int stype, int endlabel) {
FILE: 15_Pointers_pt1/tests/input01.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input02.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input03.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input04.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input05.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input06.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input07.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input08.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input09.c
function main (line 1) | void main()
function fred (line 9) | void fred()
FILE: 15_Pointers_pt1/tests/input10.c
function main (line 1) | void main()
FILE: 15_Pointers_pt1/tests/input11.c
function main (line 1) | int main()
FILE: 15_Pointers_pt1/tests/input12.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 15_Pointers_pt1/tests/input13.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 15_Pointers_pt1/tests/input14.c
function fred (line 1) | int fred() {
function main (line 5) | int main() {
FILE: 15_Pointers_pt1/tests/input15.c
function main (line 1) | int main() {
FILE: 15_Pointers_pt1/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
FILE: 15_Pointers_pt1/types.c
function type_compatible (line 14) | int type_compatible(int *left, int *right, int onlyright) {
function pointer_to (line 52) | int pointer_to(int type) {
function value_at (line 75) | int value_at(int type) {
FILE: 16_Global_Vars/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 82) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgprintint (line 144) | void cgprintint(int r) {
function cgcall (line 152) | int cgcall(int r, int id) {
function cgstorglob (line 163) | int cgstorglob(int r, int id) {
function cgprimsize (line 191) | int cgprimsize(int type) {
function cgglobsym (line 199) | void cgglobsym(int id) {
function cgcompare_and_set (line 213) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 227) | void cglabel(int l) {
function cgjump (line 232) | void cgjump(int l) {
function cgcompare_and_jump (line 241) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 256) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 262) | void cgreturn(int reg, int id) {
function cgaddress (line 283) | int cgaddress(int id) {
function cgderef (line 292) | int cgderef(int r, int type) {
FILE: 16_Global_Vars/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 166) | int cgadd(int r1, int r2) {
function cgsub (line 175) | int cgsub(int r1, int r2) {
function cgmul (line 184) | int cgmul(int r1, int r2) {
function cgdiv (line 193) | int cgdiv(int r1, int r2) {
function cgprintint (line 206) | void cgprintint(int r) {
function cgcall (line 215) | int cgcall(int r, int id) {
function cgstorglob (line 223) | int cgstorglob(int r, int id) {
function cgprimsize (line 251) | int cgprimsize(int type) {
function cgglobsym (line 259) | void cgglobsym(int id) {
function cgcompare_and_set (line 278) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 293) | void cglabel(int l) {
function cgjump (line 298) | void cgjump(int l) {
function cgcompare_and_jump (line 307) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 322) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 328) | void cgreturn(int reg, int id) {
function cgaddress (line 335) | int cgaddress(int id) {
function cgderef (line 347) | int cgderef(int r, int type) {
FILE: 16_Global_Vars/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 63) | void cgfuncpostamble(int id) {
function cgloadint (line 71) | int cgloadint(int value, int type) {
function cgloadglob (line 81) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgprintint (line 144) | void cgprintint(int r) {
function cgcall (line 152) | int cgcall(int r, int id) {
function cgstorglob (line 163) | int cgstorglob(int r, int id) {
function cgprimsize (line 189) | int cgprimsize(int type) {
function cgglobsym (line 197) | void cgglobsym(int id) {
function cgcompare_and_set (line 211) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 225) | void cglabel(int l) {
function cgjump (line 230) | void cgjump(int l) {
function cgcompare_and_jump (line 239) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 254) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 260) | void cgreturn(int reg, int id) {
function cgaddress (line 280) | int cgaddress(int id) {
function cgderef (line 289) | int cgderef(int r, int type) {
FILE: 16_Global_Vars/decl.c
function parse_type (line 31) | int parse_type(void) {
function var_declaration (line 67) | void var_declaration(int type) {
type ASTnode (line 99) | struct ASTnode
type ASTnode (line 100) | struct ASTnode
function global_declarations (line 139) | void global_declarations(void) {
FILE: 16_Global_Vars/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 19) | struct ASTnode
type ASTnode (line 55) | struct ASTnode
type ASTnode (line 56) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 80) | struct ASTnode
FILE: 16_Global_Vars/defs.h
type token (line 31) | struct token {
type ASTnode (line 54) | struct ASTnode {
type symtable (line 75) | struct symtable {
FILE: 16_Global_Vars/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
function arithop (line 84) | static int arithop(int tokentype) {
function op_precedence (line 102) | static int op_precedence(int tokentype) {
type ASTnode (line 116) | struct ASTnode
type ASTnode (line 117) | struct ASTnode
type ASTnode (line 156) | struct ASTnode
type ASTnode (line 157) | struct ASTnode
FILE: 16_Global_Vars/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 178) | void genpreamble() {
function genpostamble (line 181) | void genpostamble() {
function genfreeregs (line 184) | void genfreeregs() {
function genprintint (line 187) | void genprintint(int reg) {
function genglobsym (line 190) | void genglobsym(int id) {
function genprimsize (line 193) | int genprimsize(int type) {
FILE: 16_Global_Vars/lib/printint.c
function printint (line 2) | void printint(long x) {
FILE: 16_Global_Vars/main.c
function init (line 12) | static void init() {
function usage (line 19) | static void usage(char *prog) {
function main (line 27) | int main(int argc, char *argv[]) {
FILE: 16_Global_Vars/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 16_Global_Vars/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
type token (line 139) | struct token
function reject_token (line 142) | void reject_token(struct token *t) {
function scan (line 150) | int scan(struct token *t) {
FILE: 16_Global_Vars/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 28) | struct ASTnode
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 58) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 110) | struct ASTnode
type ASTnode (line 111) | struct ASTnode
type ASTnode (line 142) | struct ASTnode
type ASTnode (line 143) | struct ASTnode
type ASTnode (line 172) | struct ASTnode
type ASTnode (line 173) | struct ASTnode
type ASTnode (line 174) | struct ASTnode
type ASTnode (line 175) | struct ASTnode
type ASTnode (line 214) | struct ASTnode
type ASTnode (line 215) | struct ASTnode
type ASTnode (line 248) | struct ASTnode
type ASTnode (line 284) | struct ASTnode
type ASTnode (line 285) | struct ASTnode
type ASTnode (line 286) | struct ASTnode
FILE: 16_Global_Vars/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function addglob (line 33) | int addglob(char *name, int type, int stype, int endlabel) {
FILE: 16_Global_Vars/tests/input01.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input02.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input03.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input04.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input05.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input06.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input07.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input08.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input09.c
function main (line 1) | void main()
function fred (line 9) | void fred()
FILE: 16_Global_Vars/tests/input10.c
function main (line 1) | void main()
FILE: 16_Global_Vars/tests/input11.c
function main (line 1) | int main()
FILE: 16_Global_Vars/tests/input12.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 16_Global_Vars/tests/input13.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 16_Global_Vars/tests/input14.c
function fred (line 1) | int fred() {
function main (line 5) | int main() {
FILE: 16_Global_Vars/tests/input15.c
function main (line 1) | int main() {
FILE: 16_Global_Vars/tests/input16.c
function main (line 4) | int main() {
FILE: 16_Global_Vars/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
FILE: 16_Global_Vars/types.c
function type_compatible (line 14) | int type_compatible(int *left, int *right, int onlyright) {
function pointer_to (line 52) | int pointer_to(int type) {
function value_at (line 75) | int value_at(int type) {
FILE: 17_Scaling_Offsets/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 82) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgprintint (line 144) | void cgprintint(int r) {
function cgcall (line 152) | int cgcall(int r, int id) {
function cgshlconst (line 163) | int cgshlconst(int r, int val) {
function cgstorglob (line 169) | int cgstorglob(int r, int id) {
function cgprimsize (line 197) | int cgprimsize(int type) {
function cgglobsym (line 205) | void cgglobsym(int id) {
function cgcompare_and_set (line 225) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 239) | void cglabel(int l) {
function cgjump (line 244) | void cgjump(int l) {
function cgcompare_and_jump (line 253) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 268) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 274) | void cgreturn(int reg, int id) {
function cgaddress (line 295) | int cgaddress(int id) {
function cgderef (line 304) | int cgderef(int r, int type) {
FILE: 17_Scaling_Offsets/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 166) | int cgadd(int r1, int r2) {
function cgsub (line 175) | int cgsub(int r1, int r2) {
function cgmul (line 184) | int cgmul(int r1, int r2) {
function cgdiv (line 193) | int cgdiv(int r1, int r2) {
function cgprintint (line 206) | void cgprintint(int r) {
function cgcall (line 215) | int cgcall(int r, int id) {
function cgshlconst (line 223) | int cgshlconst(int r, int val) {
function cgstorglob (line 229) | int cgstorglob(int r, int id) {
function cgprimsize (line 257) | int cgprimsize(int type) {
function cgglobsym (line 265) | void cgglobsym(int id) {
function cgcompare_and_set (line 289) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 304) | void cglabel(int l) {
function cgjump (line 309) | void cgjump(int l) {
function cgcompare_and_jump (line 318) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 333) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 339) | void cgreturn(int reg, int id) {
function cgaddress (line 346) | int cgaddress(int id) {
function cgderef (line 358) | int cgderef(int r, int type) {
FILE: 17_Scaling_Offsets/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 63) | void cgfuncpostamble(int id) {
function cgloadint (line 71) | int cgloadint(int value, int type) {
function cgloadglob (line 81) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgprintint (line 144) | void cgprintint(int r) {
function cgcall (line 152) | int cgcall(int r, int id) {
function cgshlconst (line 163) | int cgshlconst(int r, int val) {
function cgstorglob (line 169) | int cgstorglob(int r, int id) {
function cgprimsize (line 195) | int cgprimsize(int type) {
function cgglobsym (line 203) | void cgglobsym(int id) {
function cgcompare_and_set (line 223) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 237) | void cglabel(int l) {
function cgjump (line 242) | void cgjump(int l) {
function cgcompare_and_jump (line 251) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 266) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 272) | void cgreturn(int reg, int id) {
function cgaddress (line 292) | int cgaddress(int id) {
function cgderef (line 301) | int cgderef(int r, int type) {
FILE: 17_Scaling_Offsets/decl.c
function parse_type (line 12) | int parse_type(void) {
function var_declaration (line 48) | void var_declaration(int type) {
type ASTnode (line 65) | struct ASTnode
type ASTnode (line 66) | struct ASTnode
function global_declarations (line 105) | void global_declarations(void) {
FILE: 17_Scaling_Offsets/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 19) | struct ASTnode
type ASTnode (line 56) | struct ASTnode
type ASTnode (line 57) | struct ASTnode
type ASTnode (line 60) | struct ASTnode
type ASTnode (line 81) | struct ASTnode
type ASTnode (line 88) | struct ASTnode
type ASTnode (line 88) | struct ASTnode
FILE: 17_Scaling_Offsets/defs.h
type token (line 31) | struct token {
type ASTnode (line 54) | struct ASTnode {
type symtable (line 76) | struct symtable {
FILE: 17_Scaling_Offsets/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
function arithop (line 84) | static int arithop(int tokentype) {
function op_precedence (line 102) | static int op_precedence(int tokentype) {
type ASTnode (line 116) | struct ASTnode
type ASTnode (line 117) | struct ASTnode
type ASTnode (line 156) | struct ASTnode
type ASTnode (line 157) | struct ASTnode
type ASTnode (line 158) | struct ASTnode
FILE: 17_Scaling_Offsets/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 60) | static int genWHILE(struct ASTnode *n) {
function genAST (line 90) | int genAST(struct ASTnode *n, int reg, int parentASTop) {
function genpreamble (line 191) | void genpreamble() {
function genpostamble (line 194) | void genpostamble() {
function genfreeregs (line 197) | void genfreeregs() {
function genprintint (line 200) | void genprintint(int reg) {
function genglobsym (line 203) | void genglobsym(int id) {
function genprimsize (line 206) | int genprimsize(int type) {
FILE: 17_Scaling_Offsets/lib/printint.c
function printint (line 2) | void printint(long x) {
FILE: 17_Scaling_Offsets/main.c
function init (line 12) | static void init() {
function usage (line 19) | static void usage(char *prog) {
function main (line 27) | int main(int argc, char *argv[]) {
FILE: 17_Scaling_Offsets/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 17_Scaling_Offsets/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
type token (line 139) | struct token
function reject_token (line 142) | void reject_token(struct token *t) {
function scan (line 150) | int scan(struct token *t) {
FILE: 17_Scaling_Offsets/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 28) | struct ASTnode
type ASTnode (line 29) | struct ASTnode
type ASTnode (line 52) | struct ASTnode
type ASTnode (line 53) | struct ASTnode
type ASTnode (line 98) | struct ASTnode
type ASTnode (line 99) | struct ASTnode
type ASTnode (line 130) | struct ASTnode
type ASTnode (line 131) | struct ASTnode
type ASTnode (line 160) | struct ASTnode
type ASTnode (line 161) | struct ASTnode
type ASTnode (line 162) | struct ASTnode
type ASTnode (line 163) | struct ASTnode
type ASTnode (line 202) | struct ASTnode
type ASTnode (line 203) | struct ASTnode
type ASTnode (line 230) | struct ASTnode
type ASTnode (line 266) | struct ASTnode
type ASTnode (line 267) | struct ASTnode
type ASTnode (line 268) | struct ASTnode
FILE: 17_Scaling_Offsets/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function addglob (line 33) | int addglob(char *name, int type, int stype, int endlabel) {
FILE: 17_Scaling_Offsets/tests/input01.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input02.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input03.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input04.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input05.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input06.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input07.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input08.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input09.c
function main (line 1) | void main()
function fred (line 9) | void fred()
FILE: 17_Scaling_Offsets/tests/input10.c
function main (line 1) | void main()
FILE: 17_Scaling_Offsets/tests/input11.c
function main (line 1) | int main()
FILE: 17_Scaling_Offsets/tests/input12.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 17_Scaling_Offsets/tests/input13.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 17_Scaling_Offsets/tests/input14.c
function fred (line 1) | int fred() {
function main (line 5) | int main() {
FILE: 17_Scaling_Offsets/tests/input15.c
function main (line 1) | int main() {
FILE: 17_Scaling_Offsets/tests/input16.c
function main (line 6) | int main() {
FILE: 17_Scaling_Offsets/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
FILE: 17_Scaling_Offsets/types.c
function inttype (line 10) | int inttype(int type) {
function ptrtype (line 17) | int ptrtype(int type) {
function pointer_to (line 26) | int pointer_to(int type) {
function value_at (line 49) | int value_at(int type) {
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
FILE: 18_Lvalues_Revisited/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 82) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgprintint (line 144) | void cgprintint(int r) {
function cgcall (line 152) | int cgcall(int r, int id) {
function cgshlconst (line 163) | int cgshlconst(int r, int val) {
function cgstorglob (line 169) | int cgstorglob(int r, int id) {
function cgprimsize (line 197) | int cgprimsize(int type) {
function cgglobsym (line 205) | void cgglobsym(int id) {
function cgcompare_and_set (line 225) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 239) | void cglabel(int l) {
function cgjump (line 244) | void cgjump(int l) {
function cgcompare_and_jump (line 253) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 268) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 274) | void cgreturn(int reg, int id) {
function cgaddress (line 295) | int cgaddress(int id) {
function cgderef (line 304) | int cgderef(int r, int type) {
function cgstorderef (line 322) | int cgstorderef(int r1, int r2, int type) {
FILE: 18_Lvalues_Revisited/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 172) | int cgadd(int r1, int r2) {
function cgsub (line 181) | int cgsub(int r1, int r2) {
function cgmul (line 190) | int cgmul(int r1, int r2) {
function cgdiv (line 199) | int cgdiv(int r1, int r2) {
function cgprintint (line 212) | void cgprintint(int r) {
function cgcall (line 221) | int cgcall(int r, int id) {
function cgshlconst (line 229) | int cgshlconst(int r, int val) {
function cgstorglob (line 235) | int cgstorglob(int r, int id) {
function cgprimsize (line 263) | int cgprimsize(int type) {
function cgglobsym (line 271) | void cgglobsym(int id) {
function cgcompare_and_set (line 295) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 310) | void cglabel(int l) {
function cgjump (line 315) | void cgjump(int l) {
function cgcompare_and_jump (line 324) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 339) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 345) | void cgreturn(int reg, int id) {
function cgaddress (line 352) | int cgaddress(int id) {
function cgderef (line 364) | int cgderef(int r, int type) {
function cgstorderef (line 378) | int cgstorderef(int r1, int r2, int type) {
FILE: 18_Lvalues_Revisited/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 63) | void cgfuncpostamble(int id) {
function cgloadint (line 71) | int cgloadint(int value, int type) {
function cgloadglob (line 81) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgprintint (line 144) | void cgprintint(int r) {
function cgcall (line 152) | int cgcall(int r, int id) {
function cgshlconst (line 163) | int cgshlconst(int r, int val) {
function cgstorglob (line 169) | int cgstorglob(int r, int id) {
function cgprimsize (line 195) | int cgprimsize(int type) {
function cgglobsym (line 203) | void cgglobsym(int id) {
function cgcompare_and_set (line 223) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 237) | void cglabel(int l) {
function cgjump (line 242) | void cgjump(int l) {
function cgcompare_and_jump (line 251) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 266) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 272) | void cgreturn(int reg, int id) {
function cgaddress (line 292) | int cgaddress(int id) {
function cgderef (line 301) | int cgderef(int r, int type) {
function cgstorderef (line 317) | int cgstorderef(int r1, int r2, int type) {
FILE: 18_Lvalues_Revisited/decl.c
function parse_type (line 12) | int parse_type(void) {
function var_declaration (line 48) | void var_declaration(int type) {
type ASTnode (line 65) | struct ASTnode
type ASTnode (line 66) | struct ASTnode
function global_declarations (line 105) | void global_declarations(void) {
FILE: 18_Lvalues_Revisited/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 20) | struct ASTnode
type ASTnode (line 58) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 62) | struct ASTnode
type ASTnode (line 83) | struct ASTnode
type ASTnode (line 90) | struct ASTnode
type ASTnode (line 90) | struct ASTnode
FILE: 18_Lvalues_Revisited/defs.h
type token (line 32) | struct token {
type ASTnode (line 54) | struct ASTnode {
type symtable (line 79) | struct symtable {
FILE: 18_Lvalues_Revisited/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
function binastop (line 84) | static int binastop(int tokentype) {
function rightassoc (line 93) | static int rightassoc(int tokentype) {
function op_precedence (line 111) | static int op_precedence(int tokentype) {
type ASTnode (line 125) | struct ASTnode
type ASTnode (line 126) | struct ASTnode
type ASTnode (line 165) | struct ASTnode
type ASTnode (line 166) | struct ASTnode
type ASTnode (line 167) | struct ASTnode
FILE: 18_Lvalues_Revisited/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 58) | static int genWHILE(struct ASTnode *n) {
function genAST (line 86) | int genAST(struct ASTnode *n, int label, int parentASTop) {
function genpreamble (line 195) | void genpreamble() {
function genpostamble (line 198) | void genpostamble() {
function genfreeregs (line 201) | void genfreeregs() {
function genprintint (line 204) | void genprintint(int reg) {
function genglobsym (line 207) | void genglobsym(int id) {
function genprimsize (line 210) | int genprimsize(int type) {
FILE: 18_Lvalues_Revisited/lib/printint.c
function printint (line 2) | void printint(long x) {
FILE: 18_Lvalues_Revisited/main.c
function init (line 12) | static void init() {
function usage (line 20) | static void usage(char *prog) {
function main (line 28) | int main(int argc, char *argv[]) {
FILE: 18_Lvalues_Revisited/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 18_Lvalues_Revisited/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
type token (line 135) | struct token
function reject_token (line 138) | void reject_token(struct token *t) {
function scan (line 146) | int scan(struct token *t) {
FILE: 18_Lvalues_Revisited/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 66) | struct ASTnode
type ASTnode (line 67) | struct ASTnode
type ASTnode (line 96) | struct ASTnode
type ASTnode (line 97) | struct ASTnode
type ASTnode (line 98) | struct ASTnode
type ASTnode (line 99) | struct ASTnode
type ASTnode (line 138) | struct ASTnode
type ASTnode (line 139) | struct ASTnode
type ASTnode (line 166) | struct ASTnode
type ASTnode (line 200) | struct ASTnode
type ASTnode (line 201) | struct ASTnode
type ASTnode (line 202) | struct ASTnode
FILE: 18_Lvalues_Revisited/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function addglob (line 33) | int addglob(char *name, int type, int stype, int endlabel) {
FILE: 18_Lvalues_Revisited/tests/input01.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input02.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input03.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input04.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input05.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input06.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input07.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input08.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input09.c
function main (line 1) | void main()
function fred (line 9) | void fred()
FILE: 18_Lvalues_Revisited/tests/input10.c
function main (line 1) | void main()
FILE: 18_Lvalues_Revisited/tests/input11.c
function main (line 1) | int main()
FILE: 18_Lvalues_Revisited/tests/input12.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 18_Lvalues_Revisited/tests/input13.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 18_Lvalues_Revisited/tests/input14.c
function fred (line 1) | int fred() {
function main (line 5) | int main() {
FILE: 18_Lvalues_Revisited/tests/input15.c
function main (line 1) | int main() {
FILE: 18_Lvalues_Revisited/tests/input16.c
function main (line 6) | int main() {
FILE: 18_Lvalues_Revisited/tests/input17.c
function main (line 1) | int main() {
FILE: 18_Lvalues_Revisited/tests/input18.c
function main (line 1) | int main()
FILE: 18_Lvalues_Revisited/tests/input18a.c
function main (line 6) | int main()
FILE: 18_Lvalues_Revisited/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
function gendumplabel (line 44) | static int gendumplabel(void) {
function dumpAST (line 51) | void dumpAST(struct ASTnode *n, int label, int level) {
FILE: 18_Lvalues_Revisited/types.c
function inttype (line 10) | int inttype(int type) {
function ptrtype (line 17) | int ptrtype(int type) {
function pointer_to (line 26) | int pointer_to(int type) {
function value_at (line 49) | int value_at(int type) {
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
FILE: 19_Arrays_pt1/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 82) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgcall (line 145) | int cgcall(int r, int id) {
function cgshlconst (line 156) | int cgshlconst(int r, int val) {
function cgstorglob (line 162) | int cgstorglob(int r, int id) {
function cgprimsize (line 190) | int cgprimsize(int type) {
function cgglobsym (line 198) | void cgglobsym(int id) {
function cgcompare_and_set (line 224) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 238) | void cglabel(int l) {
function cgjump (line 243) | void cgjump(int l) {
function cgcompare_and_jump (line 252) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 267) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 273) | void cgreturn(int reg, int id) {
function cgaddress (line 294) | int cgaddress(int id) {
function cgderef (line 303) | int cgderef(int r, int type) {
function cgstorderef (line 321) | int cgstorderef(int r1, int r2, int type) {
FILE: 19_Arrays_pt1/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 172) | int cgadd(int r1, int r2) {
function cgsub (line 181) | int cgsub(int r1, int r2) {
function cgmul (line 190) | int cgmul(int r1, int r2) {
function cgdiv (line 199) | int cgdiv(int r1, int r2) {
function cgcall (line 213) | int cgcall(int r, int id) {
function cgshlconst (line 221) | int cgshlconst(int r, int val) {
function cgstorglob (line 227) | int cgstorglob(int r, int id) {
function cgprimsize (line 255) | int cgprimsize(int type) {
function cgglobsym (line 263) | void cgglobsym(int id) {
function cgcompare_and_set (line 287) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 302) | void cglabel(int l) {
function cgjump (line 307) | void cgjump(int l) {
function cgcompare_and_jump (line 316) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 331) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 337) | void cgreturn(int reg, int id) {
function cgaddress (line 344) | int cgaddress(int id) {
function cgderef (line 356) | int cgderef(int r, int type) {
function cgstorderef (line 370) | int cgstorderef(int r1, int r2, int type) {
FILE: 19_Arrays_pt1/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 63) | void cgfuncpostamble(int id) {
function cgloadint (line 71) | int cgloadint(int value, int type) {
function cgloadglob (line 81) | int cgloadglob(int id) {
function cgadd (line 110) | int cgadd(int r1, int r2) {
function cgsub (line 118) | int cgsub(int r1, int r2) {
function cgmul (line 126) | int cgmul(int r1, int r2) {
function cgdiv (line 134) | int cgdiv(int r1, int r2) {
function cgcall (line 145) | int cgcall(int r, int id) {
function cgshlconst (line 156) | int cgshlconst(int r, int val) {
function cgstorglob (line 162) | int cgstorglob(int r, int id) {
function cgprimsize (line 188) | int cgprimsize(int type) {
function cgglobsym (line 196) | void cgglobsym(int id) {
function cgcompare_and_set (line 232) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 246) | void cglabel(int l) {
function cgjump (line 251) | void cgjump(int l) {
function cgcompare_and_jump (line 260) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 275) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 281) | void cgreturn(int reg, int id) {
function cgaddress (line 301) | int cgaddress(int id) {
function cgderef (line 310) | int cgderef(int r, int type) {
function cgstorderef (line 326) | int cgstorderef(int r1, int r2, int type) {
FILE: 19_Arrays_pt1/decl.c
function parse_type (line 12) | int parse_type(void) {
function var_declaration (line 51) | void var_declaration(int type) {
type ASTnode (line 87) | struct ASTnode
type ASTnode (line 88) | struct ASTnode
function global_declarations (line 127) | void global_declarations(void) {
FILE: 19_Arrays_pt1/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 20) | struct ASTnode
type ASTnode (line 56) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 80) | struct ASTnode
type ASTnode (line 88) | struct ASTnode
type ASTnode (line 88) | struct ASTnode
FILE: 19_Arrays_pt1/defs.h
type token (line 33) | struct token {
type ASTnode (line 55) | struct ASTnode {
type symtable (line 80) | struct symtable {
FILE: 19_Arrays_pt1/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
type ASTnode (line 74) | struct ASTnode
type ASTnode (line 75) | struct ASTnode
function binastop (line 135) | static int binastop(int tokentype) {
function rightassoc (line 144) | static int rightassoc(int tokentype) {
function op_precedence (line 162) | static int op_precedence(int tokentype) {
type ASTnode (line 179) | struct ASTnode
type ASTnode (line 180) | struct ASTnode
type ASTnode (line 219) | struct ASTnode
type ASTnode (line 220) | struct ASTnode
type ASTnode (line 221) | struct ASTnode
FILE: 19_Arrays_pt1/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 58) | static int genWHILE(struct ASTnode *n) {
function genAST (line 86) | int genAST(struct ASTnode *n, int label, int parentASTop) {
function genpreamble (line 195) | void genpreamble() {
function genpostamble (line 198) | void genpostamble() {
function genfreeregs (line 201) | void genfreeregs() {
function genglobsym (line 204) | void genglobsym(int id) {
function genprimsize (line 207) | int genprimsize(int type) {
FILE: 19_Arrays_pt1/lib/printint.c
function printint (line 2) | void printint(long x) {
FILE: 19_Arrays_pt1/main.c
function init (line 12) | static void init() {
function usage (line 20) | static void usage(char *prog) {
function main (line 28) | int main(int argc, char *argv[]) {
FILE: 19_Arrays_pt1/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 19_Arrays_pt1/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanint (line 53) | static int scanint(int c) {
function scanident (line 69) | static int scanident(int c, char *buf, int lim) {
function keyword (line 94) | static int keyword(char *s) {
type token (line 135) | struct token
function reject_token (line 138) | void reject_token(struct token *t) {
function scan (line 146) | int scan(struct token *t) {
FILE: 19_Arrays_pt1/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 66) | struct ASTnode
type ASTnode (line 67) | struct ASTnode
type ASTnode (line 96) | struct ASTnode
type ASTnode (line 97) | struct ASTnode
type ASTnode (line 98) | struct ASTnode
type ASTnode (line 99) | struct ASTnode
type ASTnode (line 138) | struct ASTnode
type ASTnode (line 139) | struct ASTnode
type ASTnode (line 166) | struct ASTnode
type ASTnode (line 200) | struct ASTnode
type ASTnode (line 201) | struct ASTnode
type ASTnode (line 202) | struct ASTnode
FILE: 19_Arrays_pt1/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function addglob (line 36) | int addglob(char *name, int type, int stype, int endlabel, int size) {
FILE: 19_Arrays_pt1/tests/input01.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input02.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input03.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input04.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input05.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input06.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input07.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input08.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input09.c
function main (line 1) | void main()
function fred (line 9) | void fred()
FILE: 19_Arrays_pt1/tests/input10.c
function main (line 1) | void main()
FILE: 19_Arrays_pt1/tests/input11.c
function main (line 1) | int main()
FILE: 19_Arrays_pt1/tests/input12.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 19_Arrays_pt1/tests/input13.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 19_Arrays_pt1/tests/input14.c
function fred (line 1) | int fred() {
function main (line 5) | int main() {
FILE: 19_Arrays_pt1/tests/input15.c
function main (line 1) | int main() {
FILE: 19_Arrays_pt1/tests/input16.c
function main (line 6) | int main() {
FILE: 19_Arrays_pt1/tests/input17.c
function main (line 1) | int main() {
FILE: 19_Arrays_pt1/tests/input18.c
function main (line 1) | int main()
FILE: 19_Arrays_pt1/tests/input18a.c
function main (line 6) | int main()
FILE: 19_Arrays_pt1/tests/input19.c
function main (line 6) | int main()
FILE: 19_Arrays_pt1/tests/input20.c
function main (line 4) | int main() {
FILE: 19_Arrays_pt1/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
function gendumplabel (line 44) | static int gendumplabel(void) {
function dumpAST (line 51) | void dumpAST(struct ASTnode *n, int label, int level) {
FILE: 19_Arrays_pt1/types.c
function inttype (line 10) | int inttype(int type) {
function ptrtype (line 17) | int ptrtype(int type) {
function pointer_to (line 26) | int pointer_to(int type) {
function value_at (line 49) | int value_at(int type) {
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
FILE: 20_Char_Str_Literals/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 82) | int cgloadglob(int id) {
function cgloadglobstr (line 110) | int cgloadglobstr(int id) {
function cgadd (line 119) | int cgadd(int r1, int r2) {
function cgsub (line 127) | int cgsub(int r1, int r2) {
function cgmul (line 135) | int cgmul(int r1, int r2) {
function cgdiv (line 143) | int cgdiv(int r1, int r2) {
function cgcall (line 154) | int cgcall(int r, int id) {
function cgshlconst (line 165) | int cgshlconst(int r, int val) {
function cgstorglob (line 171) | int cgstorglob(int r, int id) {
function cgprimsize (line 199) | int cgprimsize(int type) {
function cgglobsym (line 207) | void cgglobsym(int id) {
function cgglobstr (line 228) | void cgglobstr(int l, char *strvalue) {
function cgcompare_and_set (line 243) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 257) | void cglabel(int l) {
function cgjump (line 262) | void cgjump(int l) {
function cgcompare_and_jump (line 271) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 286) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 292) | void cgreturn(int reg, int id) {
function cgaddress (line 313) | int cgaddress(int id) {
function cgderef (line 322) | int cgderef(int r, int type) {
function cgstorderef (line 340) | int cgstorderef(int r1, int r2, int type) {
FILE: 20_Char_Str_Literals/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 172) | int cgadd(int r1, int r2) {
function cgsub (line 181) | int cgsub(int r1, int r2) {
function cgmul (line 190) | int cgmul(int r1, int r2) {
function cgdiv (line 199) | int cgdiv(int r1, int r2) {
function cgcall (line 213) | int cgcall(int r, int id) {
function cgshlconst (line 221) | int cgshlconst(int r, int val) {
function cgstorglob (line 227) | int cgstorglob(int r, int id) {
function cgprimsize (line 255) | int cgprimsize(int type) {
function cgglobsym (line 263) | void cgglobsym(int id) {
function cgcompare_and_set (line 287) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 302) | void cglabel(int l) {
function cgjump (line 307) | void cgjump(int l) {
function cgcompare_and_jump (line 316) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 331) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 337) | void cgreturn(int reg, int id) {
function cgaddress (line 344) | int cgaddress(int id) {
function cgderef (line 356) | int cgderef(int r, int type) {
function cgstorderef (line 370) | int cgstorderef(int r1, int r2, int type) {
FILE: 20_Char_Str_Literals/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 50) | void cgpostamble() {
function cgfuncpreamble (line 54) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 82) | int cgloadglob(int id) {
function cgloadglobstr (line 111) | int cgloadglobstr(int id) {
function cgadd (line 120) | int cgadd(int r1, int r2) {
function cgsub (line 128) | int cgsub(int r1, int r2) {
function cgmul (line 136) | int cgmul(int r1, int r2) {
function cgdiv (line 144) | int cgdiv(int r1, int r2) {
function cgcall (line 155) | int cgcall(int r, int id) {
function cgshlconst (line 166) | int cgshlconst(int r, int val) {
function cgstorglob (line 172) | int cgstorglob(int r, int id) {
function cgprimsize (line 198) | int cgprimsize(int type) {
function cgglobsym (line 206) | void cgglobsym(int id) {
function cgglobstr (line 237) | void cgglobstr(int l, char *strvalue) {
function cgcompare_and_set (line 291) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 305) | void cglabel(int l) {
function cgjump (line 310) | void cgjump(int l) {
function cgcompare_and_jump (line 319) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 334) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 340) | void cgreturn(int reg, int id) {
function cgaddress (line 360) | int cgaddress(int id) {
function cgderef (line 369) | int cgderef(int r, int type) {
function cgstorderef (line 385) | int cgstorderef(int r1, int r2, int type) {
FILE: 20_Char_Str_Literals/decl.c
function parse_type (line 12) | int parse_type(void) {
function var_declaration (line 51) | void var_declaration(int type) {
type ASTnode (line 87) | struct ASTnode
type ASTnode (line 88) | struct ASTnode
function global_declarations (line 127) | void global_declarations(void) {
FILE: 20_Char_Str_Literals/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 20) | struct ASTnode
type ASTnode (line 59) | struct ASTnode
type ASTnode (line 62) | struct ASTnode
type ASTnode (line 83) | struct ASTnode
type ASTnode (line 91) | struct ASTnode
type ASTnode (line 91) | struct ASTnode
FILE: 20_Char_Str_Literals/defs.h
type token (line 32) | struct token {
type ASTnode (line 54) | struct ASTnode {
type symtable (line 79) | struct symtable {
FILE: 20_Char_Str_Literals/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
type ASTnode (line 74) | struct ASTnode
type ASTnode (line 75) | struct ASTnode
function binastop (line 142) | static int binastop(int tokentype) {
function rightassoc (line 151) | static int rightassoc(int tokentype) {
function op_precedence (line 169) | static int op_precedence(int tokentype) {
type ASTnode (line 186) | struct ASTnode
type ASTnode (line 187) | struct ASTnode
type ASTnode (line 226) | struct ASTnode
type ASTnode (line 227) | struct ASTnode
type ASTnode (line 228) | struct ASTnode
FILE: 20_Char_Str_Literals/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 58) | static int genWHILE(struct ASTnode *n) {
function genAST (line 86) | int genAST(struct ASTnode *n, int label, int parentASTop) {
function genpreamble (line 197) | void genpreamble() {
function genpostamble (line 200) | void genpostamble() {
function genfreeregs (line 203) | void genfreeregs() {
function genglobsym (line 206) | void genglobsym(int id) {
function genglobstr (line 209) | int genglobstr(char *strvalue) {
function genprimsize (line 214) | int genprimsize(int type) {
FILE: 20_Char_Str_Literals/lib/printint.c
function printint (line 2) | void printint(long x) {
function printchar (line 6) | void printchar(long x) {
FILE: 20_Char_Str_Literals/main.c
function init (line 12) | static void init() {
function usage (line 20) | static void usage(char *prog) {
function main (line 28) | int main(int argc, char *argv[]) {
FILE: 20_Char_Str_Literals/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 20_Char_Str_Literals/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanch (line 53) | static int scanch(void) {
function scanint (line 90) | static int scanint(int c) {
function scanstr (line 107) | static int scanstr(char *buf) {
function scanident (line 127) | static int scanident(int c, char *buf, int lim) {
function keyword (line 152) | static int keyword(char *s) {
type token (line 193) | struct token
function reject_token (line 196) | void reject_token(struct token *t) {
function scan (line 204) | int scan(struct token *t) {
FILE: 20_Char_Str_Literals/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 66) | struct ASTnode
type ASTnode (line 67) | struct ASTnode
type ASTnode (line 96) | struct ASTnode
type ASTnode (line 97) | struct ASTnode
type ASTnode (line 98) | struct ASTnode
type ASTnode (line 99) | struct ASTnode
type ASTnode (line 138) | struct ASTnode
type ASTnode (line 139) | struct ASTnode
type ASTnode (line 166) | struct ASTnode
type ASTnode (line 200) | struct ASTnode
type ASTnode (line 201) | struct ASTnode
type ASTnode (line 202) | struct ASTnode
FILE: 20_Char_Str_Literals/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function addglob (line 36) | int addglob(char *name, int type, int stype, int endlabel, int size) {
FILE: 20_Char_Str_Literals/tests/input01.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input02.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input03.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input04.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input05.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input06.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input07.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input08.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input09.c
function main (line 1) | void main()
function fred (line 9) | void fred()
FILE: 20_Char_Str_Literals/tests/input10.c
function main (line 1) | void main()
FILE: 20_Char_Str_Literals/tests/input11.c
function main (line 1) | int main()
FILE: 20_Char_Str_Literals/tests/input12.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 20_Char_Str_Literals/tests/input13.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 20_Char_Str_Literals/tests/input14.c
function fred (line 1) | int fred() {
function main (line 5) | int main() {
FILE: 20_Char_Str_Literals/tests/input15.c
function main (line 1) | int main() {
FILE: 20_Char_Str_Literals/tests/input16.c
function main (line 6) | int main() {
FILE: 20_Char_Str_Literals/tests/input17.c
function main (line 1) | int main() {
FILE: 20_Char_Str_Literals/tests/input18.c
function main (line 1) | int main()
FILE: 20_Char_Str_Literals/tests/input18a.c
function main (line 6) | int main()
FILE: 20_Char_Str_Literals/tests/input19.c
function main (line 6) | int main()
FILE: 20_Char_Str_Literals/tests/input20.c
function main (line 4) | int main() {
FILE: 20_Char_Str_Literals/tests/input21.c
function main (line 4) | int main() {
FILE: 20_Char_Str_Literals/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
function gendumplabel (line 44) | static int gendumplabel(void) {
function dumpAST (line 51) | void dumpAST(struct ASTnode *n, int label, int level) {
FILE: 20_Char_Str_Literals/types.c
function inttype (line 10) | int inttype(int type) {
function ptrtype (line 17) | int ptrtype(int type) {
function pointer_to (line 26) | int pointer_to(int type) {
function value_at (line 49) | int value_at(int type) {
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
FILE: 21_More_Operators/cg.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 49) | void cgpostamble() {
function cgfuncpreamble (line 53) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 84) | int cgloadglob(int id, int op) {
function cgloadglobstr (line 136) | int cgloadglobstr(int id) {
function cgadd (line 145) | int cgadd(int r1, int r2) {
function cgsub (line 153) | int cgsub(int r1, int r2) {
function cgmul (line 161) | int cgmul(int r1, int r2) {
function cgdiv (line 169) | int cgdiv(int r1, int r2) {
function cgand (line 178) | int cgand(int r1, int r2) {
function cgor (line 184) | int cgor(int r1, int r2) {
function cgxor (line 190) | int cgxor(int r1, int r2) {
function cgshl (line 196) | int cgshl(int r1, int r2) {
function cgshr (line 203) | int cgshr(int r1, int r2) {
function cgnegate (line 211) | int cgnegate(int r) {
function cginvert (line 217) | int cginvert(int r) {
function cglognot (line 223) | int cglognot(int r) {
function cgboolean (line 232) | int cgboolean(int r, int op, int label) {
function cgcall (line 245) | int cgcall(int r, int id) {
function cgshlconst (line 256) | int cgshlconst(int r, int val) {
function cgstorglob (line 262) | int cgstorglob(int r, int id) {
function cgprimsize (line 290) | int cgprimsize(int type) {
function cgglobsym (line 298) | void cgglobsym(int id) {
function cgglobstr (line 326) | void cgglobstr(int l, char *strvalue) {
function cgcompare_and_set (line 341) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 355) | void cglabel(int l) {
function cgjump (line 360) | void cgjump(int l) {
function cgcompare_and_jump (line 369) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 384) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 390) | void cgreturn(int reg, int id) {
function cgaddress (line 411) | int cgaddress(int id) {
function cgderef (line 420) | int cgderef(int r, int type) {
function cgstorderef (line 438) | int cgstorderef(int r1, int r2, int type) {
FILE: 21_More_Operators/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 172) | int cgadd(int r1, int r2) {
function cgsub (line 181) | int cgsub(int r1, int r2) {
function cgmul (line 190) | int cgmul(int r1, int r2) {
function cgdiv (line 199) | int cgdiv(int r1, int r2) {
function cgcall (line 213) | int cgcall(int r, int id) {
function cgshlconst (line 221) | int cgshlconst(int r, int val) {
function cgstorglob (line 227) | int cgstorglob(int r, int id) {
function cgprimsize (line 255) | int cgprimsize(int type) {
function cgglobsym (line 263) | void cgglobsym(int id) {
function cgcompare_and_set (line 292) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 307) | void cglabel(int l) {
function cgjump (line 312) | void cgjump(int l) {
function cgcompare_and_jump (line 321) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 336) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 342) | void cgreturn(int reg, int id) {
function cgaddress (line 349) | int cgaddress(int id) {
function cgderef (line 361) | int cgderef(int r, int type) {
function cgstorderef (line 375) | int cgstorderef(int r1, int r2, int type) {
FILE: 21_More_Operators/cgn.c
function freeall_registers (line 17) | void freeall_registers(void) {
function alloc_register (line 23) | static int alloc_register(void) {
function free_register (line 36) | static void free_register(int reg) {
function cgpreamble (line 43) | void cgpreamble() {
function cgpostamble (line 50) | void cgpostamble() {
function cgfuncpreamble (line 54) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 64) | void cgfuncpostamble(int id) {
function cgloadint (line 72) | int cgloadint(int value, int type) {
function cgloadglob (line 84) | int cgloadglob(int id, int op) {
function cgloadglobstr (line 137) | int cgloadglobstr(int id) {
function cgadd (line 146) | int cgadd(int r1, int r2) {
function cgsub (line 154) | int cgsub(int r1, int r2) {
function cgmul (line 162) | int cgmul(int r1, int r2) {
function cgdiv (line 170) | int cgdiv(int r1, int r2) {
function cgand (line 179) | int cgand(int r1, int r2) {
function cgor (line 185) | int cgor(int r1, int r2) {
function cgxor (line 191) | int cgxor(int r1, int r2) {
function cgshl (line 197) | int cgshl(int r1, int r2) {
function cgshr (line 204) | int cgshr(int r1, int r2) {
function cgnegate (line 212) | int cgnegate(int r) {
function cginvert (line 218) | int cginvert(int r) {
function cglognot (line 224) | int cglognot(int r) {
function cgboolean (line 233) | int cgboolean(int r, int op, int label) {
function cgcall (line 246) | int cgcall(int r, int id) {
function cgshlconst (line 257) | int cgshlconst(int r, int val) {
function cgstorglob (line 263) | int cgstorglob(int r, int id) {
function cgprimsize (line 289) | int cgprimsize(int type) {
function cgglobsym (line 297) | void cgglobsym(int id) {
function cgglobstr (line 342) | void cgglobstr(int l, char *strvalue) {
function cgcompare_and_set (line 396) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 410) | void cglabel(int l) {
function cgjump (line 415) | void cgjump(int l) {
function cgcompare_and_jump (line 424) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 439) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 445) | void cgreturn(int reg, int id) {
function cgaddress (line 465) | int cgaddress(int id) {
function cgderef (line 474) | int cgderef(int r, int type) {
function cgstorderef (line 491) | int cgstorderef(int r1, int r2, int type) {
FILE: 21_More_Operators/decl.c
function parse_type (line 12) | int parse_type(void) {
function var_declaration (line 51) | void var_declaration(int type) {
type ASTnode (line 86) | struct ASTnode
type ASTnode (line 87) | struct ASTnode
function global_declarations (line 126) | void global_declarations(void) {
FILE: 21_More_Operators/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 20) | struct ASTnode
type ASTnode (line 68) | struct ASTnode
type ASTnode (line 71) | struct ASTnode
type ASTnode (line 92) | struct ASTnode
type ASTnode (line 100) | struct ASTnode
type ASTnode (line 100) | struct ASTnode
FILE: 21_More_Operators/defs.h
type token (line 40) | struct token {
type ASTnode (line 65) | struct ASTnode {
type symtable (line 90) | struct symtable {
FILE: 21_More_Operators/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
type ASTnode (line 75) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 117) | struct ASTnode
type ASTnode (line 118) | struct ASTnode
function binastop (line 160) | static int binastop(int tokentype) {
function rightassoc (line 169) | static int rightassoc(int tokentype) {
function op_precedence (line 189) | static int op_precedence(int tokentype) {
type ASTnode (line 209) | struct ASTnode
type ASTnode (line 210) | struct ASTnode
type ASTnode (line 310) | struct ASTnode
type ASTnode (line 311) | struct ASTnode
type ASTnode (line 312) | struct ASTnode
FILE: 21_More_Operators/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 58) | static int genWHILE(struct ASTnode *n) {
function genAST (line 86) | int genAST(struct ASTnode *n, int label, int parentASTop) {
function genpreamble (line 238) | void genpreamble() {
function genpostamble (line 241) | void genpostamble() {
function genfreeregs (line 244) | void genfreeregs() {
function genglobsym (line 247) | void genglobsym(int id) {
function genglobstr (line 250) | int genglobstr(char *strvalue) {
function genprimsize (line 255) | int genprimsize(int type) {
FILE: 21_More_Operators/lib/printint.c
function printint (line 2) | void printint(long x) {
function printchar (line 6) | void printchar(long x) {
FILE: 21_More_Operators/main.c
function init (line 12) | static void init() {
function usage (line 20) | static void usage(char *prog) {
function main (line 28) | int main(int argc, char *argv[]) {
FILE: 21_More_Operators/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 21_More_Operators/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanch (line 53) | static int scanch(void) {
function scanint (line 90) | static int scanint(int c) {
function scanstr (line 107) | static int scanstr(char *buf) {
function scanident (line 127) | static int scanident(int c, char *buf, int lim) {
function keyword (line 152) | static int keyword(char *s) {
type token (line 193) | struct token
function reject_token (line 196) | void reject_token(struct token *t) {
function scan (line 204) | int scan(struct token *t) {
FILE: 21_More_Operators/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 67) | struct ASTnode
type ASTnode (line 68) | struct ASTnode
type ASTnode (line 98) | struct ASTnode
type ASTnode (line 99) | struct ASTnode
type ASTnode (line 100) | struct ASTnode
type ASTnode (line 101) | struct ASTnode
type ASTnode (line 142) | struct ASTnode
type ASTnode (line 143) | struct ASTnode
type ASTnode (line 170) | struct ASTnode
type ASTnode (line 204) | struct ASTnode
type ASTnode (line 205) | struct ASTnode
type ASTnode (line 206) | struct ASTnode
FILE: 21_More_Operators/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function addglob (line 36) | int addglob(char *name, int type, int stype, int endlabel, int size) {
FILE: 21_More_Operators/tests/input01.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input02.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input03.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input04.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input05.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input06.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input07.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input08.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input09.c
function main (line 1) | void main()
function fred (line 9) | void fred()
FILE: 21_More_Operators/tests/input10.c
function main (line 1) | void main()
FILE: 21_More_Operators/tests/input11.c
function main (line 1) | int main()
FILE: 21_More_Operators/tests/input12.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 21_More_Operators/tests/input13.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 21_More_Operators/tests/input14.c
function fred (line 1) | int fred() {
function main (line 5) | int main() {
FILE: 21_More_Operators/tests/input15.c
function main (line 1) | int main() {
FILE: 21_More_Operators/tests/input16.c
function main (line 6) | int main() {
FILE: 21_More_Operators/tests/input17.c
function main (line 1) | int main() {
FILE: 21_More_Operators/tests/input18.c
function main (line 1) | int main()
FILE: 21_More_Operators/tests/input18a.c
function main (line 6) | int main()
FILE: 21_More_Operators/tests/input19.c
function main (line 6) | int main()
FILE: 21_More_Operators/tests/input20.c
function main (line 4) | int main() {
FILE: 21_More_Operators/tests/input21.c
function main (line 4) | int main() {
FILE: 21_More_Operators/tests/input22.c
function main (line 6) | int main() {
FILE: 21_More_Operators/tests/input23.c
function main (line 4) | int main() {
FILE: 21_More_Operators/tests/input24.c
function main (line 4) | int main() {
FILE: 21_More_Operators/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
function gendumplabel (line 44) | static int gendumplabel(void) {
function dumpAST (line 51) | void dumpAST(struct ASTnode *n, int label, int level) {
FILE: 21_More_Operators/types.c
function inttype (line 10) | int inttype(int type) {
function ptrtype (line 17) | int ptrtype(int type) {
function pointer_to (line 26) | int pointer_to(int type) {
function value_at (line 49) | int value_at(int type) {
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
FILE: 23_Local_Variables/cg.c
function cgtextseg (line 11) | void cgtextseg() {
function cgdataseg (line 18) | void cgdataseg() {
function cgresetlocals (line 31) | void cgresetlocals(void) {
function cggetlocaloffset (line 37) | int cggetlocaloffset(int type, int isparam) {
function freeall_registers (line 54) | void freeall_registers(void) {
function alloc_register (line 60) | static int alloc_register(void) {
function free_register (line 73) | static void free_register(int reg) {
function cgpreamble (line 80) | void cgpreamble() {
function cgpostamble (line 85) | void cgpostamble() {
function cgfuncpreamble (line 89) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 107) | void cgfuncpostamble(int id) {
function cgloadint (line 116) | int cgloadint(int value, int type) {
function cgloadglob (line 128) | int cgloadglob(int id, int op) {
function cgloadlocal (line 183) | int cgloadlocal(int id, int op) {
function cgloadglobstr (line 236) | int cgloadglobstr(int id) {
function cgadd (line 245) | int cgadd(int r1, int r2) {
function cgsub (line 253) | int cgsub(int r1, int r2) {
function cgmul (line 261) | int cgmul(int r1, int r2) {
function cgdiv (line 269) | int cgdiv(int r1, int r2) {
function cgand (line 278) | int cgand(int r1, int r2) {
function cgor (line 284) | int cgor(int r1, int r2) {
function cgxor (line 290) | int cgxor(int r1, int r2) {
function cgshl (line 296) | int cgshl(int r1, int r2) {
function cgshr (line 303) | int cgshr(int r1, int r2) {
function cgnegate (line 311) | int cgnegate(int r) {
function cginvert (line 317) | int cginvert(int r) {
function cglognot (line 323) | int cglognot(int r) {
function cgboolean (line 332) | int cgboolean(int r, int op, int label) {
function cgcall (line 345) | int cgcall(int r, int id) {
function cgshlconst (line 356) | int cgshlconst(int r, int val) {
function cgstorglob (line 362) | int cgstorglob(int r, int id) {
function cgstorlocal (line 386) | int cgstorlocal(int r, int id) {
function cgprimsize (line 415) | int cgprimsize(int type) {
function cgglobsym (line 423) | void cgglobsym(int id) {
function cgglobstr (line 456) | void cgglobstr(int l, char *strvalue) {
function cgcompare_and_set (line 471) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 485) | void cglabel(int l) {
function cgjump (line 490) | void cgjump(int l) {
function cgcompare_and_jump (line 499) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 514) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 520) | void cgreturn(int reg, int id) {
function cgaddress (line 541) | int cgaddress(int id) {
function cgderef (line 555) | int cgderef(int r, int type) {
function cgstorderef (line 573) | int cgstorderef(int r1, int r2, int type) {
FILE: 23_Local_Variables/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 172) | int cgadd(int r1, int r2) {
function cgsub (line 181) | int cgsub(int r1, int r2) {
function cgmul (line 190) | int cgmul(int r1, int r2) {
function cgdiv (line 199) | int cgdiv(int r1, int r2) {
function cgcall (line 213) | int cgcall(int r, int id) {
function cgshlconst (line 221) | int cgshlconst(int r, int val) {
function cgstorglob (line 227) | int cgstorglob(int r, int id) {
function cgprimsize (line 255) | int cgprimsize(int type) {
function cgglobsym (line 263) | void cgglobsym(int id) {
function cgcompare_and_set (line 292) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 307) | void cglabel(int l) {
function cgjump (line 312) | void cgjump(int l) {
function cgcompare_and_jump (line 321) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 336) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 342) | void cgreturn(int reg, int id) {
function cgaddress (line 349) | int cgaddress(int id) {
function cgderef (line 361) | int cgderef(int r, int type) {
function cgstorderef (line 375) | int cgstorderef(int r1, int r2, int type) {
FILE: 23_Local_Variables/cgn.c
function cgtextseg (line 11) | void cgtextseg() {
function cgdataseg (line 18) | void cgdataseg() {
function cgresetlocals (line 31) | void cgresetlocals(void) {
function cggetlocaloffset (line 37) | int cggetlocaloffset(int type, int isparam) {
function freeall_registers (line 54) | void freeall_registers(void) {
function alloc_register (line 60) | static int alloc_register(void) {
function free_register (line 73) | static void free_register(int reg) {
function cgpreamble (line 80) | void cgpreamble() {
function cgpostamble (line 87) | void cgpostamble() {
function cgfuncpreamble (line 91) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 107) | void cgfuncpostamble(int id) {
function cgloadint (line 116) | int cgloadint(int value, int type) {
function cgloadglob (line 128) | int cgloadglob(int id, int op) {
function cgloadlocal (line 183) | int cgloadlocal(int id, int op) {
function cgloadglobstr (line 238) | int cgloadglobstr(int id) {
function cgadd (line 247) | int cgadd(int r1, int r2) {
function cgsub (line 255) | int cgsub(int r1, int r2) {
function cgmul (line 263) | int cgmul(int r1, int r2) {
function cgdiv (line 271) | int cgdiv(int r1, int r2) {
function cgand (line 280) | int cgand(int r1, int r2) {
function cgor (line 286) | int cgor(int r1, int r2) {
function cgxor (line 292) | int cgxor(int r1, int r2) {
function cgshl (line 298) | int cgshl(int r1, int r2) {
function cgshr (line 305) | int cgshr(int r1, int r2) {
function cgnegate (line 313) | int cgnegate(int r) {
function cginvert (line 319) | int cginvert(int r) {
function cglognot (line 325) | int cglognot(int r) {
function cgboolean (line 334) | int cgboolean(int r, int op, int label) {
function cgcall (line 347) | int cgcall(int r, int id) {
function cgshlconst (line 358) | int cgshlconst(int r, int val) {
function cgstorglob (line 364) | int cgstorglob(int r, int id) {
function cgstorlocal (line 385) | int cgstorlocal(int r, int id) {
function cgprimsize (line 414) | int cgprimsize(int type) {
function cgglobsym (line 422) | void cgglobsym(int id) {
function cgglobstr (line 470) | void cgglobstr(int l, char *strvalue) {
function cgcompare_and_set (line 524) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 538) | void cglabel(int l) {
function cgjump (line 543) | void cgjump(int l) {
function cgcompare_and_jump (line 552) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 567) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 573) | void cgreturn(int reg, int id) {
function cgaddress (line 593) | int cgaddress(int id) {
function cgderef (line 606) | int cgderef(int r, int type) {
function cgstorderef (line 622) | int cgstorderef(int r1, int r2, int type) {
FILE: 23_Local_Variables/decl.c
function parse_type (line 12) | int parse_type(void) {
function var_declaration (line 51) | void var_declaration(int type, int islocal) {
type ASTnode (line 91) | struct ASTnode
type ASTnode (line 92) | struct ASTnode
function global_declarations (line 133) | void global_declarations(void) {
FILE: 23_Local_Variables/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 20) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 79) | struct ASTnode
type ASTnode (line 103) | struct ASTnode
type ASTnode (line 111) | struct ASTnode
type ASTnode (line 111) | struct ASTnode
FILE: 23_Local_Variables/defs.h
type token (line 40) | struct token {
type ASTnode (line 65) | struct ASTnode {
type symtable (line 96) | struct symtable {
FILE: 23_Local_Variables/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
type ASTnode (line 75) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 117) | struct ASTnode
type ASTnode (line 118) | struct ASTnode
function binastop (line 160) | static int binastop(int tokentype) {
function rightassoc (line 169) | static int rightassoc(int tokentype) {
function op_precedence (line 189) | static int op_precedence(int tokentype) {
type ASTnode (line 209) | struct ASTnode
type ASTnode (line 210) | struct ASTnode
type ASTnode (line 310) | struct ASTnode
type ASTnode (line 311) | struct ASTnode
type ASTnode (line 312) | struct ASTnode
FILE: 23_Local_Variables/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 58) | static int genWHILE(struct ASTnode *n) {
function genAST (line 86) | int genAST(struct ASTnode *n, int label, int parentASTop) {
function genpreamble (line 245) | void genpreamble() {
function genpostamble (line 248) | void genpostamble() {
function genfreeregs (line 251) | void genfreeregs() {
function genglobsym (line 254) | void genglobsym(int id) {
function genglobstr (line 257) | int genglobstr(char *strvalue) {
function genprimsize (line 262) | int genprimsize(int type) {
function genresetlocals (line 265) | void genresetlocals(void) {
function gengetlocaloffset (line 268) | int gengetlocaloffset(int type, int isparam) {
FILE: 23_Local_Variables/lib/printint.c
function printint (line 2) | void printint(long x) {
function printchar (line 6) | void printchar(long x) {
FILE: 23_Local_Variables/main.c
function init (line 12) | static void init() {
function usage (line 21) | static void usage(char *prog) {
function main (line 29) | int main(int argc, char *argv[]) {
FILE: 23_Local_Variables/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 23_Local_Variables/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void putback(int c) {
function skip (line 41) | static int skip(void) {
function scanch (line 53) | static int scanch(void) {
function scanint (line 90) | static int scanint(int c) {
function scanstr (line 107) | static int scanstr(char *buf) {
function scanident (line 127) | static int scanident(int c, char *buf, int lim) {
function keyword (line 152) | static int keyword(char *s) {
type token (line 193) | struct token
function reject_token (line 196) | void reject_token(struct token *t) {
function scan (line 204) | int scan(struct token *t) {
FILE: 23_Local_Variables/stmt.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 34) | struct ASTnode
type ASTnode (line 35) | struct ASTnode
type ASTnode (line 67) | struct ASTnode
type ASTnode (line 68) | struct ASTnode
type ASTnode (line 98) | struct ASTnode
type ASTnode (line 99) | struct ASTnode
type ASTnode (line 100) | struct ASTnode
type ASTnode (line 101) | struct ASTnode
type ASTnode (line 142) | struct ASTnode
type ASTnode (line 143) | struct ASTnode
type ASTnode (line 170) | struct ASTnode
type ASTnode (line 203) | struct ASTnode
type ASTnode (line 204) | struct ASTnode
type ASTnode (line 205) | struct ASTnode
FILE: 23_Local_Variables/sym.c
function findglob (line 10) | int findglob(char *s) {
function newglob (line 22) | static int newglob(void) {
function findlocl (line 32) | int findlocl(char *s) {
function newlocl (line 44) | static int newlocl(void) {
function updatesym (line 58) | static void updatesym(int slot, char *name, int type, int stype,
function addglob (line 77) | int addglob(char *name, int type, int stype, int endlabel, int size) {
function addlocl (line 98) | int addlocl(char *name, int type, int stype, int endlabel, int size) {
function findsymbol (line 115) | int findsymbol(char *s) {
FILE: 23_Local_Variables/tests/input01.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input02.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input03.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input04.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input05.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input06.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input07.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input08.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input09.c
function main (line 1) | void main()
function fred (line 9) | void fred()
FILE: 23_Local_Variables/tests/input10.c
function main (line 1) | void main()
FILE: 23_Local_Variables/tests/input11.c
function main (line 1) | int main()
FILE: 23_Local_Variables/tests/input12.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 23_Local_Variables/tests/input13.c
function fred (line 1) | int fred() {
function main (line 5) | void main() {
FILE: 23_Local_Variables/tests/input14.c
function fred (line 1) | int fred() {
function main (line 5) | int main() {
FILE: 23_Local_Variables/tests/input15.c
function main (line 1) | int main() {
FILE: 23_Local_Variables/tests/input16.c
function main (line 6) | int main() {
FILE: 23_Local_Variables/tests/input17.c
function main (line 1) | int main() {
FILE: 23_Local_Variables/tests/input18.c
function main (line 1) | int main()
FILE: 23_Local_Variables/tests/input18a.c
function main (line 6) | int main()
FILE: 23_Local_Variables/tests/input19.c
function main (line 6) | int main()
FILE: 23_Local_Variables/tests/input20.c
function main (line 4) | int main() {
FILE: 23_Local_Variables/tests/input21.c
function main (line 4) | int main() {
FILE: 23_Local_Variables/tests/input22.c
function main (line 6) | int main() {
FILE: 23_Local_Variables/tests/input23.c
function main (line 4) | int main() {
FILE: 23_Local_Variables/tests/input24.c
function main (line 4) | int main() {
FILE: 23_Local_Variables/tests/input25.c
function main (line 5) | int main()
FILE: 23_Local_Variables/tree.c
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 32) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
function gendumplabel (line 44) | static int gendumplabel(void) {
function dumpAST (line 51) | void dumpAST(struct ASTnode *n, int label, int level) {
FILE: 23_Local_Variables/types.c
function inttype (line 10) | int inttype(int type) {
function ptrtype (line 17) | int ptrtype(int type) {
function pointer_to (line 26) | int pointer_to(int type) {
function value_at (line 49) | int value_at(int type) {
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
FILE: 24_Function_Params/cg.c
function cgtextseg (line 11) | void cgtextseg() {
function cgdataseg (line 18) | void cgdataseg() {
function newlocaloffset (line 31) | static int newlocaloffset(int type) {
function freeall_registers (line 57) | void freeall_registers(void) {
function alloc_register (line 63) | static int alloc_register(void) {
function free_register (line 76) | static void free_register(int reg) {
function cgpreamble (line 83) | void cgpreamble() {
function cgpostamble (line 88) | void cgpostamble() {
function cgfuncpreamble (line 92) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 138) | void cgfuncpostamble(int id) {
function cgloadint (line 147) | int cgloadint(int value, int type) {
function cgloadglob (line 159) | int cgloadglob(int id, int op) {
function cgloadlocal (line 214) | int cgloadlocal(int id, int op) {
function cgloadglobstr (line 267) | int cgloadglobstr(int id) {
function cgadd (line 276) | int cgadd(int r1, int r2) {
function cgsub (line 284) | int cgsub(int r1, int r2) {
function cgmul (line 292) | int cgmul(int r1, int r2) {
function cgdiv (line 300) | int cgdiv(int r1, int r2) {
function cgand (line 309) | int cgand(int r1, int r2) {
function cgor (line 315) | int cgor(int r1, int r2) {
function cgxor (line 321) | int cgxor(int r1, int r2) {
function cgshl (line 327) | int cgshl(int r1, int r2) {
function cgshr (line 334) | int cgshr(int r1, int r2) {
function cgnegate (line 342) | int cgnegate(int r) {
function cginvert (line 348) | int cginvert(int r) {
function cglognot (line 354) | int cglognot(int r) {
function cgboolean (line 363) | int cgboolean(int r, int op, int label) {
function cgcall (line 376) | int cgcall(int r, int id) {
function cgshlconst (line 387) | int cgshlconst(int r, int val) {
function cgstorglob (line 393) | int cgstorglob(int r, int id) {
function cgstorlocal (line 417) | int cgstorlocal(int r, int id) {
function cgprimsize (line 446) | int cgprimsize(int type) {
function cgglobsym (line 454) | void cgglobsym(int id) {
function cgglobstr (line 487) | void cgglobstr(int l, char *strvalue) {
function cgcompare_and_set (line 502) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 516) | void cglabel(int l) {
function cgjump (line 521) | void cgjump(int l) {
function cgcompare_and_jump (line 530) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 545) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 551) | void cgreturn(int reg, int id) {
function cgaddress (line 572) | int cgaddress(int id) {
function cgderef (line 586) | int cgderef(int r, int type) {
function cgstorderef (line 604) | int cgstorderef(int r1, int r2, int type) {
FILE: 24_Function_Params/cg_arm.c
function freeall_registers (line 14) | void freeall_registers(void) {
function alloc_register (line 20) | static int alloc_register(void) {
function free_register (line 33) | static void free_register(int reg) {
function set_int_offset (line 48) | static void set_int_offset(int val) {
function cgpreamble (line 71) | void cgpreamble() {
function cgpostamble (line 77) | void cgpostamble() {
function cgfuncpreamble (line 94) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 106) | void cgfuncpostamble(int id) {
function cgloadint (line 113) | int cgloadint(int value, int type) {
function set_var_offset (line 129) | static void set_var_offset(int id) {
function cgloadglob (line 146) | int cgloadglob(int id) {
function cgadd (line 172) | int cgadd(int r1, int r2) {
function cgsub (line 181) | int cgsub(int r1, int r2) {
function cgmul (line 190) | int cgmul(int r1, int r2) {
function cgdiv (line 199) | int cgdiv(int r1, int r2) {
function cgcall (line 213) | int cgcall(int r, int id) {
function cgshlconst (line 221) | int cgshlconst(int r, int val) {
function cgstorglob (line 227) | int cgstorglob(int r, int id) {
function cgprimsize (line 255) | int cgprimsize(int type) {
function cgglobsym (line 263) | void cgglobsym(int id) {
function cgcompare_and_set (line 292) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 307) | void cglabel(int l) {
function cgjump (line 312) | void cgjump(int l) {
function cgcompare_and_jump (line 321) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 336) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 342) | void cgreturn(int reg, int id) {
function cgaddress (line 349) | int cgaddress(int id) {
function cgderef (line 361) | int cgderef(int r, int type) {
function cgstorderef (line 375) | int cgstorderef(int r1, int r2, int type) {
FILE: 24_Function_Params/cgn.c
function cgtextseg (line 11) | void cgtextseg() {
function cgdataseg (line 18) | void cgdataseg() {
function newlocaloffset (line 31) | int newlocaloffset(int type) {
function freeall_registers (line 53) | void freeall_registers(void) {
function alloc_register (line 59) | static int alloc_register(void) {
function free_register (line 72) | static void free_register(int reg) {
function cgpreamble (line 79) | void cgpreamble() {
function cgpostamble (line 86) | void cgpostamble() {
function cgfuncpreamble (line 90) | void cgfuncpreamble(int id) {
function cgfuncpostamble (line 135) | void cgfuncpostamble(int id) {
function cgloadint (line 144) | int cgloadint(int value, int type) {
function cgloadglob (line 156) | int cgloadglob(int id, int op) {
function cgloadlocal (line 211) | int cgloadlocal(int id, int op) {
function cgloadglobstr (line 266) | int cgloadglobstr(int id) {
function cgadd (line 275) | int cgadd(int r1, int r2) {
function cgsub (line 283) | int cgsub(int r1, int r2) {
function cgmul (line 291) | int cgmul(int r1, int r2) {
function cgdiv (line 299) | int cgdiv(int r1, int r2) {
function cgand (line 308) | int cgand(int r1, int r2) {
function cgor (line 314) | int cgor(int r1, int r2) {
function cgxor (line 320) | int cgxor(int r1, int r2) {
function cgshl (line 326) | int cgshl(int r1, int r2) {
function cgshr (line 333) | int cgshr(int r1, int r2) {
function cgnegate (line 341) | int cgnegate(int r) {
function cginvert (line 347) | int cginvert(int r) {
function cglognot (line 353) | int cglognot(int r) {
function cgboolean (line 362) | int cgboolean(int r, int op, int label) {
function cgcall (line 375) | int cgcall(int r, int id) {
function cgshlconst (line 386) | int cgshlconst(int r, int val) {
function cgstorglob (line 392) | int cgstorglob(int r, int id) {
function cgstorlocal (line 413) | int cgstorlocal(int r, int id) {
function cgprimsize (line 442) | int cgprimsize(int type) {
function cgglobsym (line 450) | void cgglobsym(int id) {
function cgglobstr (line 498) | void cgglobstr(int l, char *strvalue) {
function cgcompare_and_set (line 552) | int cgcompare_and_set(int ASTop, int r1, int r2) {
function cglabel (line 566) | void cglabel(int l) {
function cgjump (line 571) | void cgjump(int l) {
function cgcompare_and_jump (line 580) | int cgcompare_and_jump(int ASTop, int r1, int r2, int label) {
function cgwiden (line 595) | int cgwiden(int r, int oldtype, int newtype) {
function cgreturn (line 601) | void cgreturn(int reg, int id) {
function cgaddress (line 621) | int cgaddress(int id) {
function cgderef (line 634) | int cgderef(int r, int type) {
function cgstorderef (line 652) | int cgstorderef(int r1, int r2, int type) {
FILE: 24_Function_Params/decl.c
function parse_type (line 12) | int parse_type(void) {
function var_declaration (line 53) | void var_declaration(int type, int islocal, int isparam) {
function param_declaration (line 93) | static int param_declaration(void) {
type ASTnode (line 124) | struct ASTnode
type ASTnode (line 125) | struct ASTnode
function global_declarations (line 167) | void global_declarations(void) {
FILE: 24_Function_Params/decl.h
type token (line 5) | struct token
type token (line 6) | struct token
type ASTnode (line 9) | struct ASTnode
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 12) | struct ASTnode
type ASTnode (line 13) | struct ASTnode
type ASTnode (line 14) | struct ASTnode
type ASTnode (line 15) | struct ASTnode
type ASTnode (line 16) | struct ASTnode
type ASTnode (line 20) | struct ASTnode
type ASTnode (line 72) | struct ASTnode
type ASTnode (line 75) | struct ASTnode
type ASTnode (line 100) | struct ASTnode
type ASTnode (line 108) | struct ASTnode
type ASTnode (line 108) | struct ASTnode
FILE: 24_Function_Params/defs.h
type token (line 40) | struct token {
type ASTnode (line 65) | struct ASTnode {
type symtable (line 97) | struct symtable {
FILE: 24_Function_Params/expr.c
type ASTnode (line 10) | struct ASTnode
type ASTnode (line 11) | struct ASTnode
type ASTnode (line 37) | struct ASTnode
type ASTnode (line 38) | struct ASTnode
type ASTnode (line 75) | struct ASTnode
type ASTnode (line 76) | struct ASTnode
type ASTnode (line 117) | struct ASTnode
type ASTnode (line 118) | struct ASTnode
function binastop (line 160) | static int binastop(int tokentype) {
function rightassoc (line 169) | static int rightassoc(int tokentype) {
function op_precedence (line 189) | static int op_precedence(int tokentype) {
type ASTnode (line 209) | struct ASTnode
type ASTnode (line 210) | struct ASTnode
type ASTnode (line 310) | struct ASTnode
type ASTnode (line 311) | struct ASTnode
type ASTnode (line 312) | struct ASTnode
FILE: 24_Function_Params/gen.c
function genlabel (line 9) | int genlabel(void) {
function genIF (line 16) | static int genIF(struct ASTnode *n) {
function genWHILE (line 58) | static int genWHILE(struct ASTnode *n) {
function genAST (line 86) | int genAST(struct ASTnode *n, int label, int parentASTop) {
function genpreamble (line 245) | void genpreamble() {
function genpostamble (line 248) | void genpostamble() {
function genfreeregs (line 251) | void genfreeregs() {
function genglobsym (line 254) | void genglobsym(int id) {
function genglobstr (line 257) | int genglobstr(char *strvalue) {
function genprimsize (line 262) | int genprimsize(int type) {
FILE: 24_Function_Params/input27a.c
function param8 (line 1) | int param8(int a, int b, int c, int d, int e, int f, int g, int h) {
function param5 (line 7) | int param5(int a, int b, int c, int d, int e) {
function param2 (line 12) | int param2(int a, int b) {
function param0 (line 19) | int param0() {
FILE: 24_Function_Params/input27b.c
function main (line 7) | int main() {
FILE: 24_Function_Params/lib/printint.c
function printint (line 2) | void printint(long x) {
function printchar (line 6) | void printchar(long x) {
FILE: 24_Function_Params/main.c
function init (line 12) | static void init() {
function usage (line 21) | static void usage(char *prog) {
function main (line 29) | int main(int argc, char *argv[]) {
FILE: 24_Function_Params/misc.c
function match (line 11) | void match(int t, char *what) {
function semi (line 20) | void semi(void) {
function lbrace (line 25) | void lbrace(void) {
function rbrace (line 30) | void rbrace(void) {
function lparen (line 35) | void lparen(void) {
function rparen (line 40) | void rparen(void) {
function ident (line 45) | void ident(void) {
function fatal (line 50) | void fatal(char *s) {
function fatals (line 55) | void fatals(char *s1, char *s2) {
function fatald (line 60) | void fatald(char *s, int d) {
function fatalc (line 65) | void fatalc(char *s, int c) {
FILE: 24_Function_Params/scan.c
function chrpos (line 10) | static int chrpos(char *s, int c) {
function next (line 18) | static int next(void) {
function putback (line 34) | static void pu
Copy disabled (too large)
Download .json
Condensed preview — 9835 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,257K chars).
[
{
"path": "00_Introduction/Readme.md",
"chars": 6536,
"preview": "# Part 0: Introduction\n\nI've decided to go on a compiler writing journey. In the past I've written some\n[assemblers](htt"
},
{
"path": "01_Scanner/Makefile",
"chars": 82,
"preview": "scanner: main.c scan.c\n\tcc -o scanner -g main.c scan.c\n\nclean:\n\trm -f scanner *.o\n"
},
{
"path": "01_Scanner/Readme.md",
"chars": 8105,
"preview": "# Part 1: Introduction to Lexical Scanning\n\nWe start our compiler writing journey with a simple lexical scanner.\nAs I me"
},
{
"path": "01_Scanner/data.h",
"chars": 239,
"preview": "#ifndef extern_\n #define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n// Global"
},
{
"path": "01_Scanner/decl.h",
"chars": 116,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\nint scan(struct token *t);\n"
},
{
"path": "01_Scanner/defs.h",
"chars": 365,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "01_Scanner/input01",
"chars": 18,
"preview": "2 + 3 * 5 - 8 / 3\n"
},
{
"path": "01_Scanner/input02",
"chars": 29,
"preview": "13 -6+ 4*\n5\n +\n08 / 3\n"
},
{
"path": "01_Scanner/input03",
"chars": 28,
"preview": "12 34 + -56 * / - - 8 + * 2\n"
},
{
"path": "01_Scanner/input04",
"chars": 24,
"preview": "23 +\n18 -\n45.6 * 2\n/ 18\n"
},
{
"path": "01_Scanner/input05",
"chars": 16,
"preview": "23 * 456abcdefg\n"
},
{
"path": "01_Scanner/main.c",
"chars": 1281,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "01_Scanner/scan.c",
"chars": 2145,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "02_Parser/Makefile",
"chars": 125,
"preview": "parser: expr.c interp.c main.c scan.c tree.c\n\tcc -o parser -g expr.c interp.c main.c scan.c tree.c\n\nclean:\n\trm -f parser"
},
{
"path": "02_Parser/Readme.md",
"chars": 15280,
"preview": "# Part 2: Introduction to Parsing\n\nIn this part of our compiler writing journey, I'm going to introduce the\nbasics of a "
},
{
"path": "02_Parser/data.h",
"chars": 207,
"preview": "#ifndef extern_\n #define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ i"
},
{
"path": "02_Parser/decl.h",
"chars": 404,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\nint scan(struct token *t);\nstru"
},
{
"path": "02_Parser/defs.h",
"chars": 709,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "02_Parser/expr.c",
"chars": 1610,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "02_Parser/input01",
"chars": 18,
"preview": "2 + 3 * 5 - 8 / 3\n"
},
{
"path": "02_Parser/input02",
"chars": 29,
"preview": "13 -6+ 4*\n5\n +\n08 / 3\n"
},
{
"path": "02_Parser/input03",
"chars": 28,
"preview": "12 34 + -56 * / - - 8 + * 2\n"
},
{
"path": "02_Parser/input04",
"chars": 24,
"preview": "23 +\n18 -\n45.6 * 2\n/ 18\n"
},
{
"path": "02_Parser/input05",
"chars": 16,
"preview": "23 * 456abcdefg\n"
},
{
"path": "02_Parser/interp.c",
"chars": 1037,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree interpreter\n// Copyright (c) 2019 Warren Toomey, GPL3"
},
{
"path": "02_Parser/main.c",
"chars": 1003,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "02_Parser/scan.c",
"chars": 2104,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "02_Parser/tree.c",
"chars": 888,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
},
{
"path": "03_Precedence/Makefile",
"chars": 489,
"preview": "parser: expr.c interp.c main.c scan.c tree.c\n\tcc -o parser -g expr.c interp.c main.c scan.c tree.c\n\nparser2: expr2.c int"
},
{
"path": "03_Precedence/Readme.md",
"chars": 13689,
"preview": "# Part 3: Operator Precedence\n\nWe saw in the previous part of our compiler writing journey that a parser\ndoesn't necessa"
},
{
"path": "03_Precedence/data.h",
"chars": 207,
"preview": "#ifndef extern_\n #define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ i"
},
{
"path": "03_Precedence/decl.h",
"chars": 407,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\nint scan(struct token *t);\nstru"
},
{
"path": "03_Precedence/defs.h",
"chars": 709,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "03_Precedence/expr.c",
"chars": 2562,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "03_Precedence/expr2.c",
"chars": 2970,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions with full recursive descent\n// Copyrigh"
},
{
"path": "03_Precedence/input01",
"chars": 18,
"preview": "2 + 3 * 5 - 8 / 3\n"
},
{
"path": "03_Precedence/input02",
"chars": 29,
"preview": "13 -6+ 4*\n5\n +\n08 / 3\n"
},
{
"path": "03_Precedence/input03",
"chars": 28,
"preview": "12 34 + -56 * / - - 8 + * 2\n"
},
{
"path": "03_Precedence/input04",
"chars": 24,
"preview": "23 +\n18 -\n45.6 * 2\n/ 18\n"
},
{
"path": "03_Precedence/input05",
"chars": 16,
"preview": "23 * 456abcdefg\n"
},
{
"path": "03_Precedence/interp.c",
"chars": 1049,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree interpreter\n// Copyright (c) 2019 Warren Toomey, GPL3"
},
{
"path": "03_Precedence/main.c",
"chars": 1004,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "03_Precedence/scan.c",
"chars": 2104,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "03_Precedence/tree.c",
"chars": 888,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
},
{
"path": "04_Assembly/Makefile",
"chars": 529,
"preview": "comp1: cg.c expr.c gen.c interp.c main.c scan.c tree.c\n\tcc -o comp1 -g cg.c expr.c gen.c interp.c main.c scan.c tree.c\n\n"
},
{
"path": "04_Assembly/Readme.md",
"chars": 12240,
"preview": "# Part 4: An Actual Compiler\n\nIt's about time that I met my promise of actually writing a compiler.\nSo in this part of t"
},
{
"path": "04_Assembly/cg.c",
"chars": 3102,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "04_Assembly/cgn.c",
"chars": 3039,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "04_Assembly/data.h",
"chars": 231,
"preview": "#ifndef extern_\n #define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ i"
},
{
"path": "04_Assembly/decl.h",
"chars": 672,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\nint scan(struct token *t);\n\nstr"
},
{
"path": "04_Assembly/defs.h",
"chars": 709,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "04_Assembly/expr.c",
"chars": 2562,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "04_Assembly/gen.c",
"chars": 912,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Generic code generator\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "04_Assembly/input01",
"chars": 18,
"preview": "2 + 3 * 5 - 8 / 3\n"
},
{
"path": "04_Assembly/input02",
"chars": 29,
"preview": "13 -6+ 4*\n5\n +\n08 / 3\n"
},
{
"path": "04_Assembly/interp.c",
"chars": 1049,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree interpreter\n// Copyright (c) 2019 Warren Toomey, GPL3"
},
{
"path": "04_Assembly/main.c",
"chars": 1236,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "04_Assembly/scan.c",
"chars": 2104,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "04_Assembly/tree.c",
"chars": 888,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
},
{
"path": "05_Statements/Makefile",
"chars": 454,
"preview": "comp1: cg.c expr.c gen.c main.c misc.c scan.c stmt.c tree.c\n\tcc -o comp1 -g cg.c expr.c gen.c main.c misc.c scan.c stmt."
},
{
"path": "05_Statements/Readme.md",
"chars": 9335,
"preview": "# Part 5: Statements\n\nIt's time to add some \"proper\" statements to the grammar of our language.\nI want to be able to wri"
},
{
"path": "05_Statements/cg.c",
"chars": 3108,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "05_Statements/cgn.c",
"chars": 3045,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "05_Statements/data.h",
"chars": 393,
"preview": "#ifndef extern_\n#define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ in"
},
{
"path": "05_Statements/decl.h",
"chars": 857,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\n// scan.c\nint scan(struct token"
},
{
"path": "05_Statements/defs.h",
"chars": 773,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "05_Statements/expr.c",
"chars": 2622,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "05_Statements/gen.c",
"chars": 961,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Generic code generator\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "05_Statements/input01",
"chars": 73,
"preview": "print 12 * 3;\nprint \n 18 - 2\n * 4; print\n1 + 2 +\n 9 - 5/2 + 3*5;\n"
},
{
"path": "05_Statements/main.c",
"chars": 1248,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "05_Statements/misc.c",
"chars": 467,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Miscellaneous functions\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "05_Statements/scan.c",
"chars": 3649,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "05_Statements/stmt.c",
"chars": 716,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of statements\n// Copyright (c) 2019 Warren Toomey, GPL"
},
{
"path": "05_Statements/tree.c",
"chars": 889,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
},
{
"path": "06_Variables/Makefile",
"chars": 545,
"preview": "SRCS= cg.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c\nSRCN= cgn.c decl.c expr.c gen.c main.c misc.c sc"
},
{
"path": "06_Variables/Readme.md",
"chars": 13835,
"preview": "# Part 6: Variables\n\nI've just finished adding global variables to the compiler and, as I\nsuspected, it was a lot of wor"
},
{
"path": "06_Variables/cg.c",
"chars": 3634,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "06_Variables/cgn.c",
"chars": 3558,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "06_Variables/data.h",
"chars": 456,
"preview": "#ifndef extern_\n#define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ in"
},
{
"path": "06_Variables/decl.c",
"chars": 431,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of declarations\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "06_Variables/decl.h",
"chars": 1224,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\n// scan.c\nint scan(struct token"
},
{
"path": "06_Variables/defs.h",
"chars": 1067,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "06_Variables/expr.c",
"chars": 2643,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "06_Variables/gen.c",
"chars": 1259,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Generic code generator\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "06_Variables/input01",
"chars": 73,
"preview": "print 12 * 3;\nprint \n 18 - 2\n * 4; print\n1 + 2 +\n 9 - 5/2 + 3*5;\n"
},
{
"path": "06_Variables/input02",
"chars": 55,
"preview": "int fred;\nint jim;\nfred= 5;\njim= 12;\nprint fred + jim;\n"
},
{
"path": "06_Variables/input03",
"chars": 102,
"preview": "int x;\nx= 1; print x;\nx= x + 1; print x;\nx= x + 1; print x;\nx= x + 1; print x;\nx= x + 1; print x;\n"
},
{
"path": "06_Variables/main.c",
"chars": 1248,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "06_Variables/misc.c",
"chars": 936,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Miscellaneous functions\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "06_Variables/scan.c",
"chars": 3662,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "06_Variables/stmt.c",
"chars": 1717,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of statements\n// Copyright (c) 2019 Warren Toomey, GPL"
},
{
"path": "06_Variables/sym.c",
"chars": 1063,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Symbol table functions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "06_Variables/tree.c",
"chars": 860,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
},
{
"path": "07_Comparisons/Makefile",
"chars": 418,
"preview": "SRCS= cg.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c\nSRCN= cgn.c decl.c expr.c gen.c main.c misc.c sc"
},
{
"path": "07_Comparisons/Readme.md",
"chars": 9330,
"preview": "# Part 7: Comparison Operators\n\nI was going to add IF statements next, but then I realised that I'd\nbetter add some comp"
},
{
"path": "07_Comparisons/cg.c",
"chars": 4458,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "07_Comparisons/cgn.c",
"chars": 4338,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "07_Comparisons/data.h",
"chars": 456,
"preview": "#ifndef extern_\n#define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ in"
},
{
"path": "07_Comparisons/decl.c",
"chars": 431,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of declarations\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "07_Comparisons/decl.h",
"chars": 1421,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\n// scan.c\nint scan(struct token"
},
{
"path": "07_Comparisons/defs.h",
"chars": 1203,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "07_Comparisons/expr.c",
"chars": 2750,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "07_Comparisons/gen.c",
"chars": 1606,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Generic code generator\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "07_Comparisons/input01",
"chars": 73,
"preview": "print 12 * 3;\nprint \n 18 - 2\n * 4; print\n1 + 2 +\n 9 - 5/2 + 3*5;\n"
},
{
"path": "07_Comparisons/input02",
"chars": 55,
"preview": "int fred;\nint jim;\nfred= 5;\njim= 12;\nprint fred + jim;\n"
},
{
"path": "07_Comparisons/input03",
"chars": 102,
"preview": "int x;\nx= 1; print x;\nx= x + 1; print x;\nx= x + 1; print x;\nx= x + 1; print x;\nx= x + 1; print x;\n"
},
{
"path": "07_Comparisons/input04",
"chars": 187,
"preview": "int x;\nx= 7 < 9; print x;\nx= 7 <= 9; print x;\nx= 7 != 9; print x;\nx= 7 == 7; print x;\nx= 7 >= 7; print x;\nx= 7 <= 7; pr"
},
{
"path": "07_Comparisons/main.c",
"chars": 1248,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "07_Comparisons/misc.c",
"chars": 936,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Miscellaneous functions\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "07_Comparisons/scan.c",
"chars": 4168,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "07_Comparisons/stmt.c",
"chars": 1717,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of statements\n// Copyright (c) 2019 Warren Toomey, GPL"
},
{
"path": "07_Comparisons/sym.c",
"chars": 1063,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Symbol table functions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "07_Comparisons/tree.c",
"chars": 860,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
},
{
"path": "08_If_Statements/Makefile",
"chars": 418,
"preview": "SRCS= cg.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c\nSRCN= cgn.c decl.c expr.c gen.c main.c misc.c sc"
},
{
"path": "08_If_Statements/Readme.md",
"chars": 17787,
"preview": "# Part 8: If Statements\n\nNow that we can compare values, it's time to add IF statements to our language. So,\nfirstly, le"
},
{
"path": "08_If_Statements/cg.c",
"chars": 5122,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "08_If_Statements/cgn.c",
"chars": 5002,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "08_If_Statements/data.h",
"chars": 451,
"preview": "#ifndef extern_\n#define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ in"
},
{
"path": "08_If_Statements/decl.c",
"chars": 431,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of declarations\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "08_If_Statements/decl.h",
"chars": 1515,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\n// scan.c\nint scan(struct token"
},
{
"path": "08_If_Statements/defs.h",
"chars": 1415,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "08_If_Statements/expr.c",
"chars": 2842,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "08_If_Statements/gen.c",
"chars": 3554,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Generic code generator\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "08_If_Statements/input01",
"chars": 69,
"preview": "{ print 12 * 3;\n print 18 - 2 * 4;\n print 1 + 2 + 9 - 5/2 + 3*5;\n}\n"
},
{
"path": "08_If_Statements/input02",
"chars": 69,
"preview": "{\n int fred;\n int jim;\n fred= 5;\n jim= 12;\n print fred + jim;\n}\n"
},
{
"path": "08_If_Statements/input03",
"chars": 118,
"preview": "{\n int x;\n x= 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n}\n"
},
{
"path": "08_If_Statements/input04",
"chars": 211,
"preview": "{\n int x;\n x= 7 < 9; print x;\n x= 7 <= 9; print x;\n x= 7 != 9; print x;\n x= 7 == 7; print x;\n x= 7 >= 7; print x;"
},
{
"path": "08_If_Statements/input05",
"chars": 89,
"preview": "{\n int i; int j;\n i=6; j=12;\n if (i < j) {\n print i;\n } else {\n print j;\n }\n}\n"
},
{
"path": "08_If_Statements/main.c",
"chars": 1356,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "08_If_Statements/misc.c",
"chars": 1334,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Miscellaneous functions\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "08_If_Statements/scan.c",
"chars": 4491,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "08_If_Statements/stmt.c",
"chars": 3484,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of statements\n// Copyright (c) 2019 Warren Toomey, GPL"
},
{
"path": "08_If_Statements/sym.c",
"chars": 1063,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Symbol table functions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "08_If_Statements/tree.c",
"chars": 914,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
},
{
"path": "09_While_Loops/Makefile",
"chars": 590,
"preview": "SRCS= cg.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c\nSRCN= cgn.c decl.c expr.c gen.c main.c misc.c sc"
},
{
"path": "09_While_Loops/Readme.md",
"chars": 5545,
"preview": "# Part 9: While Loops\n\nIn this part of the journey we are going to add WHILE loops to our\nlanguage. In some sense, a WHI"
},
{
"path": "09_While_Loops/cg.c",
"chars": 5122,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "09_While_Loops/cgn.c",
"chars": 5002,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "09_While_Loops/data.h",
"chars": 451,
"preview": "#ifndef extern_\n#define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ in"
},
{
"path": "09_While_Loops/decl.c",
"chars": 474,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of declarations\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "09_While_Loops/decl.h",
"chars": 1515,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\n// scan.c\nint scan(struct token"
},
{
"path": "09_While_Loops/defs.h",
"chars": 1435,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "09_While_Loops/expr.c",
"chars": 2842,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "09_While_Loops/gen.c",
"chars": 4306,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Generic code generator\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "09_While_Loops/main.c",
"chars": 1356,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "09_While_Loops/misc.c",
"chars": 1334,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Miscellaneous functions\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "09_While_Loops/scan.c",
"chars": 4568,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "09_While_Loops/stmt.c",
"chars": 4206,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of statements\n// Copyright (c) 2019 Warren Toomey, GPL"
},
{
"path": "09_While_Loops/sym.c",
"chars": 1063,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Symbol table functions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "09_While_Loops/tests/input01",
"chars": 69,
"preview": "{ print 12 * 3;\n print 18 - 2 * 4;\n print 1 + 2 + 9 - 5/2 + 3*5;\n}\n"
},
{
"path": "09_While_Loops/tests/input02",
"chars": 69,
"preview": "{\n int fred;\n int jim;\n fred= 5;\n jim= 12;\n print fred + jim;\n}\n"
},
{
"path": "09_While_Loops/tests/input03",
"chars": 118,
"preview": "{\n int x;\n x= 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n}\n"
},
{
"path": "09_While_Loops/tests/input04",
"chars": 211,
"preview": "{\n int x;\n x= 7 < 9; print x;\n x= 7 <= 9; print x;\n x= 7 != 9; print x;\n x= 7 == 7; print x;\n x= 7 >= 7; print x;"
},
{
"path": "09_While_Loops/tests/input05",
"chars": 89,
"preview": "{\n int i; int j;\n i=6; j=12;\n if (i < j) {\n print i;\n } else {\n print j;\n }\n}\n"
},
{
"path": "09_While_Loops/tests/input06",
"chars": 69,
"preview": "{ int i;\n i=1;\n while (i <= 10) {\n print i;\n i= i + 1;\n }\n}\n"
},
{
"path": "09_While_Loops/tests/mktests",
"chars": 262,
"preview": "#!/bin/sh\n# Make the output files for each test\n\nif [ ! -f ../comp1 ]\nthen echo \"Need to build ../comp1 first!\"; exit 1\n"
},
{
"path": "09_While_Loops/tests/mktestsn",
"chars": 295,
"preview": "#!/bin/sh\n# Make the output files for each test\n\nif [ ! -f ../compn ]\nthen echo \"Need to build ../compn first!\"; exit 1\n"
},
{
"path": "09_While_Loops/tests/out.input01",
"chars": 9,
"preview": "36\n10\n25\n"
},
{
"path": "09_While_Loops/tests/out.input02",
"chars": 3,
"preview": "17\n"
},
{
"path": "09_While_Loops/tests/out.input03",
"chars": 10,
"preview": "1\n2\n3\n4\n5\n"
},
{
"path": "09_While_Loops/tests/out.input04",
"chars": 18,
"preview": "1\n1\n1\n1\n1\n1\n1\n1\n1\n"
},
{
"path": "09_While_Loops/tests/out.input05",
"chars": 2,
"preview": "6\n"
},
{
"path": "09_While_Loops/tests/out.input06",
"chars": 21,
"preview": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
},
{
"path": "09_While_Loops/tests/runtests",
"chars": 522,
"preview": "#!/bin/sh\n# Run each test and compare\n# against known good output\n\nif [ ! -f ../comp1 ]\nthen echo \"Need to build ../comp"
},
{
"path": "09_While_Loops/tests/runtestsn",
"chars": 561,
"preview": "#!/bin/sh\n# Run each test and compare\n# against known good output\n\nif [ ! -f ../compn ]\nthen echo \"Need to build ../comp"
},
{
"path": "09_While_Loops/tree.c",
"chars": 914,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
},
{
"path": "10_For_Loops/Makefile",
"chars": 590,
"preview": "SRCS= cg.c decl.c expr.c gen.c main.c misc.c scan.c stmt.c sym.c tree.c\nSRCN= cgn.c decl.c expr.c gen.c main.c misc.c sc"
},
{
"path": "10_For_Loops/Readme.md",
"chars": 8588,
"preview": "# Part 10: FOR Loops\n\nIn this part of our compiler writing journey I'm going to add FOR loops.\nThere is a wrinkle to wor"
},
{
"path": "10_For_Loops/cg.c",
"chars": 5122,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "10_For_Loops/cgn.c",
"chars": 5002,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Code generator for x86-64\n// Copyright (c) 2019 Warren Toomey,"
},
{
"path": "10_For_Loops/data.h",
"chars": 451,
"preview": "#ifndef extern_\n#define extern_ extern\n#endif\n\n// Global variables\n// Copyright (c) 2019 Warren Toomey, GPL3\n\nextern_ in"
},
{
"path": "10_For_Loops/decl.c",
"chars": 474,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of declarations\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "10_For_Loops/decl.h",
"chars": 1515,
"preview": "\n// Function prototypes for all compiler files\n// Copyright (c) 2019 Warren Toomey, GPL3\n// scan.c\nint scan(struct token"
},
{
"path": "10_For_Loops/defs.h",
"chars": 1444,
"preview": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n// Structure and enum definitions\n// Copy"
},
{
"path": "10_For_Loops/expr.c",
"chars": 2842,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of expressions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "10_For_Loops/gen.c",
"chars": 4306,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Generic code generator\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "10_For_Loops/main.c",
"chars": 1356,
"preview": "#include \"defs.h\"\n#define extern_\n#include \"data.h\"\n#undef extern_\n#include \"decl.h\"\n#include <errno.h>\n\n// Compiler set"
},
{
"path": "10_For_Loops/misc.c",
"chars": 1334,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Miscellaneous functions\n// Copyright (c) 2019 Warren Toomey, G"
},
{
"path": "10_For_Loops/scan.c",
"chars": 4641,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Lexical scanning\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n//"
},
{
"path": "10_For_Loops/stmt.c",
"chars": 5980,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Parsing of statements\n// Copyright (c) 2019 Warren Toomey, GPL"
},
{
"path": "10_For_Loops/sym.c",
"chars": 1063,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// Symbol table functions\n// Copyright (c) 2019 Warren Toomey, GP"
},
{
"path": "10_For_Loops/tests/input01",
"chars": 69,
"preview": "{ print 12 * 3;\n print 18 - 2 * 4;\n print 1 + 2 + 9 - 5/2 + 3*5;\n}\n"
},
{
"path": "10_For_Loops/tests/input02",
"chars": 69,
"preview": "{\n int fred;\n int jim;\n fred= 5;\n jim= 12;\n print fred + jim;\n}\n"
},
{
"path": "10_For_Loops/tests/input03",
"chars": 118,
"preview": "{\n int x;\n x= 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n x= x + 1; print x;\n}\n"
},
{
"path": "10_For_Loops/tests/input04",
"chars": 211,
"preview": "{\n int x;\n x= 7 < 9; print x;\n x= 7 <= 9; print x;\n x= 7 != 9; print x;\n x= 7 == 7; print x;\n x= 7 >= 7; print x;"
},
{
"path": "10_For_Loops/tests/input05",
"chars": 89,
"preview": "{\n int i; int j;\n i=6; j=12;\n if (i < j) {\n print i;\n } else {\n print j;\n }\n}\n"
},
{
"path": "10_For_Loops/tests/input06",
"chars": 69,
"preview": "{ int i;\n i=1;\n while (i <= 10) {\n print i;\n i= i + 1;\n }\n}\n"
},
{
"path": "10_For_Loops/tests/input07",
"chars": 64,
"preview": "{\n int i;\n for (i= 1; i <= 10; i= i + 1) {\n print i;\n }\n}\n"
},
{
"path": "10_For_Loops/tests/mktests",
"chars": 262,
"preview": "#!/bin/sh\n# Make the output files for each test\n\nif [ ! -f ../comp1 ]\nthen echo \"Need to build ../comp1 first!\"; exit 1\n"
},
{
"path": "10_For_Loops/tests/mktestsn",
"chars": 295,
"preview": "#!/bin/sh\n# Make the output files for each test\n\nif [ ! -f ../compn ]\nthen echo \"Need to build ../compn first!\"; exit 1\n"
},
{
"path": "10_For_Loops/tests/out.input01",
"chars": 9,
"preview": "36\n10\n25\n"
},
{
"path": "10_For_Loops/tests/out.input02",
"chars": 3,
"preview": "17\n"
},
{
"path": "10_For_Loops/tests/out.input03",
"chars": 10,
"preview": "1\n2\n3\n4\n5\n"
},
{
"path": "10_For_Loops/tests/out.input04",
"chars": 18,
"preview": "1\n1\n1\n1\n1\n1\n1\n1\n1\n"
},
{
"path": "10_For_Loops/tests/out.input05",
"chars": 2,
"preview": "6\n"
},
{
"path": "10_For_Loops/tests/out.input06",
"chars": 21,
"preview": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
},
{
"path": "10_For_Loops/tests/out.input07",
"chars": 21,
"preview": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"
},
{
"path": "10_For_Loops/tests/runtests",
"chars": 522,
"preview": "#!/bin/sh\n# Run each test and compare\n# against known good output\n\nif [ ! -f ../comp1 ]\nthen echo \"Need to build ../comp"
},
{
"path": "10_For_Loops/tests/runtestsn",
"chars": 561,
"preview": "#!/bin/sh\n# Run each test and compare\n# against known good output\n\nif [ ! -f ../compn ]\nthen echo \"Need to build ../comp"
},
{
"path": "10_For_Loops/tree.c",
"chars": 914,
"preview": "#include \"defs.h\"\n#include \"data.h\"\n#include \"decl.h\"\n\n// AST tree functions\n// Copyright (c) 2019 Warren Toomey, GPL3\n\n"
}
]
// ... and 9635 more files (download for full content)
About this extraction
This page contains the full source code of the DoctorWkt/acwj GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 9835 files (8.7 MB), approximately 2.7M tokens, and a symbol index with 22026 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.