From 08d33f808db30936b273582bcfaddcbc5a57c112 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Tue, 6 May 2025 13:44:10 -0700 Subject: Chapter 23: Methods and Revisiting Types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com> Co-authored-by: XmiliaH <45106915+XmiliaH@users.noreply.github.com> Co-authored-by: Hsiang-Ying Fu <66062782+fuhsnn@users.noreply.github.com> --- README.md | 2 +- docs/chapter23/18-grammar.md | 132 + docs/chapter23/Makefile | 12 + docs/chapter23/README.md | 459 ++ docs/chapter23/d3-graphviz.js | 2014 ++++++++ docs/chapter23/d3.v7.min.js | 2 + docs/chapter23/examples/A_helloWorld.smp | 3 + docs/chapter23/examples/BubbleSort.smp | 37 + docs/chapter23/font-awesome-4.7.0.zip | Bin 0 -> 669808 bytes docs/chapter23/graphviz.umd.js | 7 + docs/chapter23/ifg_trim.pdf | Bin 0 -> 155190 bytes docs/chapter23/index.html | 218 + docs/chapter23/lattice.gv | 203 + docs/chapter23/lattice.svg | 691 +++ docs/chapter23/lattice2.gv | 85 + docs/chapter23/lattice2.svg | 260 + docs/chapter23/pardoe.docx | Bin 0 -> 22583 bytes docs/chapter23/webtcp.min.js | 65 + src/main/java/com/seaofnodes/simple/Ary.java | 228 - src/main/java/com/seaofnodes/simple/IterPeeps.java | 2 + src/main/java/com/seaofnodes/simple/Parser.java | 493 +- src/main/java/com/seaofnodes/simple/SB.java | 99 - src/main/java/com/seaofnodes/simple/Utils.java | 53 - .../com/seaofnodes/simple/codegen/Coalesce.java | 4 +- .../com/seaofnodes/simple/codegen/CodeGen.java | 66 +- .../com/seaofnodes/simple/codegen/ElfFile.java | 3 +- .../com/seaofnodes/simple/codegen/Encoding.java | 24 +- .../simple/codegen/GlobalCodeMotion.java | 6 +- .../java/com/seaofnodes/simple/codegen/IFG.java | 4 +- .../java/com/seaofnodes/simple/codegen/LRG.java | 7 +- .../com/seaofnodes/simple/codegen/LinkMem.java | 2 +- .../seaofnodes/simple/codegen/ListScheduler.java | 4 +- .../com/seaofnodes/simple/codegen/RegAlloc.java | 8 +- .../com/seaofnodes/simple/codegen/RegMask.java | 4 +- .../java/com/seaofnodes/simple/node/AddNode.java | 9 +- .../java/com/seaofnodes/simple/node/ArithNode.java | 9 +- .../java/com/seaofnodes/simple/node/BoolNode.java | 4 +- .../java/com/seaofnodes/simple/node/CFGNode.java | 7 +- .../java/com/seaofnodes/simple/node/CProjNode.java | 2 +- .../com/seaofnodes/simple/node/CallEndMach.java | 2 +- .../com/seaofnodes/simple/node/CallEndNode.java | 10 +- .../java/com/seaofnodes/simple/node/CallNode.java | 10 +- .../java/com/seaofnodes/simple/node/CastMach.java | 2 +- .../java/com/seaofnodes/simple/node/CastNode.java | 15 +- .../com/seaofnodes/simple/node/ConFldOffNode.java | 43 + .../com/seaofnodes/simple/node/ConstantNode.java | 38 +- .../com/seaofnodes/simple/node/ExternNode.java | 6 +- .../java/com/seaofnodes/simple/node/FunNode.java | 9 +- .../java/com/seaofnodes/simple/node/IfNode.java | 6 +- .../java/com/seaofnodes/simple/node/LoadNode.java | 41 +- .../java/com/seaofnodes/simple/node/LoopNode.java | 24 +- .../seaofnodes/simple/node/MachConcreteNode.java | 2 +- .../java/com/seaofnodes/simple/node/MachNode.java | 2 + .../com/seaofnodes/simple/node/MemMergeNode.java | 9 +- .../java/com/seaofnodes/simple/node/MemOpNode.java | 2 +- .../java/com/seaofnodes/simple/node/MinusNode.java | 3 +- .../java/com/seaofnodes/simple/node/MultiNode.java | 2 +- .../java/com/seaofnodes/simple/node/NewNode.java | 34 +- src/main/java/com/seaofnodes/simple/node/Node.java | 7 +- .../java/com/seaofnodes/simple/node/NotNode.java | 4 +- .../java/com/seaofnodes/simple/node/ParmNode.java | 11 +- .../java/com/seaofnodes/simple/node/PhiNode.java | 77 +- .../com/seaofnodes/simple/node/ReadOnlyMach.java | 2 +- .../com/seaofnodes/simple/node/RegionNode.java | 8 +- .../com/seaofnodes/simple/node/ReturnNode.java | 15 +- .../java/com/seaofnodes/simple/node/ScopeNode.java | 111 +- .../java/com/seaofnodes/simple/node/SplitNode.java | 2 +- .../java/com/seaofnodes/simple/node/StartNode.java | 11 +- .../java/com/seaofnodes/simple/node/StopNode.java | 2 +- .../java/com/seaofnodes/simple/node/StoreNode.java | 15 +- .../com/seaofnodes/simple/node/StructNode.java | 9 +- .../seaofnodes/simple/node/cpus/arm/AddARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/AddFARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/AddIARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/AndARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/AndIARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/AsrARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/AsrIARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/BranchARM.java | 3 +- .../seaofnodes/simple/node/cpus/arm/CallARM.java | 6 +- .../seaofnodes/simple/node/cpus/arm/CallRRARM.java | 4 +- .../seaofnodes/simple/node/cpus/arm/CmpARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/CmpFARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/CmpIARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/DivARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/DivFARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/FloatARM.java | 4 +- .../seaofnodes/simple/node/cpus/arm/FunARM.java | 4 +- .../seaofnodes/simple/node/cpus/arm/I2F8ARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/IntARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/LoadARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/LslARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/LslIARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/LsrARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/LsrIARM.java | 3 +- .../seaofnodes/simple/node/cpus/arm/MemOpARM.java | 5 +- .../seaofnodes/simple/node/cpus/arm/MulARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/MulFARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/NegARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/NewARM.java | 3 +- .../seaofnodes/simple/node/cpus/arm/NotARM.java | 3 +- .../com/seaofnodes/simple/node/cpus/arm/OrARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/OrIARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/SetARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/SplitARM.java | 5 +- .../seaofnodes/simple/node/cpus/arm/StoreARM.java | 4 +- .../seaofnodes/simple/node/cpus/arm/SubARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/SubFARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/SubIARM.java | 5 +- .../seaofnodes/simple/node/cpus/arm/TFPARM.java | 3 +- .../seaofnodes/simple/node/cpus/arm/TMPARM.java | 3 +- .../seaofnodes/simple/node/cpus/arm/UJmpARM.java | 3 +- .../seaofnodes/simple/node/cpus/arm/XorARM.java | 2 +- .../seaofnodes/simple/node/cpus/arm/XorIARM.java | 7 +- .../com/seaofnodes/simple/node/cpus/arm/arm.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/AUIPC.java | 3 +- .../simple/node/cpus/riscv/AddFRISC.java | 2 +- .../simple/node/cpus/riscv/AddIRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/AddRISC.java | 2 +- .../simple/node/cpus/riscv/AndIRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/AndRISC.java | 2 +- .../simple/node/cpus/riscv/BranchRISC.java | 3 +- .../simple/node/cpus/riscv/CallRISC.java | 6 +- .../simple/node/cpus/riscv/CallRRISC.java | 4 +- .../simple/node/cpus/riscv/DivFRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/DivRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/FltRISC.java | 4 +- .../seaofnodes/simple/node/cpus/riscv/FunRISC.java | 4 +- .../simple/node/cpus/riscv/I2F8RISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/ImmRISC.java | 2 +- .../simple/node/cpus/riscv/Int8RISC.java | 5 +- .../seaofnodes/simple/node/cpus/riscv/IntRISC.java | 2 +- .../com/seaofnodes/simple/node/cpus/riscv/LUI.java | 2 +- .../simple/node/cpus/riscv/LoadRISC.java | 2 +- .../simple/node/cpus/riscv/MemOpRISC.java | 4 +- .../simple/node/cpus/riscv/MulFRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/MulRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/NegRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/NewRISC.java | 3 +- .../seaofnodes/simple/node/cpus/riscv/NotRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/OrIRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/OrRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/RetRISC.java | 4 +- .../simple/node/cpus/riscv/SetFRISC.java | 2 +- .../simple/node/cpus/riscv/SetIRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/SetRISC.java | 2 +- .../simple/node/cpus/riscv/SllIRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/SllRISC.java | 2 +- .../simple/node/cpus/riscv/SplitRISC.java | 4 +- .../simple/node/cpus/riscv/SraIRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/SraRISC.java | 2 +- .../simple/node/cpus/riscv/SrlIRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/SrlRISC.java | 2 +- .../simple/node/cpus/riscv/StoreRISC.java | 4 +- .../simple/node/cpus/riscv/SubFRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/SubRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/TFPRISC.java | 3 +- .../seaofnodes/simple/node/cpus/riscv/TMPRISC.java | 2 +- .../simple/node/cpus/riscv/UJmpRISC.java | 3 +- .../simple/node/cpus/riscv/XorIRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/XorRISC.java | 2 +- .../seaofnodes/simple/node/cpus/riscv/riscv.java | 2 +- .../simple/node/cpus/x86_64_v2/AddFMemX86.java | 4 +- .../simple/node/cpus/x86_64_v2/AddFX86.java | 2 +- .../simple/node/cpus/x86_64_v2/AddIX86.java | 4 +- .../simple/node/cpus/x86_64_v2/AddMemX86.java | 2 +- .../simple/node/cpus/x86_64_v2/CallRX86.java | 2 +- .../simple/node/cpus/x86_64_v2/CallX86.java | 4 +- .../simple/node/cpus/x86_64_v2/CmpFX86.java | 2 +- .../simple/node/cpus/x86_64_v2/CmpIX86.java | 2 +- .../simple/node/cpus/x86_64_v2/CmpMemX86.java | 2 +- .../simple/node/cpus/x86_64_v2/CmpX86.java | 2 +- .../simple/node/cpus/x86_64_v2/DivFX86.java | 2 +- .../simple/node/cpus/x86_64_v2/DivX86.java | 2 +- .../simple/node/cpus/x86_64_v2/FltX86.java | 2 +- .../simple/node/cpus/x86_64_v2/FunX86.java | 2 +- .../simple/node/cpus/x86_64_v2/I2f8X86.java | 2 +- .../simple/node/cpus/x86_64_v2/ImmX86.java | 2 +- .../simple/node/cpus/x86_64_v2/IntX86.java | 2 +- .../simple/node/cpus/x86_64_v2/JmpX86.java | 3 +- .../simple/node/cpus/x86_64_v2/LeaX86.java | 2 +- .../simple/node/cpus/x86_64_v2/LoadX86.java | 9 +- .../simple/node/cpus/x86_64_v2/MemAddX86.java | 2 +- .../simple/node/cpus/x86_64_v2/MemOpX86.java | 4 +- .../simple/node/cpus/x86_64_v2/MulFX86.java | 2 +- .../simple/node/cpus/x86_64_v2/MulIX86.java | 4 +- .../simple/node/cpus/x86_64_v2/MulX86.java | 2 +- .../simple/node/cpus/x86_64_v2/NegX86.java | 3 +- .../simple/node/cpus/x86_64_v2/NewX86.java | 2 +- .../simple/node/cpus/x86_64_v2/NotX86.java | 2 +- .../simple/node/cpus/x86_64_v2/RegX86.java | 2 +- .../simple/node/cpus/x86_64_v2/SarIX86.java | 5 +- .../simple/node/cpus/x86_64_v2/SarX86.java | 2 +- .../simple/node/cpus/x86_64_v2/SetX86.java | 3 +- .../simple/node/cpus/x86_64_v2/ShlIX86.java | 5 +- .../simple/node/cpus/x86_64_v2/ShlX86.java | 2 +- .../simple/node/cpus/x86_64_v2/ShrIX86.java | 5 +- .../simple/node/cpus/x86_64_v2/ShrX86.java | 2 +- .../simple/node/cpus/x86_64_v2/SplitX86.java | 4 +- .../simple/node/cpus/x86_64_v2/StoreX86.java | 2 +- .../simple/node/cpus/x86_64_v2/SubFX86.java | 2 +- .../simple/node/cpus/x86_64_v2/TFPX86.java | 2 +- .../simple/node/cpus/x86_64_v2/TMPX86.java | 8 +- .../simple/node/cpus/x86_64_v2/UJmpX86.java | 3 +- .../simple/node/cpus/x86_64_v2/x86_64_v2.java | 5 +- .../com/seaofnodes/simple/print/ASMPrinter.java | 11 +- .../seaofnodes/simple/print/GraphVisualizer.java | 8 +- .../com/seaofnodes/simple/print/IRPrinter.java | 10 +- .../java/com/seaofnodes/simple/print/JSViewer.java | 10 +- .../seaofnodes/simple/print/SimpleWebSocket.java | 2 +- src/main/java/com/seaofnodes/simple/sys/sys.smp | 58 - .../java/com/seaofnodes/simple/type/Field.java | 124 +- src/main/java/com/seaofnodes/simple/type/Type.java | 370 +- .../com/seaofnodes/simple/type/TypeConAry.java | 53 +- .../com/seaofnodes/simple/type/TypeConAryB.java | 6 +- .../com/seaofnodes/simple/type/TypeConAryI.java | 6 +- .../java/com/seaofnodes/simple/type/TypeFloat.java | 55 +- .../com/seaofnodes/simple/type/TypeFunPtr.java | 234 +- .../com/seaofnodes/simple/type/TypeInteger.java | 79 +- .../java/com/seaofnodes/simple/type/TypeMem.java | 87 +- .../com/seaofnodes/simple/type/TypeMemPtr.java | 87 +- .../java/com/seaofnodes/simple/type/TypeNil.java | 14 +- .../java/com/seaofnodes/simple/type/TypePtr.java | 18 +- .../java/com/seaofnodes/simple/type/TypeRPC.java | 13 +- .../com/seaofnodes/simple/type/TypeStruct.java | 491 +- .../java/com/seaofnodes/simple/type/TypeTuple.java | 113 +- src/main/java/com/seaofnodes/simple/util/Ary.java | 229 + .../java/com/seaofnodes/simple/util/AryInt.java | 192 + src/main/java/com/seaofnodes/simple/util/SB.java | 99 + .../java/com/seaofnodes/simple/util/Utils.java | 53 + src/main/smp/sys.smp | 142 + .../java/com/seaofnodes/simple/Chapter04Test.java | 2 +- .../java/com/seaofnodes/simple/Chapter06Test.java | 16 +- .../java/com/seaofnodes/simple/Chapter09Test.java | 8 +- .../java/com/seaofnodes/simple/Chapter10Test.java | 8 +- .../java/com/seaofnodes/simple/Chapter11Test.java | 2 +- .../java/com/seaofnodes/simple/Chapter13Test.java | 97 +- .../java/com/seaofnodes/simple/Chapter15Test.java | 18 +- .../java/com/seaofnodes/simple/Chapter16Test.java | 16 +- .../java/com/seaofnodes/simple/Chapter17Test.java | 35 +- .../java/com/seaofnodes/simple/Chapter18Test.java | 16 +- .../java/com/seaofnodes/simple/Chapter19Test.java | 6 +- .../java/com/seaofnodes/simple/Chapter20Test.java | 8 +- .../java/com/seaofnodes/simple/Chapter21Test.java | 5 +- .../java/com/seaofnodes/simple/Chapter22Test.java | 6 +- .../java/com/seaofnodes/simple/Chapter23Test.java | 249 + src/test/java/com/seaofnodes/simple/Eval2.java | 45 +- src/test/java/com/seaofnodes/simple/EvalArm64.java | 12 +- src/test/java/com/seaofnodes/simple/EvalRisc5.java | 1 + .../java/com/seaofnodes/simple/MergeSortTest.java | 1 + src/test/java/com/seaofnodes/simple/Simple.java | 8 +- src/test/java/com/seaofnodes/simple/TestC.java | 24 +- src/test/java/com/seaofnodes/simple/TypeTest.java | 88 +- .../com/seaofnodes/simple/evaluator/Evaluator.java | 7 +- .../com/seaofnodes/simple/evaluator/Scheduler.java | 3 +- .../java/com/seaofnodes/simple/fuzzer/Fuzzer.java | 8 +- .../com/seaofnodes/simple/fuzzer/FuzzerUtils.java | 4 +- .../java/com/seaofnodes/simple/fuzzer/Reducer.java | 11 +- .../seaofnodes/simple/fuzzer/ScriptGenerator.java | 207 +- src/test/java/com/seaofnodes/simple/progs/and1.smp | 10 + src/test/java/com/seaofnodes/simple/progs/and2.smp | 16 + src/test/java/com/seaofnodes/simple/progs/and3.smp | 14 + .../java/com/seaofnodes/simple/progs/large.smp | 5344 ++++++++++++++++++++ src/test/java/com/seaofnodes/simple/progs/or1.smp | 12 + src/test/java/com/seaofnodes/simple/progs/or2.smp | 23 + .../java/com/seaofnodes/simple/progs/print.smp | 8 + .../java/com/seaofnodes/simple/progs/ptrand.smp | 10 + .../com/seaofnodes/simple/progs/stringHash.smp | 5 +- 268 files changed, 13237 insertions(+), 1810 deletions(-) create mode 100644 docs/chapter23/18-grammar.md create mode 100644 docs/chapter23/Makefile create mode 100644 docs/chapter23/README.md create mode 100644 docs/chapter23/d3-graphviz.js create mode 100644 docs/chapter23/d3.v7.min.js create mode 100644 docs/chapter23/examples/A_helloWorld.smp create mode 100644 docs/chapter23/examples/BubbleSort.smp create mode 100644 docs/chapter23/font-awesome-4.7.0.zip create mode 100644 docs/chapter23/graphviz.umd.js create mode 100644 docs/chapter23/ifg_trim.pdf create mode 100644 docs/chapter23/index.html create mode 100644 docs/chapter23/lattice.gv create mode 100644 docs/chapter23/lattice.svg create mode 100644 docs/chapter23/lattice2.gv create mode 100644 docs/chapter23/lattice2.svg create mode 100644 docs/chapter23/pardoe.docx create mode 100644 docs/chapter23/webtcp.min.js delete mode 100644 src/main/java/com/seaofnodes/simple/Ary.java delete mode 100644 src/main/java/com/seaofnodes/simple/SB.java delete mode 100644 src/main/java/com/seaofnodes/simple/Utils.java create mode 100644 src/main/java/com/seaofnodes/simple/node/ConFldOffNode.java delete mode 100644 src/main/java/com/seaofnodes/simple/sys/sys.smp create mode 100644 src/main/java/com/seaofnodes/simple/util/Ary.java create mode 100644 src/main/java/com/seaofnodes/simple/util/AryInt.java create mode 100644 src/main/java/com/seaofnodes/simple/util/SB.java create mode 100644 src/main/java/com/seaofnodes/simple/util/Utils.java create mode 100644 src/test/java/com/seaofnodes/simple/Chapter23Test.java create mode 100644 src/test/java/com/seaofnodes/simple/progs/and1.smp create mode 100644 src/test/java/com/seaofnodes/simple/progs/and2.smp create mode 100644 src/test/java/com/seaofnodes/simple/progs/and3.smp create mode 100644 src/test/java/com/seaofnodes/simple/progs/large.smp create mode 100644 src/test/java/com/seaofnodes/simple/progs/or1.smp create mode 100644 src/test/java/com/seaofnodes/simple/progs/or2.smp create mode 100644 src/test/java/com/seaofnodes/simple/progs/print.smp create mode 100644 src/test/java/com/seaofnodes/simple/progs/ptrand.smp diff --git a/README.md b/README.md index d67e48df..085df846 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,6 @@ The Simple language is styled after a subset of C or Java. * [Chapter 20](docs/chapter20/README.md): Graph Coloring Register Allocation * [Chapter 21](docs/chapter21/README.md): Instruction Encodings & ELF * [Chapter 22](docs/chapter22/README.md): A Simple Hello, World! -* Chapter 23: Methods and Types Revisited +* [Chapter 23](docs/chapter23/README.md): Methods and Types Revisited * Chapter 24: Chained conditionals and SCCP * Chapter 25: Modules and Separate Compilation diff --git a/docs/chapter23/18-grammar.md b/docs/chapter23/18-grammar.md new file mode 100644 index 00000000..7b611fbf --- /dev/null +++ b/docs/chapter23/18-grammar.md @@ -0,0 +1,132 @@ +# Grammar for Chapter 16 + +```antlrv4 +grammar SimpleLanguage; + +program : block EOF ; + +block : statement+ ; + + +statement + : '{' block '}' + | returnStatement + | ifStatement + | whileStatement + | breakStatement + | continueStatement + | metaStatement + | structDeclaration + | expressionStatement + ; + + +returnStatement : 'return' expression ';' ; + +ifStatement : 'if' '(' expression ')' statement ('else' statement)? ; + +whileStatement : 'while' '(' expression ')' statement ; + +breakStatement : 'break' ';' ; + +continueStatement : 'continue' ';' ; + +metaStatement : '#showGraph' ';' ; + +structDeclaration : 'struct' IDENTIFIER '{' block '}' ; + +expressionStatement + : type IDENTIFIER ';' + | type IDENTIFIER '=' expression ';' + | IDENTIFIER '=' expression ';' + | expression + ; + +PRIMTYPE + : 'int' + | 'i8' + | 'i16' + | 'i32' + | 'i64' + | 'u8' + | 'u16' + | 'u32' + | 'flt' + | 'f32' + | 'f64' + | 'bool' + ; + +type + : PRIMTYPE + | typeName '?'? + | typeName nestedArray+ + ; + +nestedArray : '?'? '[]'* ; + +typeName : IDENTIFIER ; + + +expression : bitWiseExpression ; + +bitWiseExpression + : comparisonExpression ( '&' | '|' | '^' ) comparisonExpression)* + ; + +comparisonExpression + : shiftExpression (('==' | '!='| '>'| '<'| '>='| '<=') shiftExpression)* + ; + +shiftExpression + : additiveExpression ( '<<' | '>>>' | '>>' ) additiveExpression)* + ; + +additiveExpression + : multiplicativeExpression (('+' | '-') multiplicativeExpression)* + ; + +multiplicativeExpression + : unaryExpression (('*' | '/') unaryExpression)* + ; + +unaryExpression + : ('-') unaryExpression + | '!' unaryExpression + | primaryExpression postAssign + ; + +primaryExpression + : INTEGER_LITERAL + | FLOAT_LITERAL + | '(' expression ')' + | 'true' + | 'false' + | 'null' + | newExpression + | IDENTIFIER + ; + +newExpression + : 'new' IDENTIFIER [ '{' block '}' ] + | 'new' IDENTIFIER '[' expression ']' + ; + +postAssign : postFix [ '=' expression ] | [ '#' ]; + +postFix + : '.' IDENTIFIER postFix + | '[' expression ']' postFix + ; + + +IDENTIFIER : NON_DIGIT (NON_DIGIT | DIGIT)* ; + +INTEGER_LITERAL + : [1-9]DIGIT* + | [0] + ; + +NON_DIGIT: [a-zA-Z_]; +DIGIT: [0-9]; +``` diff --git a/docs/chapter23/Makefile b/docs/chapter23/Makefile new file mode 100644 index 00000000..12659b8f --- /dev/null +++ b/docs/chapter23/Makefile @@ -0,0 +1,12 @@ +GV := $(wildcard *.gv) +SVG := $(patsubst %.gv,%.svg,$(GV)) + +.PHONY: all +all: $(SVG) + +%.svg: %.gv + dot -Tsvg $< > $@ + +.PHONY: clean +clean: + @rm -f $(SVG) diff --git a/docs/chapter23/README.md b/docs/chapter23/README.md new file mode 100644 index 00000000..545a4c4a --- /dev/null +++ b/docs/chapter23/README.md @@ -0,0 +1,459 @@ +# Chapter 23: Methods and Revisiting Types + +In this chapter add *methods*, functions defined in structs which take a +hidden `self` argument and can access the struct fields. Here is an +`indexOf` method in a String-like class: + +```java +// A String-like class, with methods +struct String { + u8[~] buf; // Buffer of read-only characters + + // Return the index of the first character 'c' or -1 + val indexOf = { u8 c -> // Hidden 'self' argument + for( int i=0; i