From 66569446b13bae2e6f26e31102fadf7792297659 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Wed, 7 Aug 2024 19:39:10 +0200 Subject: [PATCH] Simplified file structure --- README.md | 146 +++++++++--------- go.mod | 4 +- go.sum | 4 +- src/{build => }/arch/arm64/Registers.go | 2 +- src/{build => }/arch/riscv/Registers.go | 2 +- src/{build => }/arch/x64/Add.go | 2 +- src/{build => }/arch/x64/Add_test.go | 4 +- src/{build => }/arch/x64/And.go | 2 +- src/{build => }/arch/x64/Call.go | 0 src/{build => }/arch/x64/Compare.go | 2 +- src/{build => }/arch/x64/Compare_test.go | 4 +- src/{build => }/arch/x64/Div.go | 2 +- src/{build => }/arch/x64/Div_test.go | 4 +- src/{build => }/arch/x64/ExtendRAXToRDX.go | 0 src/{build => }/arch/x64/Jump.go | 0 src/{build => }/arch/x64/Jump_test.go | 2 +- src/{build => }/arch/x64/Load.go | 2 +- src/{build => }/arch/x64/Load_test.go | 4 +- src/{build => }/arch/x64/ModRM.go | 0 src/{build => }/arch/x64/ModRM_test.go | 2 +- src/{build => }/arch/x64/Move.go | 4 +- src/{build => }/arch/x64/Move_test.go | 4 +- src/{build => }/arch/x64/Mul.go | 2 +- src/{build => }/arch/x64/Mul_test.go | 4 +- src/{build => }/arch/x64/Negate.go | 2 +- src/{build => }/arch/x64/Negate_test.go | 4 +- src/{build => }/arch/x64/Or.go | 2 +- src/{build => }/arch/x64/Pop.go | 2 +- src/{build => }/arch/x64/Pop_test.go | 4 +- src/{build => }/arch/x64/Push.go | 2 +- src/{build => }/arch/x64/Push_test.go | 4 +- src/{build => }/arch/x64/REX.go | 0 src/{build => }/arch/x64/REX_test.go | 2 +- src/{build => }/arch/x64/Registers.go | 2 +- src/{build => }/arch/x64/Return.go | 0 src/{build => }/arch/x64/SIB.go | 0 src/{build => }/arch/x64/SIB_test.go | 2 +- src/{build => }/arch/x64/Shift.go | 2 +- src/{build => }/arch/x64/Store.go | 2 +- src/{build => }/arch/x64/Store_test.go | 4 +- src/{build => }/arch/x64/Sub.go | 2 +- src/{build => }/arch/x64/Sub_test.go | 4 +- src/{build => }/arch/x64/Syscall.go | 0 src/{build => }/arch/x64/Xor.go | 2 +- src/{build => }/arch/x64/encode.go | 2 +- src/{build => }/arch/x64/encodeNum.go | 4 +- src/{build => }/arch/x64/memoryAccess.go | 2 +- src/{build => }/arch/x64/x64_test.go | 2 +- src/{build => }/asm/Assembler.go | 2 +- src/{build => }/asm/Finalize.go | 8 +- src/{build => }/asm/Instruction.go | 0 src/{build => }/asm/Instructions.go | 0 src/{build => }/asm/Label.go | 0 src/{build => }/asm/Memory.go | 2 +- src/{build => }/asm/MemoryNumber.go | 0 src/{build => }/asm/MemoryRegister.go | 2 +- src/{build => }/asm/Mnemonic.go | 0 src/{build => }/asm/Optimizer.go | 2 +- src/{build => }/asm/Pointer.go | 0 src/{build => }/asm/Register.go | 2 +- src/{build => }/asm/RegisterLabel.go | 2 +- src/{build => }/asm/RegisterNumber.go | 2 +- src/{build => }/asm/RegisterRegister.go | 2 +- src/{build => }/ast/AST.go | 0 src/{build => }/ast/Assert.go | 2 +- src/{build => }/ast/Assign.go | 2 +- src/{build => }/ast/Call.go | 2 +- src/{build => }/ast/Count.go | 2 +- src/{build => }/ast/Define.go | 2 +- src/{build => }/ast/EachInstruction.go | 2 +- src/{build => }/ast/If.go | 2 +- src/{build => }/ast/Loop.go | 0 src/{build => }/ast/Parse.go | 4 +- src/{build => }/ast/Return.go | 2 +- src/{build => }/ast/Switch.go | 2 +- src/{build => }/ast/parseKeyword.go | 6 +- src/{build => }/ast/parseNode.go | 6 +- src/{build => }/ast/parseSwitch.go | 4 +- src/build/Build.go | 4 +- src/build/expression/List.go | 55 ------- src/build/token/List_test.go | 18 --- src/cli/Build.go | 4 +- src/cli/Run.go | 2 +- src/cli/System.go | 2 +- src/{build => }/compiler/Compile.go | 6 +- src/{build => }/compiler/Result.go | 10 +- src/{build => }/config/config.go | 0 src/{build => }/config/init.go | 0 src/{build => }/core/AddBytes.go | 0 src/{build => }/core/Compare.go | 8 +- src/{build => }/core/Compile.go | 0 src/{build => }/core/CompileAST.go | 2 +- src/{build => }/core/CompileASTNode.go | 2 +- src/{build => }/core/CompileAssert.go | 4 +- src/{build => }/core/CompileAssign.go | 6 +- src/{build => }/core/CompileAssignArray.go | 6 +- src/{build => }/core/CompileAssignDivision.go | 8 +- src/{build => }/core/CompileCall.go | 6 +- src/{build => }/core/CompileCondition.go | 4 +- src/{build => }/core/CompileDefinition.go | 10 +- src/{build => }/core/CompileIf.go | 4 +- src/{build => }/core/CompileLoop.go | 4 +- src/{build => }/core/CompileReturn.go | 6 +- src/{build => }/core/CompileSwitch.go | 4 +- src/{build => }/core/CompileSyscall.go | 2 +- src/{build => }/core/CompileTokens.go | 6 +- src/{build => }/core/Defer.go | 0 src/{build => }/core/Define.go | 8 +- src/{build => }/core/Evaluate.go | 8 +- src/{build => }/core/Execute.go | 8 +- src/{build => }/core/ExecuteLeaf.go | 6 +- src/{build => }/core/ExecuteRegister.go | 8 +- src/{build => }/core/ExecuteRegisterNumber.go | 10 +- .../core/ExecuteRegisterRegister.go | 10 +- src/{build => }/core/ExpressionToMemory.go | 10 +- src/{build => }/core/ExpressionToRegister.go | 14 +- .../core/ExpressionsToRegisters.go | 4 +- src/{build => }/core/Fold.go | 6 +- src/{build => }/core/Function.go | 10 +- src/{build => }/core/IdentifierExists.go | 0 src/{build => }/core/JumpIfFalse.go | 4 +- src/{build => }/core/JumpIfTrue.go | 4 +- src/{build => }/core/NewFunction.go | 14 +- src/{build => }/core/Number.go | 4 +- src/{build => }/core/PrintInstructions.go | 2 +- src/{build => }/core/String.go | 0 src/{build => }/core/TokenToRegister.go | 10 +- src/{build => }/core/UsesRegister.go | 6 +- src/{build => }/cpu/CPU.go | 0 src/{build => }/cpu/Register.go | 0 src/{build => }/cpu/Register_test.go | 2 +- src/{build => }/cpu/State.go | 0 src/{build => }/cpu/State_test.go | 2 +- src/{build => }/data/Data.go | 0 src/{build => }/data/Data_test.go | 2 +- src/{build => }/elf/ELF.go | 2 +- src/{build => }/elf/ELF_test.go | 2 +- src/{build => }/elf/Header.go | 0 src/{build => }/elf/Padding.go | 0 src/{build => }/elf/ProgramHeader.go | 0 src/{build => }/elf/SectionHeader.go | 0 src/{build => }/elf/elf.md | 0 src/{build => }/errors/Base.go | 0 src/{build => }/errors/Error.go | 4 +- src/{build => }/errors/InvalidCharacter.go | 0 src/{build => }/errors/InvalidInstruction.go | 0 src/{build => }/errors/InvalidOperator.go | 0 .../errors/KeywordNotImplemented.go | 0 src/{build => }/errors/NumberExceedsBounds.go | 0 src/{build => }/errors/Stack.go | 0 src/{build => }/errors/TypeMismatch.go | 0 src/{build => }/errors/UnknownCLIParameter.go | 0 src/{build => }/errors/UnknownFunction.go | 0 src/{build => }/errors/UnknownIdentifier.go | 0 src/{build => }/errors/UnknownPackage.go | 0 src/{build => }/errors/UnusedImport.go | 0 src/{build => }/errors/UnusedVariable.go | 0 .../errors/VariableAlreadyExists.go | 0 src/{build => }/expression/Expression.go | 2 +- src/{build => }/expression/Expression_test.go | 26 +--- src/expression/List.go | 18 +++ src/{build => }/expression/Operator.go | 2 +- src/{build => }/expression/Parse.go | 2 +- src/{build => }/expression/bench_test.go | 4 +- src/{build => }/fs/File.go | 2 +- src/{build => }/fs/Import.go | 2 +- src/{build => }/fs/Walk.go | 0 src/{build => }/fs/Walk_test.go | 2 +- src/{build => }/os/linux/Syscall.go | 0 src/{build => }/register/AddLabel.go | 2 +- src/{build => }/register/Call.go | 0 src/{build => }/register/Comment.go | 0 src/{build => }/register/FreeRegister.go | 2 +- src/{build => }/register/Jump.go | 2 +- src/{build => }/register/Machine.go | 6 +- src/{build => }/register/MemoryNumber.go | 2 +- src/{build => }/register/MemoryRegister.go | 4 +- src/{build => }/register/NewRegister.go | 2 +- src/{build => }/register/Register.go | 4 +- src/{build => }/register/RegisterIsUsed.go | 2 +- src/{build => }/register/RegisterLabel.go | 4 +- src/{build => }/register/RegisterNumber.go | 6 +- src/{build => }/register/RegisterRegister.go | 4 +- src/{build => }/register/Return.go | 0 src/{build => }/register/SaveRegister.go | 4 +- src/{build => }/register/Syscall.go | 0 src/{build => }/register/UseRegister.go | 2 +- src/{build => }/register/postInstruction.go | 2 +- src/{build => }/scanner/Scan.go | 4 +- src/{build => }/scanner/Scanner.go | 4 +- src/{build => }/scanner/queue.go | 0 src/{build => }/scanner/queueDirectory.go | 2 +- src/{build => }/scanner/queueFile.go | 0 src/{build => }/scanner/scanFile.go | 19 ++- src/{build => }/scope/Scope.go | 2 +- src/{build => }/scope/Stack.go | 6 +- src/{build => }/scope/Variable.go | 4 +- src/{build => }/sizeof/Signed.go | 0 src/{build => }/sizeof/Signed_test.go | 2 +- src/{build => }/sizeof/Unsigned.go | 0 src/{build => }/sizeof/Unsigned_test.go | 2 +- src/{build => }/token/Count.go | 0 src/{build => }/token/Count_test.go | 2 +- src/{build => }/token/Kind.go | 0 src/{build => }/token/Length.go | 0 src/{build => }/token/List.go | 37 +++++ src/token/List_test.go | 40 +++++ src/{build => }/token/Position.go | 0 src/{build => }/token/Token.go | 0 src/{build => }/token/Token_test.go | 2 +- src/{build => }/token/Tokenize.go | 0 src/{build => }/token/Tokenize_test.go | 2 +- src/{build => }/token/bench_test.go | 2 +- src/{build => }/types/New.go | 0 src/{build => }/types/NewList.go | 7 +- src/{build => }/types/Type.go | 0 tests/errors_test.go | 2 +- tests/examples_test.go | 2 +- tests/programs_test.go | 2 +- 219 files changed, 453 insertions(+), 457 deletions(-) rename src/{build => }/arch/arm64/Registers.go (85%) rename src/{build => }/arch/riscv/Registers.go (85%) rename src/{build => }/arch/x64/Add.go (92%) rename src/{build => }/arch/x64/Add_test.go (97%) rename src/{build => }/arch/x64/And.go (92%) rename src/{build => }/arch/x64/Call.go (100%) rename src/{build => }/arch/x64/Compare.go (92%) rename src/{build => }/arch/x64/Compare_test.go (97%) rename src/{build => }/arch/x64/Div.go (85%) rename src/{build => }/arch/x64/Div_test.go (92%) rename src/{build => }/arch/x64/ExtendRAXToRDX.go (100%) rename src/{build => }/arch/x64/Jump.go (100%) rename src/{build => }/arch/x64/Jump_test.go (96%) rename src/{build => }/arch/x64/Load.go (85%) rename src/{build => }/arch/x64/Load_test.go (99%) rename src/{build => }/arch/x64/ModRM.go (100%) rename src/{build => }/arch/x64/ModRM_test.go (95%) rename src/{build => }/arch/x64/Move.go (94%) rename src/{build => }/arch/x64/Move_test.go (98%) rename src/{build => }/arch/x64/Mul.go (91%) rename src/{build => }/arch/x64/Mul_test.go (97%) rename src/{build => }/arch/x64/Negate.go (81%) rename src/{build => }/arch/x64/Negate_test.go (92%) rename src/{build => }/arch/x64/Or.go (92%) rename src/{build => }/arch/x64/Pop.go (86%) rename src/{build => }/arch/x64/Pop_test.go (91%) rename src/{build => }/arch/x64/Push.go (86%) rename src/{build => }/arch/x64/Push_test.go (91%) rename src/{build => }/arch/x64/REX.go (100%) rename src/{build => }/arch/x64/REX_test.go (94%) rename src/{build => }/arch/x64/Registers.go (92%) rename src/{build => }/arch/x64/Return.go (100%) rename src/{build => }/arch/x64/SIB.go (100%) rename src/{build => }/arch/x64/SIB_test.go (95%) rename src/{build => }/arch/x64/Shift.go (93%) rename src/{build => }/arch/x64/Store.go (95%) rename src/{build => }/arch/x64/Store_test.go (99%) rename src/{build => }/arch/x64/Sub.go (92%) rename src/{build => }/arch/x64/Sub_test.go (97%) rename src/{build => }/arch/x64/Syscall.go (100%) rename src/{build => }/arch/x64/Xor.go (92%) rename src/{build => }/arch/x64/encode.go (94%) rename src/{build => }/arch/x64/encodeNum.go (86%) rename src/{build => }/arch/x64/memoryAccess.go (93%) rename src/{build => }/arch/x64/x64_test.go (92%) rename src/{build => }/asm/Assembler.go (93%) rename src/{build => }/asm/Finalize.go (98%) rename src/{build => }/asm/Instruction.go (100%) rename src/{build => }/asm/Instructions.go (100%) rename src/{build => }/asm/Label.go (100%) rename src/{build => }/asm/Memory.go (65%) rename src/{build => }/asm/MemoryNumber.go (100%) rename src/{build => }/asm/MemoryRegister.go (94%) rename src/{build => }/asm/Mnemonic.go (100%) rename src/{build => }/asm/Optimizer.go (93%) rename src/{build => }/asm/Pointer.go (100%) rename src/{build => }/asm/Register.go (92%) rename src/{build => }/asm/RegisterLabel.go (94%) rename src/{build => }/asm/RegisterNumber.go (94%) rename src/{build => }/asm/RegisterRegister.go (94%) rename src/{build => }/ast/AST.go (100%) rename src/{build => }/ast/Assert.go (78%) rename src/{build => }/ast/Assign.go (78%) rename src/{build => }/ast/Call.go (67%) rename src/{build => }/ast/Count.go (95%) rename src/{build => }/ast/Define.go (73%) rename src/{build => }/ast/EachInstruction.go (95%) rename src/{build => }/ast/If.go (75%) rename src/{build => }/ast/Loop.go (100%) rename src/{build => }/ast/Parse.go (91%) rename src/{build => }/ast/Return.go (73%) rename src/{build => }/ast/Switch.go (82%) rename src/{build => }/ast/parseKeyword.go (95%) rename src/{build => }/ast/parseNode.go (87%) rename src/{build => }/ast/parseSwitch.go (89%) delete mode 100644 src/build/expression/List.go delete mode 100644 src/build/token/List_test.go rename src/{build => }/compiler/Compile.go (94%) rename src/{build => }/compiler/Result.go (93%) rename src/{build => }/config/config.go (100%) rename src/{build => }/config/init.go (100%) rename src/{build => }/core/AddBytes.go (100%) rename src/{build => }/core/Compare.go (85%) rename src/{build => }/core/Compile.go (100%) rename src/{build => }/core/CompileAST.go (86%) rename src/{build => }/core/CompileASTNode.go (95%) rename src/{build => }/core/CompileAssert.go (86%) rename src/{build => }/core/CompileAssign.go (87%) rename src/{build => }/core/CompileAssignArray.go (86%) rename src/{build => }/core/CompileAssignDivision.go (87%) rename src/{build => }/core/CompileCall.go (95%) rename src/{build => }/core/CompileCondition.go (95%) rename src/{build => }/core/CompileDefinition.go (84%) rename src/{build => }/core/CompileIf.go (92%) rename src/{build => }/core/CompileLoop.go (85%) rename src/{build => }/core/CompileReturn.go (84%) rename src/{build => }/core/CompileSwitch.go (92%) rename src/{build => }/core/CompileSyscall.go (92%) rename src/{build => }/core/CompileTokens.go (69%) rename src/{build => }/core/Defer.go (100%) rename src/{build => }/core/Define.go (78%) rename src/{build => }/core/Evaluate.go (77%) rename src/{build => }/core/Execute.go (80%) rename src/{build => }/core/ExecuteLeaf.go (88%) rename src/{build => }/core/ExecuteRegister.go (71%) rename src/{build => }/core/ExecuteRegisterNumber.go (89%) rename src/{build => }/core/ExecuteRegisterRegister.go (88%) rename src/{build => }/core/ExpressionToMemory.go (80%) rename src/{build => }/core/ExpressionToRegister.go (87%) rename src/{build => }/core/ExpressionsToRegisters.go (82%) rename src/{build => }/core/Fold.go (89%) rename src/{build => }/core/Function.go (75%) rename src/{build => }/core/IdentifierExists.go (100%) rename src/{build => }/core/JumpIfFalse.go (85%) rename src/{build => }/core/JumpIfTrue.go (85%) rename src/{build => }/core/NewFunction.go (72%) rename src/{build => }/core/Number.go (92%) rename src/{build => }/core/PrintInstructions.go (97%) rename src/{build => }/core/String.go (100%) rename src/{build => }/core/TokenToRegister.go (84%) rename src/{build => }/core/UsesRegister.go (84%) rename src/{build => }/cpu/CPU.go (100%) rename src/{build => }/cpu/Register.go (100%) rename src/{build => }/cpu/Register_test.go (82%) rename src/{build => }/cpu/State.go (100%) rename src/{build => }/cpu/State_test.go (95%) rename src/{build => }/data/Data.go (100%) rename src/{build => }/data/Data_test.go (94%) rename src/{build => }/elf/ELF.go (98%) rename src/{build => }/elf/ELF_test.go (77%) rename src/{build => }/elf/Header.go (100%) rename src/{build => }/elf/Padding.go (100%) rename src/{build => }/elf/ProgramHeader.go (100%) rename src/{build => }/elf/SectionHeader.go (100%) rename src/{build => }/elf/elf.md (100%) rename src/{build => }/errors/Base.go (100%) rename src/{build => }/errors/Error.go (94%) rename src/{build => }/errors/InvalidCharacter.go (100%) rename src/{build => }/errors/InvalidInstruction.go (100%) rename src/{build => }/errors/InvalidOperator.go (100%) rename src/{build => }/errors/KeywordNotImplemented.go (100%) rename src/{build => }/errors/NumberExceedsBounds.go (100%) rename src/{build => }/errors/Stack.go (100%) rename src/{build => }/errors/TypeMismatch.go (100%) rename src/{build => }/errors/UnknownCLIParameter.go (100%) rename src/{build => }/errors/UnknownFunction.go (100%) rename src/{build => }/errors/UnknownIdentifier.go (100%) rename src/{build => }/errors/UnknownPackage.go (100%) rename src/{build => }/errors/UnusedImport.go (100%) rename src/{build => }/errors/UnusedVariable.go (100%) rename src/{build => }/errors/VariableAlreadyExists.go (100%) rename src/{build => }/expression/Expression.go (98%) rename src/{build => }/expression/Expression_test.go (91%) create mode 100644 src/expression/List.go rename src/{build => }/expression/Operator.go (98%) rename src/{build => }/expression/Parse.go (98%) rename src/{build => }/expression/bench_test.go (72%) rename src/{build => }/fs/File.go (78%) rename src/{build => }/fs/Import.go (77%) rename src/{build => }/fs/Walk.go (100%) rename src/{build => }/fs/Walk_test.go (93%) rename src/{build => }/os/linux/Syscall.go (100%) rename src/{build => }/register/AddLabel.go (73%) rename src/{build => }/register/Call.go (100%) rename src/{build => }/register/Comment.go (100%) rename src/{build => }/register/FreeRegister.go (76%) rename src/{build => }/register/Jump.go (76%) rename src/{build => }/register/Machine.go (62%) rename src/{build => }/register/MemoryNumber.go (78%) rename src/{build => }/register/MemoryRegister.go (70%) rename src/{build => }/register/NewRegister.go (83%) rename src/{build => }/register/Register.go (73%) rename src/{build => }/register/RegisterIsUsed.go (78%) rename src/{build => }/register/RegisterLabel.go (77%) rename src/{build => }/register/RegisterNumber.go (86%) rename src/{build => }/register/RegisterRegister.go (79%) rename src/{build => }/register/Return.go (100%) rename src/{build => }/register/SaveRegister.go (87%) rename src/{build => }/register/Syscall.go (100%) rename src/{build => }/register/UseRegister.go (78%) rename src/{build => }/register/postInstruction.go (77%) rename src/{build => }/scanner/Scan.go (86%) rename src/{build => }/scanner/Scanner.go (77%) rename src/{build => }/scanner/queue.go (100%) rename src/{build => }/scanner/queueDirectory.go (92%) rename src/{build => }/scanner/queueFile.go (100%) rename src/{build => }/scanner/scanFile.go (92%) rename src/{build => }/scope/Scope.go (93%) rename src/{build => }/scope/Stack.go (94%) rename src/{build => }/scope/Variable.go (85%) rename src/{build => }/sizeof/Signed.go (100%) rename src/{build => }/sizeof/Signed_test.go (93%) rename src/{build => }/sizeof/Unsigned.go (100%) rename src/{build => }/sizeof/Unsigned_test.go (89%) rename src/{build => }/token/Count.go (100%) rename src/{build => }/token/Count_test.go (92%) rename src/{build => }/token/Kind.go (100%) rename src/{build => }/token/Length.go (100%) rename src/{build => }/token/List.go (54%) create mode 100644 src/token/List_test.go rename src/{build => }/token/Position.go (100%) rename src/{build => }/token/Token.go (100%) rename src/{build => }/token/Token_test.go (96%) rename src/{build => }/token/Tokenize.go (100%) rename src/{build => }/token/Tokenize_test.go (99%) rename src/{build => }/token/bench_test.go (90%) rename src/{build => }/types/New.go (100%) rename src/{build => }/types/NewList.go (60%) rename src/{build => }/types/Type.go (100%) diff --git a/README.md b/README.md index 1eafca8..695e702 100644 --- a/README.md +++ b/README.md @@ -24,79 +24,6 @@ Build a Linux x86-64 ELF executable from `examples/hello` and run it: ./q run examples/hello ``` -## Documentation - -### [main.go](main.go) - -Entry point. It simply calls `cli.Main` which we can use for testing. - -### [src/cli/Main.go](src/cli/Main.go) - -The command line interface expects a command like `build` as the first argument. -Commands are implemented as functions in the [src/cli](src/cli) directory. -Each command has its own set of parameters. - -### [src/cli/Build.go](src/cli/Build.go) - -The build command creates a new `Build` instance with the given directory and calls the `Run` method. - -If no directory is specified, it will use the current directory. - -If the `--dry` flag is specified, it will perform all tasks except the final write to disk. -This flag should be used in most tests and benchmarks to avoid needless disk writes. - -```shell -q build -q build examples/hello -q build examples/hello --dry -``` - -Adding the `-a` or `--assembler` flag shows the generated assembly instructions: - -```shell -q build examples/hello -a -``` - -Adding the `-v` or `--verbose` flag shows verbose compiler information: - -```shell -q build examples/hello -v -``` - -### [src/build/Build.go](src/build/Build.go) - -The `Build` type defines all the information needed to start building an executable file. -The name of the executable will be equal to the name of the build directory. - -`Run` starts the build which will scan all `.q` source files in the build directory. -Every source file is scanned in its own goroutine for performance reasons. -Parallelization here is possible because the order of files in a directory is not significant. - -The main thread is meanwhile waiting for new function objects to arrive from the scanners. -Once a function has arrived, it will be stored for compilation later. -We need to wait with the compilation step until we have enough information about all identifiers from the scan. - -Then all the functions that were scanned will be compiled in parallel. -We create a separate goroutine for each function compilation. -Each function will then be translated to generic assembler instructions. - -All the functions that are required to run the program will be added to the final assembler. -The final assembler resolves label addresses, optimizes the performance and generates the specific x86-64 machine code from the generic instruction set. - -### [src/build/core/Function.go](src/build/core/Function.go) - -This is the "heart" of the compiler. -Each function runs `f.Compile` which organizes the source code into an abstract syntax tree that is then compiled via `f.CompileAST`. -You can think of AST nodes as the individual statements in your source code. - -### [src/build/ast/Parse.go](src/build/ast/Parse.go) - -This is what generates the AST from tokens. - -### [src/build/expression/Parse.go](src/build/expression/Parse.go) - -This is what generates expressions from tokens. - ## Todo ### Compiler @@ -176,6 +103,79 @@ This is what generates expressions from tokens. - [ ] Mac - [ ] Windows +## Documentation + +### [main.go](main.go) + +Entry point. It simply calls `cli.Main` which we can use for testing. + +### [src/cli/Main.go](src/cli/Main.go) + +The command line interface expects a command like `build` as the first argument. +Commands are implemented as functions in the [src/cli](src/cli) directory. +Each command has its own set of parameters. + +### [src/cli/Build.go](src/cli/Build.go) + +The build command creates a new `Build` instance with the given directory and calls the `Run` method. + +If no directory is specified, it will use the current directory. + +If the `--dry` flag is specified, it will perform all tasks except the final write to disk. +This flag should be used in most tests and benchmarks to avoid needless disk writes. + +```shell +q build +q build examples/hello +q build examples/hello --dry +``` + +Adding the `-a` or `--assembler` flag shows the generated assembly instructions: + +```shell +q build examples/hello -a +``` + +Adding the `-v` or `--verbose` flag shows verbose compiler information: + +```shell +q build examples/hello -v +``` + +### [src/build/Build.go](src/build/Build.go) + +The `Build` type defines all the information needed to start building an executable file. +The name of the executable will be equal to the name of the build directory. + +`Run` starts the build which will scan all `.q` source files in the build directory. +Every source file is scanned in its own goroutine for performance reasons. +Parallelization here is possible because the order of files in a directory is not significant. + +The main thread is meanwhile waiting for new function objects to arrive from the scanners. +Once a function has arrived, it will be stored for compilation later. +We need to wait with the compilation step until we have enough information about all identifiers from the scan. + +Then all the functions that were scanned will be compiled in parallel. +We create a separate goroutine for each function compilation. +Each function will then be translated to generic assembler instructions. + +All the functions that are required to run the program will be added to the final assembler. +The final assembler resolves label addresses, optimizes the performance and generates the specific x86-64 machine code from the generic instruction set. + +### [src/core/Function.go](src/core/Function.go) + +This is the "heart" of the compiler. +Each function runs `f.Compile` which organizes the source code into an abstract syntax tree that is then compiled via `f.CompileAST`. +You can think of AST nodes as the individual statements in your source code. + +### [src/ast/Parse.go](src/ast/Parse.go) + +This is what generates the AST from tokens. + +### [src/expression/Parse.go](src/expression/Parse.go) + +This is what generates expressions from tokens. + ## Tests ```shell diff --git a/go.mod b/go.mod index 52bbab9..d8c9380 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ module git.akyoto.dev/cli/q -go 1.22.4 +go 1.22.6 require ( git.akyoto.dev/go/assert v0.1.3 git.akyoto.dev/go/color v0.1.1 ) -require golang.org/x/sys v0.22.0 // indirect +require golang.org/x/sys v0.23.0 // indirect diff --git a/go.sum b/go.sum index 5e65b25..bf24815 100644 --- a/go.sum +++ b/go.sum @@ -2,5 +2,5 @@ git.akyoto.dev/go/assert v0.1.3 h1:QwCUbmG4aZYsNk/OuRBz1zWVKmGlDUHhOnnDBfn8Qw8= git.akyoto.dev/go/assert v0.1.3/go.mod h1:0GzMaM0eURuDwtGkJJkCsI7r2aUKr+5GmWNTFPgDocM= git.akyoto.dev/go/color v0.1.1 h1:mMAoMIwLBPNy7ocRSxdsCFs7onPC3GfDEiJErCneqRE= git.akyoto.dev/go/color v0.1.1/go.mod h1:ywOjoD0O0sk6bIn92uAJf7mErlEFCuQInL84y4Lqi3Q= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/src/build/arch/arm64/Registers.go b/src/arch/arm64/Registers.go similarity index 85% rename from src/build/arch/arm64/Registers.go rename to src/arch/arm64/Registers.go index a00c709..3fd4f57 100644 --- a/src/build/arch/arm64/Registers.go +++ b/src/arch/arm64/Registers.go @@ -1,6 +1,6 @@ package arm64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" const ( X0 cpu.Register = iota diff --git a/src/build/arch/riscv/Registers.go b/src/arch/riscv/Registers.go similarity index 85% rename from src/build/arch/riscv/Registers.go rename to src/arch/riscv/Registers.go index 846b936..e9436d2 100644 --- a/src/build/arch/riscv/Registers.go +++ b/src/arch/riscv/Registers.go @@ -1,6 +1,6 @@ package riscv -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" const ( X0 cpu.Register = iota diff --git a/src/build/arch/x64/Add.go b/src/arch/x64/Add.go similarity index 92% rename from src/build/arch/x64/Add.go rename to src/arch/x64/Add.go index 2e55c7d..a487a3b 100644 --- a/src/build/arch/x64/Add.go +++ b/src/arch/x64/Add.go @@ -1,7 +1,7 @@ package x64 import ( - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // AddRegisterNumber adds a number to the given register. diff --git a/src/build/arch/x64/Add_test.go b/src/arch/x64/Add_test.go similarity index 97% rename from src/build/arch/x64/Add_test.go rename to src/arch/x64/Add_test.go index 607b467..52d6645 100644 --- a/src/build/arch/x64/Add_test.go +++ b/src/arch/x64/Add_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/And.go b/src/arch/x64/And.go similarity index 92% rename from src/build/arch/x64/And.go rename to src/arch/x64/And.go index e5d8fcb..a20c3c3 100644 --- a/src/build/arch/x64/And.go +++ b/src/arch/x64/And.go @@ -1,7 +1,7 @@ package x64 import ( - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // AndRegisterNumber performs a bitwise AND using a register and a number. diff --git a/src/build/arch/x64/Call.go b/src/arch/x64/Call.go similarity index 100% rename from src/build/arch/x64/Call.go rename to src/arch/x64/Call.go diff --git a/src/build/arch/x64/Compare.go b/src/arch/x64/Compare.go similarity index 92% rename from src/build/arch/x64/Compare.go rename to src/arch/x64/Compare.go index 49b5ba6..3c48dcf 100644 --- a/src/build/arch/x64/Compare.go +++ b/src/arch/x64/Compare.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // Compares the register with the number and sets the status flags in the EFLAGS register. func CompareRegisterNumber(code []byte, register cpu.Register, number int) []byte { diff --git a/src/build/arch/x64/Compare_test.go b/src/arch/x64/Compare_test.go similarity index 97% rename from src/build/arch/x64/Compare_test.go rename to src/arch/x64/Compare_test.go index cef49b3..6372665 100644 --- a/src/build/arch/x64/Compare_test.go +++ b/src/arch/x64/Compare_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Div.go b/src/arch/x64/Div.go similarity index 85% rename from src/build/arch/x64/Div.go rename to src/arch/x64/Div.go index 5c567bd..26439d1 100644 --- a/src/build/arch/x64/Div.go +++ b/src/arch/x64/Div.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // DivRegister divides RDX:RAX by the value in the register. func DivRegister(code []byte, divisor cpu.Register) []byte { diff --git a/src/build/arch/x64/Div_test.go b/src/arch/x64/Div_test.go similarity index 92% rename from src/build/arch/x64/Div_test.go rename to src/arch/x64/Div_test.go index 267250e..3598dbf 100644 --- a/src/build/arch/x64/Div_test.go +++ b/src/arch/x64/Div_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/ExtendRAXToRDX.go b/src/arch/x64/ExtendRAXToRDX.go similarity index 100% rename from src/build/arch/x64/ExtendRAXToRDX.go rename to src/arch/x64/ExtendRAXToRDX.go diff --git a/src/build/arch/x64/Jump.go b/src/arch/x64/Jump.go similarity index 100% rename from src/build/arch/x64/Jump.go rename to src/arch/x64/Jump.go diff --git a/src/build/arch/x64/Jump_test.go b/src/arch/x64/Jump_test.go similarity index 96% rename from src/build/arch/x64/Jump_test.go rename to src/arch/x64/Jump_test.go index 5c12133..fe40c50 100644 --- a/src/build/arch/x64/Jump_test.go +++ b/src/arch/x64/Jump_test.go @@ -3,7 +3,7 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" + "git.akyoto.dev/cli/q/src/arch/x64" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Load.go b/src/arch/x64/Load.go similarity index 85% rename from src/build/arch/x64/Load.go rename to src/arch/x64/Load.go index 18e36d2..eb5ac51 100644 --- a/src/build/arch/x64/Load.go +++ b/src/arch/x64/Load.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // LoadRegister loads from memory into a register. func LoadRegister(code []byte, destination cpu.Register, offset byte, length byte, source cpu.Register) []byte { diff --git a/src/build/arch/x64/Load_test.go b/src/arch/x64/Load_test.go similarity index 99% rename from src/build/arch/x64/Load_test.go rename to src/arch/x64/Load_test.go index f906a28..31330c6 100644 --- a/src/build/arch/x64/Load_test.go +++ b/src/arch/x64/Load_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/ModRM.go b/src/arch/x64/ModRM.go similarity index 100% rename from src/build/arch/x64/ModRM.go rename to src/arch/x64/ModRM.go diff --git a/src/build/arch/x64/ModRM_test.go b/src/arch/x64/ModRM_test.go similarity index 95% rename from src/build/arch/x64/ModRM_test.go rename to src/arch/x64/ModRM_test.go index e9d470f..edcaffe 100644 --- a/src/build/arch/x64/ModRM_test.go +++ b/src/arch/x64/ModRM_test.go @@ -3,7 +3,7 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" + "git.akyoto.dev/cli/q/src/arch/x64" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Move.go b/src/arch/x64/Move.go similarity index 94% rename from src/build/arch/x64/Move.go rename to src/arch/x64/Move.go index cac1d09..48edc79 100644 --- a/src/build/arch/x64/Move.go +++ b/src/arch/x64/Move.go @@ -3,8 +3,8 @@ package x64 import ( "encoding/binary" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/sizeof" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/sizeof" ) // MoveRegisterNumber moves an integer into the given register. diff --git a/src/build/arch/x64/Move_test.go b/src/arch/x64/Move_test.go similarity index 98% rename from src/build/arch/x64/Move_test.go rename to src/arch/x64/Move_test.go index 66cfb4a..faf9fcc 100644 --- a/src/build/arch/x64/Move_test.go +++ b/src/arch/x64/Move_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Mul.go b/src/arch/x64/Mul.go similarity index 91% rename from src/build/arch/x64/Mul.go rename to src/arch/x64/Mul.go index b6d7883..6c0cbea 100644 --- a/src/build/arch/x64/Mul.go +++ b/src/arch/x64/Mul.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // MulRegisterNumber multiplies a register with a number. func MulRegisterNumber(code []byte, destination cpu.Register, number int) []byte { diff --git a/src/build/arch/x64/Mul_test.go b/src/arch/x64/Mul_test.go similarity index 97% rename from src/build/arch/x64/Mul_test.go rename to src/arch/x64/Mul_test.go index 5c029dd..cd8da70 100644 --- a/src/build/arch/x64/Mul_test.go +++ b/src/arch/x64/Mul_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Negate.go b/src/arch/x64/Negate.go similarity index 81% rename from src/build/arch/x64/Negate.go rename to src/arch/x64/Negate.go index 00ae530..479c143 100644 --- a/src/build/arch/x64/Negate.go +++ b/src/arch/x64/Negate.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // NegateRegister negates the value in the register. func NegateRegister(code []byte, register cpu.Register) []byte { diff --git a/src/build/arch/x64/Negate_test.go b/src/arch/x64/Negate_test.go similarity index 92% rename from src/build/arch/x64/Negate_test.go rename to src/arch/x64/Negate_test.go index dd64518..98aa13e 100644 --- a/src/build/arch/x64/Negate_test.go +++ b/src/arch/x64/Negate_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Or.go b/src/arch/x64/Or.go similarity index 92% rename from src/build/arch/x64/Or.go rename to src/arch/x64/Or.go index 2252925..fec37da 100644 --- a/src/build/arch/x64/Or.go +++ b/src/arch/x64/Or.go @@ -1,7 +1,7 @@ package x64 import ( - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // OrRegisterNumber performs a bitwise OR using a register and a number. diff --git a/src/build/arch/x64/Pop.go b/src/arch/x64/Pop.go similarity index 86% rename from src/build/arch/x64/Pop.go rename to src/arch/x64/Pop.go index 4ce82ec..b97182f 100644 --- a/src/build/arch/x64/Pop.go +++ b/src/arch/x64/Pop.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // PopRegister pops a value from the stack and saves it into the register. func PopRegister(code []byte, register cpu.Register) []byte { diff --git a/src/build/arch/x64/Pop_test.go b/src/arch/x64/Pop_test.go similarity index 91% rename from src/build/arch/x64/Pop_test.go rename to src/arch/x64/Pop_test.go index 5375bde..0a4ce98 100644 --- a/src/build/arch/x64/Pop_test.go +++ b/src/arch/x64/Pop_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Push.go b/src/arch/x64/Push.go similarity index 86% rename from src/build/arch/x64/Push.go rename to src/arch/x64/Push.go index 944d1e4..bdae334 100644 --- a/src/build/arch/x64/Push.go +++ b/src/arch/x64/Push.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // PushRegister pushes the value inside the register onto the stack. func PushRegister(code []byte, register cpu.Register) []byte { diff --git a/src/build/arch/x64/Push_test.go b/src/arch/x64/Push_test.go similarity index 91% rename from src/build/arch/x64/Push_test.go rename to src/arch/x64/Push_test.go index 9177532..0dc092b 100644 --- a/src/build/arch/x64/Push_test.go +++ b/src/arch/x64/Push_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/REX.go b/src/arch/x64/REX.go similarity index 100% rename from src/build/arch/x64/REX.go rename to src/arch/x64/REX.go diff --git a/src/build/arch/x64/REX_test.go b/src/arch/x64/REX_test.go similarity index 94% rename from src/build/arch/x64/REX_test.go rename to src/arch/x64/REX_test.go index e48e3c5..b212b24 100644 --- a/src/build/arch/x64/REX_test.go +++ b/src/arch/x64/REX_test.go @@ -3,7 +3,7 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" + "git.akyoto.dev/cli/q/src/arch/x64" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Registers.go b/src/arch/x64/Registers.go similarity index 92% rename from src/build/arch/x64/Registers.go rename to src/arch/x64/Registers.go index e8ecbc8..9162141 100644 --- a/src/build/arch/x64/Registers.go +++ b/src/arch/x64/Registers.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" const ( RAX cpu.Register = iota diff --git a/src/build/arch/x64/Return.go b/src/arch/x64/Return.go similarity index 100% rename from src/build/arch/x64/Return.go rename to src/arch/x64/Return.go diff --git a/src/build/arch/x64/SIB.go b/src/arch/x64/SIB.go similarity index 100% rename from src/build/arch/x64/SIB.go rename to src/arch/x64/SIB.go diff --git a/src/build/arch/x64/SIB_test.go b/src/arch/x64/SIB_test.go similarity index 95% rename from src/build/arch/x64/SIB_test.go rename to src/arch/x64/SIB_test.go index 690f04b..7dedf6e 100644 --- a/src/build/arch/x64/SIB_test.go +++ b/src/arch/x64/SIB_test.go @@ -3,7 +3,7 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" + "git.akyoto.dev/cli/q/src/arch/x64" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Shift.go b/src/arch/x64/Shift.go similarity index 93% rename from src/build/arch/x64/Shift.go rename to src/arch/x64/Shift.go index 2f88cb1..6fa2251 100644 --- a/src/build/arch/x64/Shift.go +++ b/src/arch/x64/Shift.go @@ -1,7 +1,7 @@ package x64 import ( - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // ShiftLeftNumber shifts the register value by `bitCount` bits to the left. diff --git a/src/build/arch/x64/Store.go b/src/arch/x64/Store.go similarity index 95% rename from src/build/arch/x64/Store.go rename to src/arch/x64/Store.go index f7c8f5b..01bdfc6 100644 --- a/src/build/arch/x64/Store.go +++ b/src/arch/x64/Store.go @@ -3,7 +3,7 @@ package x64 import ( "encoding/binary" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // StoreNumber stores a number into the memory address included in the given register. diff --git a/src/build/arch/x64/Store_test.go b/src/arch/x64/Store_test.go similarity index 99% rename from src/build/arch/x64/Store_test.go rename to src/arch/x64/Store_test.go index 81758d6..1d9d9a9 100644 --- a/src/build/arch/x64/Store_test.go +++ b/src/arch/x64/Store_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Sub.go b/src/arch/x64/Sub.go similarity index 92% rename from src/build/arch/x64/Sub.go rename to src/arch/x64/Sub.go index 268fcc6..fb9a649 100644 --- a/src/build/arch/x64/Sub.go +++ b/src/arch/x64/Sub.go @@ -1,7 +1,7 @@ package x64 import ( - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // SubRegisterNumber subtracts a number from the given register. diff --git a/src/build/arch/x64/Sub_test.go b/src/arch/x64/Sub_test.go similarity index 97% rename from src/build/arch/x64/Sub_test.go rename to src/arch/x64/Sub_test.go index 69199e9..d6898e9 100644 --- a/src/build/arch/x64/Sub_test.go +++ b/src/arch/x64/Sub_test.go @@ -3,8 +3,8 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/arch/x64/Syscall.go b/src/arch/x64/Syscall.go similarity index 100% rename from src/build/arch/x64/Syscall.go rename to src/arch/x64/Syscall.go diff --git a/src/build/arch/x64/Xor.go b/src/arch/x64/Xor.go similarity index 92% rename from src/build/arch/x64/Xor.go rename to src/arch/x64/Xor.go index 305dce2..8a469eb 100644 --- a/src/build/arch/x64/Xor.go +++ b/src/arch/x64/Xor.go @@ -1,7 +1,7 @@ package x64 import ( - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // XorRegisterNumber performs a bitwise XOR using a register and a number. diff --git a/src/build/arch/x64/encode.go b/src/arch/x64/encode.go similarity index 94% rename from src/build/arch/x64/encode.go rename to src/arch/x64/encode.go index 1f45001..6e872b5 100644 --- a/src/build/arch/x64/encode.go +++ b/src/arch/x64/encode.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // encode is the core function that encodes an instruction. func encode(code []byte, mod AddressMode, reg cpu.Register, rm cpu.Register, numBytes byte, opCodes ...byte) []byte { diff --git a/src/build/arch/x64/encodeNum.go b/src/arch/x64/encodeNum.go similarity index 86% rename from src/build/arch/x64/encodeNum.go rename to src/arch/x64/encodeNum.go index a9a3313..c6db324 100644 --- a/src/build/arch/x64/encodeNum.go +++ b/src/arch/x64/encodeNum.go @@ -3,8 +3,8 @@ package x64 import ( "encoding/binary" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/sizeof" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/sizeof" ) // encodeNum encodes an instruction with up to two registers and a number parameter. diff --git a/src/build/arch/x64/memoryAccess.go b/src/arch/x64/memoryAccess.go similarity index 93% rename from src/build/arch/x64/memoryAccess.go rename to src/arch/x64/memoryAccess.go index b8cafa5..1ff2bca 100644 --- a/src/build/arch/x64/memoryAccess.go +++ b/src/arch/x64/memoryAccess.go @@ -1,6 +1,6 @@ package x64 -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // memoryAccess encodes a memory access. func memoryAccess(code []byte, opCode8 byte, opCode32 byte, register cpu.Register, offset byte, numBytes byte, source cpu.Register) []byte { diff --git a/src/build/arch/x64/x64_test.go b/src/arch/x64/x64_test.go similarity index 92% rename from src/build/arch/x64/x64_test.go rename to src/arch/x64/x64_test.go index cdde6cf..0ed00d5 100644 --- a/src/build/arch/x64/x64_test.go +++ b/src/arch/x64/x64_test.go @@ -3,7 +3,7 @@ package x64_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/arch/x64" + "git.akyoto.dev/cli/q/src/arch/x64" "git.akyoto.dev/go/assert" ) diff --git a/src/build/asm/Assembler.go b/src/asm/Assembler.go similarity index 93% rename from src/build/asm/Assembler.go rename to src/asm/Assembler.go index 4a595cf..c5c9b8d 100644 --- a/src/build/asm/Assembler.go +++ b/src/asm/Assembler.go @@ -3,7 +3,7 @@ package asm import ( "maps" - "git.akyoto.dev/cli/q/src/build/data" + "git.akyoto.dev/cli/q/src/data" ) // Assembler contains a list of instructions. diff --git a/src/build/asm/Finalize.go b/src/asm/Finalize.go similarity index 98% rename from src/build/asm/Finalize.go rename to src/asm/Finalize.go index 093e060..446048a 100644 --- a/src/build/asm/Finalize.go +++ b/src/asm/Finalize.go @@ -6,10 +6,10 @@ import ( "slices" "strings" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/config" - "git.akyoto.dev/cli/q/src/build/elf" - "git.akyoto.dev/cli/q/src/build/sizeof" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/config" + "git.akyoto.dev/cli/q/src/elf" + "git.akyoto.dev/cli/q/src/sizeof" ) // Finalize generates the final machine code. diff --git a/src/build/asm/Instruction.go b/src/asm/Instruction.go similarity index 100% rename from src/build/asm/Instruction.go rename to src/asm/Instruction.go diff --git a/src/build/asm/Instructions.go b/src/asm/Instructions.go similarity index 100% rename from src/build/asm/Instructions.go rename to src/asm/Instructions.go diff --git a/src/build/asm/Label.go b/src/asm/Label.go similarity index 100% rename from src/build/asm/Label.go rename to src/asm/Label.go diff --git a/src/build/asm/Memory.go b/src/asm/Memory.go similarity index 65% rename from src/build/asm/Memory.go rename to src/asm/Memory.go index ef209ec..3e98a71 100644 --- a/src/build/asm/Memory.go +++ b/src/asm/Memory.go @@ -1,6 +1,6 @@ package asm -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" type Memory struct { Base cpu.Register diff --git a/src/build/asm/MemoryNumber.go b/src/asm/MemoryNumber.go similarity index 100% rename from src/build/asm/MemoryNumber.go rename to src/asm/MemoryNumber.go diff --git a/src/build/asm/MemoryRegister.go b/src/asm/MemoryRegister.go similarity index 94% rename from src/build/asm/MemoryRegister.go rename to src/asm/MemoryRegister.go index 927a97c..21232ce 100644 --- a/src/build/asm/MemoryRegister.go +++ b/src/asm/MemoryRegister.go @@ -3,7 +3,7 @@ package asm import ( "fmt" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // MemoryRegister operates with a memory address and a number. diff --git a/src/build/asm/Mnemonic.go b/src/asm/Mnemonic.go similarity index 100% rename from src/build/asm/Mnemonic.go rename to src/asm/Mnemonic.go diff --git a/src/build/asm/Optimizer.go b/src/asm/Optimizer.go similarity index 93% rename from src/build/asm/Optimizer.go rename to src/asm/Optimizer.go index 2ef72ae..7bf6b99 100644 --- a/src/build/asm/Optimizer.go +++ b/src/asm/Optimizer.go @@ -1,6 +1,6 @@ package asm -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // unnecessary returns true if the register/register operation can be skipped. func (a *Assembler) unnecessary(mnemonic Mnemonic, left cpu.Register, right cpu.Register) bool { diff --git a/src/build/asm/Pointer.go b/src/asm/Pointer.go similarity index 100% rename from src/build/asm/Pointer.go rename to src/asm/Pointer.go diff --git a/src/build/asm/Register.go b/src/asm/Register.go similarity index 92% rename from src/build/asm/Register.go rename to src/asm/Register.go index 0f737c9..7188752 100644 --- a/src/build/asm/Register.go +++ b/src/asm/Register.go @@ -1,7 +1,7 @@ package asm import ( - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // Register operates with a single register. diff --git a/src/build/asm/RegisterLabel.go b/src/asm/RegisterLabel.go similarity index 94% rename from src/build/asm/RegisterLabel.go rename to src/asm/RegisterLabel.go index f51bf77..8092d9f 100644 --- a/src/build/asm/RegisterLabel.go +++ b/src/asm/RegisterLabel.go @@ -3,7 +3,7 @@ package asm import ( "fmt" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // RegisterLabel operates with a register and a label. diff --git a/src/build/asm/RegisterNumber.go b/src/asm/RegisterNumber.go similarity index 94% rename from src/build/asm/RegisterNumber.go rename to src/asm/RegisterNumber.go index b3bcb9e..6addf74 100644 --- a/src/build/asm/RegisterNumber.go +++ b/src/asm/RegisterNumber.go @@ -3,7 +3,7 @@ package asm import ( "fmt" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // RegisterNumber operates with a register and a number. diff --git a/src/build/asm/RegisterRegister.go b/src/asm/RegisterRegister.go similarity index 94% rename from src/build/asm/RegisterRegister.go rename to src/asm/RegisterRegister.go index 584058d..8631fd6 100644 --- a/src/build/asm/RegisterRegister.go +++ b/src/asm/RegisterRegister.go @@ -3,7 +3,7 @@ package asm import ( "fmt" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // RegisterRegister operates with two registers. diff --git a/src/build/ast/AST.go b/src/ast/AST.go similarity index 100% rename from src/build/ast/AST.go rename to src/ast/AST.go diff --git a/src/build/ast/Assert.go b/src/ast/Assert.go similarity index 78% rename from src/build/ast/Assert.go rename to src/ast/Assert.go index 0f537db..6da47fb 100644 --- a/src/build/ast/Assert.go +++ b/src/ast/Assert.go @@ -1,7 +1,7 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/expression" ) // Assert represents a condition that must be true, otherwise the program stops. diff --git a/src/build/ast/Assign.go b/src/ast/Assign.go similarity index 78% rename from src/build/ast/Assign.go rename to src/ast/Assign.go index 161f968..8bdbe99 100644 --- a/src/build/ast/Assign.go +++ b/src/ast/Assign.go @@ -1,7 +1,7 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/expression" ) // Assign represents an assignment to an existing variable or memory location. diff --git a/src/build/ast/Call.go b/src/ast/Call.go similarity index 67% rename from src/build/ast/Call.go rename to src/ast/Call.go index 6bd7dec..8aa683e 100644 --- a/src/build/ast/Call.go +++ b/src/ast/Call.go @@ -1,6 +1,6 @@ package ast -import "git.akyoto.dev/cli/q/src/build/expression" +import "git.akyoto.dev/cli/q/src/expression" // Call represents a function call. type Call struct { diff --git a/src/build/ast/Count.go b/src/ast/Count.go similarity index 95% rename from src/build/ast/Count.go rename to src/ast/Count.go index 2c61203..2c9f1f7 100644 --- a/src/build/ast/Count.go +++ b/src/ast/Count.go @@ -1,6 +1,6 @@ package ast -import "git.akyoto.dev/cli/q/src/build/token" +import "git.akyoto.dev/cli/q/src/token" // Count counts how often the given token appears in the AST. func Count(body AST, buffer []byte, kind token.Kind, name string) uint8 { diff --git a/src/build/ast/Define.go b/src/ast/Define.go similarity index 73% rename from src/build/ast/Define.go rename to src/ast/Define.go index 551c9b7..0b8030c 100644 --- a/src/build/ast/Define.go +++ b/src/ast/Define.go @@ -1,7 +1,7 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/expression" ) // Define represents a variable definition. diff --git a/src/build/ast/EachInstruction.go b/src/ast/EachInstruction.go similarity index 95% rename from src/build/ast/EachInstruction.go rename to src/ast/EachInstruction.go index 927cca6..b1a354f 100644 --- a/src/build/ast/EachInstruction.go +++ b/src/ast/EachInstruction.go @@ -1,6 +1,6 @@ package ast -import "git.akyoto.dev/cli/q/src/build/token" +import "git.akyoto.dev/cli/q/src/token" // EachInstruction calls the function on each instruction. func EachInstruction(body token.List, call func(token.List) error) error { diff --git a/src/build/ast/If.go b/src/ast/If.go similarity index 75% rename from src/build/ast/If.go rename to src/ast/If.go index f99307f..079640d 100644 --- a/src/build/ast/If.go +++ b/src/ast/If.go @@ -1,7 +1,7 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/expression" ) // If represents an if statement. diff --git a/src/build/ast/Loop.go b/src/ast/Loop.go similarity index 100% rename from src/build/ast/Loop.go rename to src/ast/Loop.go diff --git a/src/build/ast/Parse.go b/src/ast/Parse.go similarity index 91% rename from src/build/ast/Parse.go rename to src/ast/Parse.go index 582f497..8b9083e 100644 --- a/src/build/ast/Parse.go +++ b/src/ast/Parse.go @@ -1,8 +1,8 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // Parse generates an AST from a list of tokens. diff --git a/src/build/ast/Return.go b/src/ast/Return.go similarity index 73% rename from src/build/ast/Return.go rename to src/ast/Return.go index 6c8aa2d..8815638 100644 --- a/src/build/ast/Return.go +++ b/src/ast/Return.go @@ -1,7 +1,7 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/expression" ) // Return represents a return statement. diff --git a/src/build/ast/Switch.go b/src/ast/Switch.go similarity index 82% rename from src/build/ast/Switch.go rename to src/ast/Switch.go index 80ff3d3..a5fc6a0 100644 --- a/src/build/ast/Switch.go +++ b/src/ast/Switch.go @@ -1,7 +1,7 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/expression" ) // Switch represents a switch statement. diff --git a/src/build/ast/parseKeyword.go b/src/ast/parseKeyword.go similarity index 95% rename from src/build/ast/parseKeyword.go rename to src/ast/parseKeyword.go index f4a948a..32c2bbd 100644 --- a/src/build/ast/parseKeyword.go +++ b/src/ast/parseKeyword.go @@ -1,9 +1,9 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // parseKeyword generates a keyword node from an instruction. diff --git a/src/build/ast/parseNode.go b/src/ast/parseNode.go similarity index 87% rename from src/build/ast/parseNode.go rename to src/ast/parseNode.go index 8473c29..93fada4 100644 --- a/src/build/ast/parseNode.go +++ b/src/ast/parseNode.go @@ -1,9 +1,9 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // parseNode generates an AST node from an instruction. diff --git a/src/build/ast/parseSwitch.go b/src/ast/parseSwitch.go similarity index 89% rename from src/build/ast/parseSwitch.go rename to src/ast/parseSwitch.go index 752405a..65eb712 100644 --- a/src/build/ast/parseSwitch.go +++ b/src/ast/parseSwitch.go @@ -1,8 +1,8 @@ package ast import ( - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // parseSwitch generates the cases inside a switch statement. diff --git a/src/build/Build.go b/src/build/Build.go index 7f407ce..2e740c6 100644 --- a/src/build/Build.go +++ b/src/build/Build.go @@ -4,8 +4,8 @@ import ( "path/filepath" "strings" - "git.akyoto.dev/cli/q/src/build/compiler" - "git.akyoto.dev/cli/q/src/build/scanner" + "git.akyoto.dev/cli/q/src/compiler" + "git.akyoto.dev/cli/q/src/scanner" ) // Build describes a compiler build. diff --git a/src/build/expression/List.go b/src/build/expression/List.go deleted file mode 100644 index 75c44d0..0000000 --- a/src/build/expression/List.go +++ /dev/null @@ -1,55 +0,0 @@ -package expression - -import ( - "git.akyoto.dev/cli/q/src/build/token" -) - -// NewList generates a list of expressions from comma separated parameters. -func NewList(tokens token.List) []*Expression { - var list []*Expression - - EachParameter(tokens, func(parameter token.List) error { - expression := Parse(parameter) - list = append(list, expression) - return nil - }) - - return list -} - -// EachParameter calls the callback function on each parameter in a comma separated list. -func EachParameter(tokens token.List, call func(token.List) error) error { - start := 0 - groupLevel := 0 - - for i, t := range tokens { - switch t.Kind { - case token.GroupStart, token.ArrayStart, token.BlockStart: - groupLevel++ - - case token.GroupEnd, token.ArrayEnd, token.BlockEnd: - groupLevel-- - - case token.Separator: - if groupLevel > 0 { - continue - } - - parameter := tokens[start:i] - err := call(parameter) - - if err != nil { - return err - } - - start = i + 1 - } - } - - if start != len(tokens) { - parameter := tokens[start:] - return call(parameter) - } - - return nil -} diff --git a/src/build/token/List_test.go b/src/build/token/List_test.go deleted file mode 100644 index b4529f1..0000000 --- a/src/build/token/List_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package token_test - -import ( - "testing" - - "git.akyoto.dev/cli/q/src/build/token" - "git.akyoto.dev/go/assert" -) - -func TestIndexKind(t *testing.T) { - tokens := token.Tokenize([]byte("a{{}}")) - assert.Equal(t, tokens.IndexKind(token.NewLine), -1) - assert.Equal(t, tokens.LastIndexKind(token.NewLine), -1) - assert.Equal(t, tokens.IndexKind(token.BlockStart), 1) - assert.Equal(t, tokens.LastIndexKind(token.BlockStart), 2) - assert.Equal(t, tokens.IndexKind(token.BlockEnd), 3) - assert.Equal(t, tokens.LastIndexKind(token.BlockEnd), 4) -} diff --git a/src/cli/Build.go b/src/cli/Build.go index ba79ec6..ea5926e 100644 --- a/src/cli/Build.go +++ b/src/cli/Build.go @@ -6,8 +6,8 @@ import ( "strings" "git.akyoto.dev/cli/q/src/build" - "git.akyoto.dev/cli/q/src/build/config" - "git.akyoto.dev/cli/q/src/build/errors" + "git.akyoto.dev/cli/q/src/config" + "git.akyoto.dev/cli/q/src/errors" ) // Build parses the arguments and creates a build. diff --git a/src/cli/Run.go b/src/cli/Run.go index 7de865b..20b49f6 100644 --- a/src/cli/Run.go +++ b/src/cli/Run.go @@ -5,7 +5,7 @@ import ( "os" "os/exec" - "git.akyoto.dev/cli/q/src/build/errors" + "git.akyoto.dev/cli/q/src/errors" ) // Run builds and runs the executable. diff --git a/src/cli/System.go b/src/cli/System.go index b523d7a..a2a6801 100644 --- a/src/cli/System.go +++ b/src/cli/System.go @@ -5,7 +5,7 @@ import ( "runtime" "strconv" - "git.akyoto.dev/cli/q/src/build/config" + "git.akyoto.dev/cli/q/src/config" ) // System shows system information. diff --git a/src/build/compiler/Compile.go b/src/compiler/Compile.go similarity index 94% rename from src/build/compiler/Compile.go rename to src/compiler/Compile.go index 4b31d9a..5d17cd5 100644 --- a/src/build/compiler/Compile.go +++ b/src/compiler/Compile.go @@ -3,9 +3,9 @@ package compiler import ( "sync" - "git.akyoto.dev/cli/q/src/build/core" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/fs" + "git.akyoto.dev/cli/q/src/core" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/fs" ) // Compile waits for the scan to finish and compiles all functions. diff --git a/src/build/compiler/Result.go b/src/compiler/Result.go similarity index 93% rename from src/build/compiler/Result.go rename to src/compiler/Result.go index d9e699a..ca51ba1 100644 --- a/src/build/compiler/Result.go +++ b/src/compiler/Result.go @@ -5,11 +5,11 @@ import ( "io" "os" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/core" - "git.akyoto.dev/cli/q/src/build/elf" - "git.akyoto.dev/cli/q/src/build/os/linux" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/core" + "git.akyoto.dev/cli/q/src/elf" + "git.akyoto.dev/cli/q/src/os/linux" ) // Result contains all the compiled functions in a build. diff --git a/src/build/config/config.go b/src/config/config.go similarity index 100% rename from src/build/config/config.go rename to src/config/config.go diff --git a/src/build/config/init.go b/src/config/init.go similarity index 100% rename from src/build/config/init.go rename to src/config/init.go diff --git a/src/build/core/AddBytes.go b/src/core/AddBytes.go similarity index 100% rename from src/build/core/AddBytes.go rename to src/core/AddBytes.go diff --git a/src/build/core/Compare.go b/src/core/Compare.go similarity index 85% rename from src/build/core/Compare.go rename to src/core/Compare.go index c884a82..0244335 100644 --- a/src/build/core/Compare.go +++ b/src/core/Compare.go @@ -1,10 +1,10 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // Compare evaluates a boolean expression. diff --git a/src/build/core/Compile.go b/src/core/Compile.go similarity index 100% rename from src/build/core/Compile.go rename to src/core/Compile.go diff --git a/src/build/core/CompileAST.go b/src/core/CompileAST.go similarity index 86% rename from src/build/core/CompileAST.go rename to src/core/CompileAST.go index a2faba8..a9d54f5 100644 --- a/src/build/core/CompileAST.go +++ b/src/core/CompileAST.go @@ -1,7 +1,7 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/ast" + "git.akyoto.dev/cli/q/src/ast" ) // CompileAST compiles an abstract syntax tree. diff --git a/src/build/core/CompileASTNode.go b/src/core/CompileASTNode.go similarity index 95% rename from src/build/core/CompileASTNode.go rename to src/core/CompileASTNode.go index ddbd05a..e5daa67 100644 --- a/src/build/core/CompileASTNode.go +++ b/src/core/CompileASTNode.go @@ -1,7 +1,7 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/ast" + "git.akyoto.dev/cli/q/src/ast" ) // CompileASTNode compiles a node in the AST. diff --git a/src/build/core/CompileAssert.go b/src/core/CompileAssert.go similarity index 86% rename from src/build/core/CompileAssert.go rename to src/core/CompileAssert.go index f601624..f8608e0 100644 --- a/src/build/core/CompileAssert.go +++ b/src/core/CompileAssert.go @@ -3,8 +3,8 @@ package core import ( "fmt" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/ast" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/ast" ) // CompileAssert compiles an assertion. diff --git a/src/build/core/CompileAssign.go b/src/core/CompileAssign.go similarity index 87% rename from src/build/core/CompileAssign.go rename to src/core/CompileAssign.go index d157792..d048b80 100644 --- a/src/build/core/CompileAssign.go +++ b/src/core/CompileAssign.go @@ -1,9 +1,9 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/token" ) // CompileAssign compiles an assign statement. diff --git a/src/build/core/CompileAssignArray.go b/src/core/CompileAssignArray.go similarity index 86% rename from src/build/core/CompileAssignArray.go rename to src/core/CompileAssignArray.go index 8f812d5..8fb040b 100644 --- a/src/build/core/CompileAssignArray.go +++ b/src/core/CompileAssignArray.go @@ -1,9 +1,9 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/errors" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/errors" ) // CompileAssignArray compiles an assign statement for array elements. diff --git a/src/build/core/CompileAssignDivision.go b/src/core/CompileAssignDivision.go similarity index 87% rename from src/build/core/CompileAssignDivision.go rename to src/core/CompileAssignDivision.go index 9a06c61..7531001 100644 --- a/src/build/core/CompileAssignDivision.go +++ b/src/core/CompileAssignDivision.go @@ -1,10 +1,10 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/errors" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/errors" ) // CompileAssignDivision compiles an assign statement that has quotient and remainder on the left side and division on the right. diff --git a/src/build/core/CompileCall.go b/src/core/CompileCall.go similarity index 95% rename from src/build/core/CompileCall.go rename to src/core/CompileCall.go index 16c14f2..5036f1f 100644 --- a/src/build/core/CompileCall.go +++ b/src/core/CompileCall.go @@ -3,9 +3,9 @@ package core import ( "strings" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/expression" ) // CompileCall executes a function call. diff --git a/src/build/core/CompileCondition.go b/src/core/CompileCondition.go similarity index 95% rename from src/build/core/CompileCondition.go rename to src/core/CompileCondition.go index b43a65f..28b16b9 100644 --- a/src/build/core/CompileCondition.go +++ b/src/core/CompileCondition.go @@ -3,8 +3,8 @@ package core import ( "fmt" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // CompileCondition inserts code to jump to the start label or end label depending on the truth of the condition. diff --git a/src/build/core/CompileDefinition.go b/src/core/CompileDefinition.go similarity index 84% rename from src/build/core/CompileDefinition.go rename to src/core/CompileDefinition.go index 81ea095..90993d9 100644 --- a/src/build/core/CompileDefinition.go +++ b/src/core/CompileDefinition.go @@ -1,11 +1,11 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/types" ) // CompileDefinition compiles a variable definition. diff --git a/src/build/core/CompileIf.go b/src/core/CompileIf.go similarity index 92% rename from src/build/core/CompileIf.go rename to src/core/CompileIf.go index ec15dcb..e7ce92c 100644 --- a/src/build/core/CompileIf.go +++ b/src/core/CompileIf.go @@ -3,8 +3,8 @@ package core import ( "fmt" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/ast" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/ast" ) // CompileIf compiles a branch instruction. diff --git a/src/build/core/CompileLoop.go b/src/core/CompileLoop.go similarity index 85% rename from src/build/core/CompileLoop.go rename to src/core/CompileLoop.go index 83b8c1a..f2ef623 100644 --- a/src/build/core/CompileLoop.go +++ b/src/core/CompileLoop.go @@ -3,8 +3,8 @@ package core import ( "fmt" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/ast" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/ast" ) // CompileLoop compiles a loop instruction. diff --git a/src/build/core/CompileReturn.go b/src/core/CompileReturn.go similarity index 84% rename from src/build/core/CompileReturn.go rename to src/core/CompileReturn.go index e15bc22..754b4b8 100644 --- a/src/build/core/CompileReturn.go +++ b/src/core/CompileReturn.go @@ -1,9 +1,9 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/types" ) // CompileReturn compiles a return instruction. diff --git a/src/build/core/CompileSwitch.go b/src/core/CompileSwitch.go similarity index 92% rename from src/build/core/CompileSwitch.go rename to src/core/CompileSwitch.go index 7d0e0f3..7a08153 100644 --- a/src/build/core/CompileSwitch.go +++ b/src/core/CompileSwitch.go @@ -3,8 +3,8 @@ package core import ( "fmt" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/ast" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/ast" ) // CompileSwitch compiles a multi-branch instruction. diff --git a/src/build/core/CompileSyscall.go b/src/core/CompileSyscall.go similarity index 92% rename from src/build/core/CompileSyscall.go rename to src/core/CompileSyscall.go index 63b3a23..cadce36 100644 --- a/src/build/core/CompileSyscall.go +++ b/src/core/CompileSyscall.go @@ -1,7 +1,7 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/expression" ) // CompileSyscall executes a kernel syscall. diff --git a/src/build/core/CompileTokens.go b/src/core/CompileTokens.go similarity index 69% rename from src/build/core/CompileTokens.go rename to src/core/CompileTokens.go index 634c5d7..06bff0f 100644 --- a/src/build/core/CompileTokens.go +++ b/src/core/CompileTokens.go @@ -1,9 +1,9 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/token" ) // CompileTokens compiles a token list. diff --git a/src/build/core/Defer.go b/src/core/Defer.go similarity index 100% rename from src/build/core/Defer.go rename to src/core/Defer.go diff --git a/src/build/core/Define.go b/src/core/Define.go similarity index 78% rename from src/build/core/Define.go rename to src/core/Define.go index 0867f1b..ecd4178 100644 --- a/src/build/core/Define.go +++ b/src/core/Define.go @@ -1,10 +1,10 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/scope" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/scope" + "git.akyoto.dev/cli/q/src/token" ) // Define defines a new variable. diff --git a/src/build/core/Evaluate.go b/src/core/Evaluate.go similarity index 77% rename from src/build/core/Evaluate.go rename to src/core/Evaluate.go index 145f3b1..ed23b7d 100644 --- a/src/build/core/Evaluate.go +++ b/src/core/Evaluate.go @@ -1,10 +1,10 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" + "git.akyoto.dev/cli/q/src/types" ) // Evaluate evaluates an expression and returns a register that contains the value of the expression. diff --git a/src/build/core/Execute.go b/src/core/Execute.go similarity index 80% rename from src/build/core/Execute.go rename to src/core/Execute.go index e4b7010..74132b8 100644 --- a/src/build/core/Execute.go +++ b/src/core/Execute.go @@ -1,10 +1,10 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // Execute executes an operation on a register with a value operand. diff --git a/src/build/core/ExecuteLeaf.go b/src/core/ExecuteLeaf.go similarity index 88% rename from src/build/core/ExecuteLeaf.go rename to src/core/ExecuteLeaf.go index 2254a8a..45cbe23 100644 --- a/src/build/core/ExecuteLeaf.go +++ b/src/core/ExecuteLeaf.go @@ -1,9 +1,9 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/token" ) // ExecuteLeaf performs an operation on a register with the given leaf operand. diff --git a/src/build/core/ExecuteRegister.go b/src/core/ExecuteRegister.go similarity index 71% rename from src/build/core/ExecuteRegister.go rename to src/core/ExecuteRegister.go index 6627acf..8a48bd5 100644 --- a/src/build/core/ExecuteRegister.go +++ b/src/core/ExecuteRegister.go @@ -1,10 +1,10 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/token" ) // ExecuteRegister performs an operation on a single register. diff --git a/src/build/core/ExecuteRegisterNumber.go b/src/core/ExecuteRegisterNumber.go similarity index 89% rename from src/build/core/ExecuteRegisterNumber.go rename to src/core/ExecuteRegisterNumber.go index 63a45f6..e3cfda4 100644 --- a/src/build/core/ExecuteRegisterNumber.go +++ b/src/core/ExecuteRegisterNumber.go @@ -1,11 +1,11 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/token" ) // ExecuteRegisterNumber performs an operation on a register and a number. diff --git a/src/build/core/ExecuteRegisterRegister.go b/src/core/ExecuteRegisterRegister.go similarity index 88% rename from src/build/core/ExecuteRegisterRegister.go rename to src/core/ExecuteRegisterRegister.go index 42363ae..738ed9c 100644 --- a/src/build/core/ExecuteRegisterRegister.go +++ b/src/core/ExecuteRegisterRegister.go @@ -1,11 +1,11 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/token" ) // ExecuteRegisterRegister performs an operation on two registers. diff --git a/src/build/core/ExpressionToMemory.go b/src/core/ExpressionToMemory.go similarity index 80% rename from src/build/core/ExpressionToMemory.go rename to src/core/ExpressionToMemory.go index 204e17d..f39e734 100644 --- a/src/build/core/ExpressionToMemory.go +++ b/src/core/ExpressionToMemory.go @@ -1,11 +1,11 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/sizeof" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/sizeof" + "git.akyoto.dev/cli/q/src/types" ) // ExpressionToMemory puts the result of an expression into the specified memory address. diff --git a/src/build/core/ExpressionToRegister.go b/src/core/ExpressionToRegister.go similarity index 87% rename from src/build/core/ExpressionToRegister.go rename to src/core/ExpressionToRegister.go index 7d7d834..8b4fa20 100644 --- a/src/build/core/ExpressionToRegister.go +++ b/src/core/ExpressionToRegister.go @@ -1,13 +1,13 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" + "git.akyoto.dev/cli/q/src/types" ) // ExpressionToRegister puts the result of an expression into the specified register. diff --git a/src/build/core/ExpressionsToRegisters.go b/src/core/ExpressionsToRegisters.go similarity index 82% rename from src/build/core/ExpressionsToRegisters.go rename to src/core/ExpressionsToRegisters.go index 982701a..4f2dbed 100644 --- a/src/build/core/ExpressionsToRegisters.go +++ b/src/core/ExpressionsToRegisters.go @@ -1,8 +1,8 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/expression" ) // ExpressionsToRegisters moves multiple expressions into the specified registers. diff --git a/src/build/core/Fold.go b/src/core/Fold.go similarity index 89% rename from src/build/core/Fold.go rename to src/core/Fold.go index 11b6d59..983d42f 100644 --- a/src/build/core/Fold.go +++ b/src/core/Fold.go @@ -1,9 +1,9 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/config" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/config" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) // Fold will try to precalculate the results of operations with constants. diff --git a/src/build/core/Function.go b/src/core/Function.go similarity index 75% rename from src/build/core/Function.go rename to src/core/Function.go index 5f8c25c..4ff2c4d 100644 --- a/src/build/core/Function.go +++ b/src/core/Function.go @@ -1,11 +1,11 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/fs" - "git.akyoto.dev/cli/q/src/build/register" - "git.akyoto.dev/cli/q/src/build/scope" - "git.akyoto.dev/cli/q/src/build/token" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/fs" + "git.akyoto.dev/cli/q/src/register" + "git.akyoto.dev/cli/q/src/scope" + "git.akyoto.dev/cli/q/src/token" + "git.akyoto.dev/cli/q/src/types" ) // Function represents the smallest unit of code. diff --git a/src/build/core/IdentifierExists.go b/src/core/IdentifierExists.go similarity index 100% rename from src/build/core/IdentifierExists.go rename to src/core/IdentifierExists.go diff --git a/src/build/core/JumpIfFalse.go b/src/core/JumpIfFalse.go similarity index 85% rename from src/build/core/JumpIfFalse.go rename to src/core/JumpIfFalse.go index 042a676..44eb1ba 100644 --- a/src/build/core/JumpIfFalse.go +++ b/src/core/JumpIfFalse.go @@ -1,8 +1,8 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/token" ) // JumpIfFalse jumps to the label if the previous comparison was false. diff --git a/src/build/core/JumpIfTrue.go b/src/core/JumpIfTrue.go similarity index 85% rename from src/build/core/JumpIfTrue.go rename to src/core/JumpIfTrue.go index 059618e..c8dc487 100644 --- a/src/build/core/JumpIfTrue.go +++ b/src/core/JumpIfTrue.go @@ -1,8 +1,8 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/token" ) // JumpIfTrue jumps to the label if the previous comparison was true. diff --git a/src/build/core/NewFunction.go b/src/core/NewFunction.go similarity index 72% rename from src/build/core/NewFunction.go rename to src/core/NewFunction.go index 736bf56..0f7bccc 100644 --- a/src/build/core/NewFunction.go +++ b/src/core/NewFunction.go @@ -1,13 +1,13 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/fs" - "git.akyoto.dev/cli/q/src/build/register" - "git.akyoto.dev/cli/q/src/build/scope" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/fs" + "git.akyoto.dev/cli/q/src/register" + "git.akyoto.dev/cli/q/src/scope" + "git.akyoto.dev/cli/q/src/token" ) // NewFunction creates a new function. diff --git a/src/build/core/Number.go b/src/core/Number.go similarity index 92% rename from src/build/core/Number.go rename to src/core/Number.go index 394666f..da39481 100644 --- a/src/build/core/Number.go +++ b/src/core/Number.go @@ -5,8 +5,8 @@ import ( "strings" "unicode/utf8" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/token" ) // Number tries to convert the token into a numeric value. diff --git a/src/build/core/PrintInstructions.go b/src/core/PrintInstructions.go similarity index 97% rename from src/build/core/PrintInstructions.go rename to src/core/PrintInstructions.go index a824f3a..fe47d3a 100644 --- a/src/build/core/PrintInstructions.go +++ b/src/core/PrintInstructions.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" - "git.akyoto.dev/cli/q/src/build/asm" + "git.akyoto.dev/cli/q/src/asm" "git.akyoto.dev/go/color/ansi" ) diff --git a/src/build/core/String.go b/src/core/String.go similarity index 100% rename from src/build/core/String.go rename to src/core/String.go diff --git a/src/build/core/TokenToRegister.go b/src/core/TokenToRegister.go similarity index 84% rename from src/build/core/TokenToRegister.go rename to src/core/TokenToRegister.go index 1d3df22..d33c1a7 100644 --- a/src/build/core/TokenToRegister.go +++ b/src/core/TokenToRegister.go @@ -1,11 +1,11 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/token" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/token" + "git.akyoto.dev/cli/q/src/types" ) // TokenToRegister moves a token into a register. diff --git a/src/build/core/UsesRegister.go b/src/core/UsesRegister.go similarity index 84% rename from src/build/core/UsesRegister.go rename to src/core/UsesRegister.go index 8ae4076..0ad2d90 100644 --- a/src/build/core/UsesRegister.go +++ b/src/core/UsesRegister.go @@ -1,9 +1,9 @@ package core import ( - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/expression" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/expression" ) // UsesRegister returns true if evaluating the expression would write or read the given register. diff --git a/src/build/cpu/CPU.go b/src/cpu/CPU.go similarity index 100% rename from src/build/cpu/CPU.go rename to src/cpu/CPU.go diff --git a/src/build/cpu/Register.go b/src/cpu/Register.go similarity index 100% rename from src/build/cpu/Register.go rename to src/cpu/Register.go diff --git a/src/build/cpu/Register_test.go b/src/cpu/Register_test.go similarity index 82% rename from src/build/cpu/Register_test.go rename to src/cpu/Register_test.go index 8c4c4ce..e14f6f0 100644 --- a/src/build/cpu/Register_test.go +++ b/src/cpu/Register_test.go @@ -3,7 +3,7 @@ package cpu_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/cpu/State.go b/src/cpu/State.go similarity index 100% rename from src/build/cpu/State.go rename to src/cpu/State.go diff --git a/src/build/cpu/State_test.go b/src/cpu/State_test.go similarity index 95% rename from src/build/cpu/State_test.go rename to src/cpu/State_test.go index 90cdab7..52b1fa9 100644 --- a/src/build/cpu/State_test.go +++ b/src/cpu/State_test.go @@ -3,7 +3,7 @@ package cpu_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/go/assert" ) diff --git a/src/build/data/Data.go b/src/data/Data.go similarity index 100% rename from src/build/data/Data.go rename to src/data/Data.go diff --git a/src/build/data/Data_test.go b/src/data/Data_test.go similarity index 94% rename from src/build/data/Data_test.go rename to src/data/Data_test.go index d81faa8..b8d0c60 100644 --- a/src/build/data/Data_test.go +++ b/src/data/Data_test.go @@ -3,7 +3,7 @@ package data_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/data" + "git.akyoto.dev/cli/q/src/data" "git.akyoto.dev/go/assert" ) diff --git a/src/build/elf/ELF.go b/src/elf/ELF.go similarity index 98% rename from src/build/elf/ELF.go rename to src/elf/ELF.go index 1cc8b57..2556d1e 100644 --- a/src/build/elf/ELF.go +++ b/src/elf/ELF.go @@ -5,7 +5,7 @@ import ( "encoding/binary" "io" - "git.akyoto.dev/cli/q/src/build/config" + "git.akyoto.dev/cli/q/src/config" ) // ELF represents an ELF file. diff --git a/src/build/elf/ELF_test.go b/src/elf/ELF_test.go similarity index 77% rename from src/build/elf/ELF_test.go rename to src/elf/ELF_test.go index b609d60..45a9aa2 100644 --- a/src/build/elf/ELF_test.go +++ b/src/elf/ELF_test.go @@ -4,7 +4,7 @@ import ( "io" "testing" - "git.akyoto.dev/cli/q/src/build/elf" + "git.akyoto.dev/cli/q/src/elf" ) func TestELF(t *testing.T) { diff --git a/src/build/elf/Header.go b/src/elf/Header.go similarity index 100% rename from src/build/elf/Header.go rename to src/elf/Header.go diff --git a/src/build/elf/Padding.go b/src/elf/Padding.go similarity index 100% rename from src/build/elf/Padding.go rename to src/elf/Padding.go diff --git a/src/build/elf/ProgramHeader.go b/src/elf/ProgramHeader.go similarity index 100% rename from src/build/elf/ProgramHeader.go rename to src/elf/ProgramHeader.go diff --git a/src/build/elf/SectionHeader.go b/src/elf/SectionHeader.go similarity index 100% rename from src/build/elf/SectionHeader.go rename to src/elf/SectionHeader.go diff --git a/src/build/elf/elf.md b/src/elf/elf.md similarity index 100% rename from src/build/elf/elf.md rename to src/elf/elf.md diff --git a/src/build/errors/Base.go b/src/errors/Base.go similarity index 100% rename from src/build/errors/Base.go rename to src/errors/Base.go diff --git a/src/build/errors/Error.go b/src/errors/Error.go similarity index 94% rename from src/build/errors/Error.go rename to src/errors/Error.go index f0c54ef..d23d7a0 100644 --- a/src/build/errors/Error.go +++ b/src/errors/Error.go @@ -5,8 +5,8 @@ import ( "os" "path/filepath" - "git.akyoto.dev/cli/q/src/build/fs" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/fs" + "git.akyoto.dev/cli/q/src/token" ) // Error is a compiler error at a given line and column. diff --git a/src/build/errors/InvalidCharacter.go b/src/errors/InvalidCharacter.go similarity index 100% rename from src/build/errors/InvalidCharacter.go rename to src/errors/InvalidCharacter.go diff --git a/src/build/errors/InvalidInstruction.go b/src/errors/InvalidInstruction.go similarity index 100% rename from src/build/errors/InvalidInstruction.go rename to src/errors/InvalidInstruction.go diff --git a/src/build/errors/InvalidOperator.go b/src/errors/InvalidOperator.go similarity index 100% rename from src/build/errors/InvalidOperator.go rename to src/errors/InvalidOperator.go diff --git a/src/build/errors/KeywordNotImplemented.go b/src/errors/KeywordNotImplemented.go similarity index 100% rename from src/build/errors/KeywordNotImplemented.go rename to src/errors/KeywordNotImplemented.go diff --git a/src/build/errors/NumberExceedsBounds.go b/src/errors/NumberExceedsBounds.go similarity index 100% rename from src/build/errors/NumberExceedsBounds.go rename to src/errors/NumberExceedsBounds.go diff --git a/src/build/errors/Stack.go b/src/errors/Stack.go similarity index 100% rename from src/build/errors/Stack.go rename to src/errors/Stack.go diff --git a/src/build/errors/TypeMismatch.go b/src/errors/TypeMismatch.go similarity index 100% rename from src/build/errors/TypeMismatch.go rename to src/errors/TypeMismatch.go diff --git a/src/build/errors/UnknownCLIParameter.go b/src/errors/UnknownCLIParameter.go similarity index 100% rename from src/build/errors/UnknownCLIParameter.go rename to src/errors/UnknownCLIParameter.go diff --git a/src/build/errors/UnknownFunction.go b/src/errors/UnknownFunction.go similarity index 100% rename from src/build/errors/UnknownFunction.go rename to src/errors/UnknownFunction.go diff --git a/src/build/errors/UnknownIdentifier.go b/src/errors/UnknownIdentifier.go similarity index 100% rename from src/build/errors/UnknownIdentifier.go rename to src/errors/UnknownIdentifier.go diff --git a/src/build/errors/UnknownPackage.go b/src/errors/UnknownPackage.go similarity index 100% rename from src/build/errors/UnknownPackage.go rename to src/errors/UnknownPackage.go diff --git a/src/build/errors/UnusedImport.go b/src/errors/UnusedImport.go similarity index 100% rename from src/build/errors/UnusedImport.go rename to src/errors/UnusedImport.go diff --git a/src/build/errors/UnusedVariable.go b/src/errors/UnusedVariable.go similarity index 100% rename from src/build/errors/UnusedVariable.go rename to src/errors/UnusedVariable.go diff --git a/src/build/errors/VariableAlreadyExists.go b/src/errors/VariableAlreadyExists.go similarity index 100% rename from src/build/errors/VariableAlreadyExists.go rename to src/errors/VariableAlreadyExists.go diff --git a/src/build/expression/Expression.go b/src/expression/Expression.go similarity index 98% rename from src/build/expression/Expression.go rename to src/expression/Expression.go index 55abb19..2344a37 100644 --- a/src/build/expression/Expression.go +++ b/src/expression/Expression.go @@ -3,7 +3,7 @@ package expression import ( "strings" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/token" ) // Expression is a binary tree with an operator on each node. diff --git a/src/build/expression/Expression_test.go b/src/expression/Expression_test.go similarity index 91% rename from src/build/expression/Expression_test.go rename to src/expression/Expression_test.go index ebcc895..1e03ba8 100644 --- a/src/build/expression/Expression_test.go +++ b/src/expression/Expression_test.go @@ -4,8 +4,8 @@ import ( "fmt" "testing" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" "git.akyoto.dev/go/assert" ) @@ -157,28 +157,6 @@ func TestEachLeaf(t *testing.T) { assert.Equal(t, err.Error(), "error") } -func TestEachParameter(t *testing.T) { - src := []byte("1+2,3*4,5*6,7+8") - tokens := token.Tokenize(src) - parameters := []string{} - - err := expression.EachParameter(tokens, func(parameter token.List) error { - expr := expression.Parse(parameter) - parameters = append(parameters, expr.String(src)) - return nil - }) - - assert.Nil(t, err) - assert.DeepEqual(t, parameters, []string{"(+ 1 2)", "(* 3 4)", "(* 5 6)", "(+ 7 8)"}) - - err = expression.EachParameter(tokens, func(parameter token.List) error { - return fmt.Errorf("error") - }) - - assert.NotNil(t, err) - assert.Equal(t, err.Error(), "error") -} - func TestRemoveChild(t *testing.T) { src := []byte("(1+2-3*4)+(5*6-7+8)") tokens := token.Tokenize(src) diff --git a/src/expression/List.go b/src/expression/List.go new file mode 100644 index 0000000..6431451 --- /dev/null +++ b/src/expression/List.go @@ -0,0 +1,18 @@ +package expression + +import ( + "git.akyoto.dev/cli/q/src/token" +) + +// NewList generates a list of expressions from comma separated parameters. +func NewList(tokens token.List) []*Expression { + var list []*Expression + + tokens.Split(func(parameter token.List) error { + expression := Parse(parameter) + list = append(list, expression) + return nil + }) + + return list +} diff --git a/src/build/expression/Operator.go b/src/expression/Operator.go similarity index 98% rename from src/build/expression/Operator.go rename to src/expression/Operator.go index 96431f1..57468da 100644 --- a/src/build/expression/Operator.go +++ b/src/expression/Operator.go @@ -3,7 +3,7 @@ package expression import ( "math" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/token" ) // Operator represents an operator for mathematical expressions. diff --git a/src/build/expression/Parse.go b/src/expression/Parse.go similarity index 98% rename from src/build/expression/Parse.go rename to src/expression/Parse.go index 87e9768..3ed513e 100644 --- a/src/build/expression/Parse.go +++ b/src/expression/Parse.go @@ -3,7 +3,7 @@ package expression import ( "math" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/token" ) // Parse generates an expression tree from tokens. diff --git a/src/build/expression/bench_test.go b/src/expression/bench_test.go similarity index 72% rename from src/build/expression/bench_test.go rename to src/expression/bench_test.go index c447910..c6266c3 100644 --- a/src/build/expression/bench_test.go +++ b/src/expression/bench_test.go @@ -3,8 +3,8 @@ package expression_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" ) func BenchmarkExpression(b *testing.B) { diff --git a/src/build/fs/File.go b/src/fs/File.go similarity index 78% rename from src/build/fs/File.go rename to src/fs/File.go index 205daa1..76a43bb 100644 --- a/src/build/fs/File.go +++ b/src/fs/File.go @@ -1,6 +1,6 @@ package fs -import "git.akyoto.dev/cli/q/src/build/token" +import "git.akyoto.dev/cli/q/src/token" // File represents a single source file. type File struct { diff --git a/src/build/fs/Import.go b/src/fs/Import.go similarity index 77% rename from src/build/fs/Import.go rename to src/fs/Import.go index 6690425..ce9032e 100644 --- a/src/build/fs/Import.go +++ b/src/fs/Import.go @@ -1,6 +1,6 @@ package fs -import "git.akyoto.dev/cli/q/src/build/token" +import "git.akyoto.dev/cli/q/src/token" // Import represents an import statement in a file. type Import struct { diff --git a/src/build/fs/Walk.go b/src/fs/Walk.go similarity index 100% rename from src/build/fs/Walk.go rename to src/fs/Walk.go diff --git a/src/build/fs/Walk_test.go b/src/fs/Walk_test.go similarity index 93% rename from src/build/fs/Walk_test.go rename to src/fs/Walk_test.go index 82651ce..09a0830 100644 --- a/src/build/fs/Walk_test.go +++ b/src/fs/Walk_test.go @@ -3,7 +3,7 @@ package fs_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/fs" + "git.akyoto.dev/cli/q/src/fs" "git.akyoto.dev/go/assert" ) diff --git a/src/build/os/linux/Syscall.go b/src/os/linux/Syscall.go similarity index 100% rename from src/build/os/linux/Syscall.go rename to src/os/linux/Syscall.go diff --git a/src/build/register/AddLabel.go b/src/register/AddLabel.go similarity index 73% rename from src/build/register/AddLabel.go rename to src/register/AddLabel.go index 3189ee0..4667275 100644 --- a/src/build/register/AddLabel.go +++ b/src/register/AddLabel.go @@ -1,6 +1,6 @@ package register -import "git.akyoto.dev/cli/q/src/build/asm" +import "git.akyoto.dev/cli/q/src/asm" func (f *Machine) AddLabel(label string) { f.Assembler.Label(asm.LABEL, label) diff --git a/src/build/register/Call.go b/src/register/Call.go similarity index 100% rename from src/build/register/Call.go rename to src/register/Call.go diff --git a/src/build/register/Comment.go b/src/register/Comment.go similarity index 100% rename from src/build/register/Comment.go rename to src/register/Comment.go diff --git a/src/build/register/FreeRegister.go b/src/register/FreeRegister.go similarity index 76% rename from src/build/register/FreeRegister.go rename to src/register/FreeRegister.go index 5c459b7..4fd016e 100644 --- a/src/build/register/FreeRegister.go +++ b/src/register/FreeRegister.go @@ -1,6 +1,6 @@ package register -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // FreeRegister frees a register. func (f *Machine) FreeRegister(register cpu.Register) { diff --git a/src/build/register/Jump.go b/src/register/Jump.go similarity index 76% rename from src/build/register/Jump.go rename to src/register/Jump.go index ff77d01..98045fd 100644 --- a/src/build/register/Jump.go +++ b/src/register/Jump.go @@ -1,6 +1,6 @@ package register -import "git.akyoto.dev/cli/q/src/build/asm" +import "git.akyoto.dev/cli/q/src/asm" func (f *Machine) Jump(mnemonic asm.Mnemonic, label string) { f.Assembler.Label(mnemonic, label) diff --git a/src/build/register/Machine.go b/src/register/Machine.go similarity index 62% rename from src/build/register/Machine.go rename to src/register/Machine.go index 50a22b7..07f64b2 100644 --- a/src/build/register/Machine.go +++ b/src/register/Machine.go @@ -1,9 +1,9 @@ package register import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/scope" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/scope" ) // Machine is a register usage aware assembler. diff --git a/src/build/register/MemoryNumber.go b/src/register/MemoryNumber.go similarity index 78% rename from src/build/register/MemoryNumber.go rename to src/register/MemoryNumber.go index 6e99fda..2c1177f 100644 --- a/src/build/register/MemoryNumber.go +++ b/src/register/MemoryNumber.go @@ -1,6 +1,6 @@ package register -import "git.akyoto.dev/cli/q/src/build/asm" +import "git.akyoto.dev/cli/q/src/asm" func (f *Machine) MemoryNumber(mnemonic asm.Mnemonic, a asm.Memory, b int) { f.Assembler.MemoryNumber(mnemonic, a, b) diff --git a/src/build/register/MemoryRegister.go b/src/register/MemoryRegister.go similarity index 70% rename from src/build/register/MemoryRegister.go rename to src/register/MemoryRegister.go index 6ad3bc0..1a3c770 100644 --- a/src/build/register/MemoryRegister.go +++ b/src/register/MemoryRegister.go @@ -1,8 +1,8 @@ package register import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" ) func (f *Machine) MemoryRegister(mnemonic asm.Mnemonic, a asm.Memory, b cpu.Register) { diff --git a/src/build/register/NewRegister.go b/src/register/NewRegister.go similarity index 83% rename from src/build/register/NewRegister.go rename to src/register/NewRegister.go index fb2300c..dbe3cc0 100644 --- a/src/build/register/NewRegister.go +++ b/src/register/NewRegister.go @@ -1,6 +1,6 @@ package register -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // NewRegister reserves a register. func (f *Machine) NewRegister() cpu.Register { diff --git a/src/build/register/Register.go b/src/register/Register.go similarity index 73% rename from src/build/register/Register.go rename to src/register/Register.go index 89f0ca1..fa972a1 100644 --- a/src/build/register/Register.go +++ b/src/register/Register.go @@ -1,8 +1,8 @@ package register import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" ) func (f *Machine) Register(mnemonic asm.Mnemonic, a cpu.Register) { diff --git a/src/build/register/RegisterIsUsed.go b/src/register/RegisterIsUsed.go similarity index 78% rename from src/build/register/RegisterIsUsed.go rename to src/register/RegisterIsUsed.go index 0ba6d0e..fedf149 100644 --- a/src/build/register/RegisterIsUsed.go +++ b/src/register/RegisterIsUsed.go @@ -1,6 +1,6 @@ package register -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // RegisterIsUsed reserves a register. func (f *Machine) RegisterIsUsed(register cpu.Register) bool { diff --git a/src/build/register/RegisterLabel.go b/src/register/RegisterLabel.go similarity index 77% rename from src/build/register/RegisterLabel.go rename to src/register/RegisterLabel.go index 70690bc..a97de41 100644 --- a/src/build/register/RegisterLabel.go +++ b/src/register/RegisterLabel.go @@ -1,8 +1,8 @@ package register import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" ) func (f *Machine) RegisterLabel(mnemonic asm.Mnemonic, register cpu.Register, label string) { diff --git a/src/build/register/RegisterNumber.go b/src/register/RegisterNumber.go similarity index 86% rename from src/build/register/RegisterNumber.go rename to src/register/RegisterNumber.go index 32b552b..a97dd8b 100644 --- a/src/build/register/RegisterNumber.go +++ b/src/register/RegisterNumber.go @@ -1,9 +1,9 @@ package register import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/sizeof" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/sizeof" ) func (f *Machine) RegisterNumber(mnemonic asm.Mnemonic, a cpu.Register, b int) { diff --git a/src/build/register/RegisterRegister.go b/src/register/RegisterRegister.go similarity index 79% rename from src/build/register/RegisterRegister.go rename to src/register/RegisterRegister.go index 5f87783..98ac5ea 100644 --- a/src/build/register/RegisterRegister.go +++ b/src/register/RegisterRegister.go @@ -1,8 +1,8 @@ package register import ( - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" ) func (f *Machine) RegisterRegister(mnemonic asm.Mnemonic, a cpu.Register, b cpu.Register) { diff --git a/src/build/register/Return.go b/src/register/Return.go similarity index 100% rename from src/build/register/Return.go rename to src/register/Return.go diff --git a/src/build/register/SaveRegister.go b/src/register/SaveRegister.go similarity index 87% rename from src/build/register/SaveRegister.go rename to src/register/SaveRegister.go index 18dfb76..c5a56c9 100644 --- a/src/build/register/SaveRegister.go +++ b/src/register/SaveRegister.go @@ -3,8 +3,8 @@ package register import ( "slices" - "git.akyoto.dev/cli/q/src/build/asm" - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/asm" + "git.akyoto.dev/cli/q/src/cpu" ) // SaveRegister attempts to move a variable occupying this register to another register. diff --git a/src/build/register/Syscall.go b/src/register/Syscall.go similarity index 100% rename from src/build/register/Syscall.go rename to src/register/Syscall.go diff --git a/src/build/register/UseRegister.go b/src/register/UseRegister.go similarity index 78% rename from src/build/register/UseRegister.go rename to src/register/UseRegister.go index ce45d81..996181f 100644 --- a/src/build/register/UseRegister.go +++ b/src/register/UseRegister.go @@ -1,6 +1,6 @@ package register -import "git.akyoto.dev/cli/q/src/build/cpu" +import "git.akyoto.dev/cli/q/src/cpu" // Use marks a register to be currently in use. func (f *Machine) UseRegister(register cpu.Register) { diff --git a/src/build/register/postInstruction.go b/src/register/postInstruction.go similarity index 77% rename from src/build/register/postInstruction.go rename to src/register/postInstruction.go index d3e2b5d..18f9120 100644 --- a/src/build/register/postInstruction.go +++ b/src/register/postInstruction.go @@ -1,6 +1,6 @@ package register -import "git.akyoto.dev/cli/q/src/build/config" +import "git.akyoto.dev/cli/q/src/config" func (f *Machine) postInstruction() { if !config.Assembler { diff --git a/src/build/scanner/Scan.go b/src/scanner/Scan.go similarity index 86% rename from src/build/scanner/Scan.go rename to src/scanner/Scan.go index 4b25a3d..f18cbff 100644 --- a/src/build/scanner/Scan.go +++ b/src/scanner/Scan.go @@ -1,8 +1,8 @@ package scanner import ( - "git.akyoto.dev/cli/q/src/build/core" - "git.akyoto.dev/cli/q/src/build/fs" + "git.akyoto.dev/cli/q/src/core" + "git.akyoto.dev/cli/q/src/fs" ) // Scan scans the list of files. diff --git a/src/build/scanner/Scanner.go b/src/scanner/Scanner.go similarity index 77% rename from src/build/scanner/Scanner.go rename to src/scanner/Scanner.go index 5e6b0c2..434fe30 100644 --- a/src/build/scanner/Scanner.go +++ b/src/scanner/Scanner.go @@ -3,8 +3,8 @@ package scanner import ( "sync" - "git.akyoto.dev/cli/q/src/build/core" - "git.akyoto.dev/cli/q/src/build/fs" + "git.akyoto.dev/cli/q/src/core" + "git.akyoto.dev/cli/q/src/fs" ) // Scanner is used to scan files before the actual compilation step. diff --git a/src/build/scanner/queue.go b/src/scanner/queue.go similarity index 100% rename from src/build/scanner/queue.go rename to src/scanner/queue.go diff --git a/src/build/scanner/queueDirectory.go b/src/scanner/queueDirectory.go similarity index 92% rename from src/build/scanner/queueDirectory.go rename to src/scanner/queueDirectory.go index d21c8ce..167905b 100644 --- a/src/build/scanner/queueDirectory.go +++ b/src/scanner/queueDirectory.go @@ -4,7 +4,7 @@ import ( "path/filepath" "strings" - "git.akyoto.dev/cli/q/src/build/fs" + "git.akyoto.dev/cli/q/src/fs" ) // queueDirectory queues an entire directory to be scanned. diff --git a/src/build/scanner/queueFile.go b/src/scanner/queueFile.go similarity index 100% rename from src/build/scanner/queueFile.go rename to src/scanner/queueFile.go diff --git a/src/build/scanner/scanFile.go b/src/scanner/scanFile.go similarity index 92% rename from src/build/scanner/scanFile.go rename to src/scanner/scanFile.go index 714ba72..46f25ff 100644 --- a/src/build/scanner/scanFile.go +++ b/src/scanner/scanFile.go @@ -4,15 +4,14 @@ import ( "os" "path/filepath" - "git.akyoto.dev/cli/q/src/build/arch/x64" - "git.akyoto.dev/cli/q/src/build/config" - "git.akyoto.dev/cli/q/src/build/core" - "git.akyoto.dev/cli/q/src/build/errors" - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/fs" - "git.akyoto.dev/cli/q/src/build/scope" - "git.akyoto.dev/cli/q/src/build/token" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/arch/x64" + "git.akyoto.dev/cli/q/src/config" + "git.akyoto.dev/cli/q/src/core" + "git.akyoto.dev/cli/q/src/errors" + "git.akyoto.dev/cli/q/src/fs" + "git.akyoto.dev/cli/q/src/scope" + "git.akyoto.dev/cli/q/src/token" + "git.akyoto.dev/cli/q/src/types" ) // scanFile scans a single file. @@ -240,7 +239,7 @@ func (s *Scanner) scanFile(path string, pkg string) error { parameters := tokens[paramsStart:paramsEnd] count := 0 - err := expression.EachParameter(parameters, func(tokens token.List) error { + err := parameters.Split(func(tokens token.List) error { if len(tokens) < 2 { return errors.New(errors.MissingType, file, tokens[0].End()) } diff --git a/src/build/scope/Scope.go b/src/scope/Scope.go similarity index 93% rename from src/build/scope/Scope.go rename to src/scope/Scope.go index 9bbb3db..fd1f750 100644 --- a/src/build/scope/Scope.go +++ b/src/scope/Scope.go @@ -1,7 +1,7 @@ package scope import ( - "git.akyoto.dev/cli/q/src/build/cpu" + "git.akyoto.dev/cli/q/src/cpu" ) // Scope represents an independent code block. diff --git a/src/build/scope/Stack.go b/src/scope/Stack.go similarity index 94% rename from src/build/scope/Stack.go rename to src/scope/Stack.go index 750bc4c..dbfe206 100644 --- a/src/build/scope/Stack.go +++ b/src/scope/Stack.go @@ -1,9 +1,9 @@ package scope import ( - "git.akyoto.dev/cli/q/src/build/ast" - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/ast" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/token" ) // Stack is a stack of scopes. diff --git a/src/build/scope/Variable.go b/src/scope/Variable.go similarity index 85% rename from src/build/scope/Variable.go rename to src/scope/Variable.go index 0346ca1..7c6081e 100644 --- a/src/build/scope/Variable.go +++ b/src/scope/Variable.go @@ -1,8 +1,8 @@ package scope import ( - "git.akyoto.dev/cli/q/src/build/cpu" - "git.akyoto.dev/cli/q/src/build/types" + "git.akyoto.dev/cli/q/src/cpu" + "git.akyoto.dev/cli/q/src/types" ) // Variable represents a named register. diff --git a/src/build/sizeof/Signed.go b/src/sizeof/Signed.go similarity index 100% rename from src/build/sizeof/Signed.go rename to src/sizeof/Signed.go diff --git a/src/build/sizeof/Signed_test.go b/src/sizeof/Signed_test.go similarity index 93% rename from src/build/sizeof/Signed_test.go rename to src/sizeof/Signed_test.go index 6ddc15f..bd4d049 100644 --- a/src/build/sizeof/Signed_test.go +++ b/src/sizeof/Signed_test.go @@ -4,7 +4,7 @@ import ( "math" "testing" - "git.akyoto.dev/cli/q/src/build/sizeof" + "git.akyoto.dev/cli/q/src/sizeof" "git.akyoto.dev/go/assert" ) diff --git a/src/build/sizeof/Unsigned.go b/src/sizeof/Unsigned.go similarity index 100% rename from src/build/sizeof/Unsigned.go rename to src/sizeof/Unsigned.go diff --git a/src/build/sizeof/Unsigned_test.go b/src/sizeof/Unsigned_test.go similarity index 89% rename from src/build/sizeof/Unsigned_test.go rename to src/sizeof/Unsigned_test.go index e9a5dc8..b4e78a2 100644 --- a/src/build/sizeof/Unsigned_test.go +++ b/src/sizeof/Unsigned_test.go @@ -4,7 +4,7 @@ import ( "math" "testing" - "git.akyoto.dev/cli/q/src/build/sizeof" + "git.akyoto.dev/cli/q/src/sizeof" "git.akyoto.dev/go/assert" ) diff --git a/src/build/token/Count.go b/src/token/Count.go similarity index 100% rename from src/build/token/Count.go rename to src/token/Count.go diff --git a/src/build/token/Count_test.go b/src/token/Count_test.go similarity index 92% rename from src/build/token/Count_test.go rename to src/token/Count_test.go index 8742d13..9c8a228 100644 --- a/src/build/token/Count_test.go +++ b/src/token/Count_test.go @@ -3,7 +3,7 @@ package token_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/token" "git.akyoto.dev/go/assert" ) diff --git a/src/build/token/Kind.go b/src/token/Kind.go similarity index 100% rename from src/build/token/Kind.go rename to src/token/Kind.go diff --git a/src/build/token/Length.go b/src/token/Length.go similarity index 100% rename from src/build/token/Length.go rename to src/token/Length.go diff --git a/src/build/token/List.go b/src/token/List.go similarity index 54% rename from src/build/token/List.go rename to src/token/List.go index 37ad0eb..c66dc27 100644 --- a/src/build/token/List.go +++ b/src/token/List.go @@ -29,6 +29,43 @@ func (list List) LastIndexKind(kind Kind) int { return -1 } +// Split calls the callback function on each set of tokens in a comma separated list. +func (list List) Split(call func(List) error) error { + start := 0 + groupLevel := 0 + + for i, t := range list { + switch t.Kind { + case GroupStart, ArrayStart, BlockStart: + groupLevel++ + + case GroupEnd, ArrayEnd, BlockEnd: + groupLevel-- + + case Separator: + if groupLevel > 0 { + continue + } + + parameter := list[start:i] + err := call(parameter) + + if err != nil { + return err + } + + start = i + 1 + } + } + + if start != len(list) { + parameter := list[start:] + return call(parameter) + } + + return nil +} + // Text returns the concatenated token text. func (list List) Text(source []byte) string { tmp := strings.Builder{} diff --git a/src/token/List_test.go b/src/token/List_test.go new file mode 100644 index 0000000..71fbf84 --- /dev/null +++ b/src/token/List_test.go @@ -0,0 +1,40 @@ +package token_test + +import ( + "fmt" + "testing" + + "git.akyoto.dev/cli/q/src/token" + "git.akyoto.dev/go/assert" +) + +func TestIndexKind(t *testing.T) { + tokens := token.Tokenize([]byte("a{{}}")) + assert.Equal(t, tokens.IndexKind(token.NewLine), -1) + assert.Equal(t, tokens.LastIndexKind(token.NewLine), -1) + assert.Equal(t, tokens.IndexKind(token.BlockStart), 1) + assert.Equal(t, tokens.LastIndexKind(token.BlockStart), 2) + assert.Equal(t, tokens.IndexKind(token.BlockEnd), 3) + assert.Equal(t, tokens.LastIndexKind(token.BlockEnd), 4) +} + +func TestSplit(t *testing.T) { + src := []byte("1+2,3*4,5*6,7+8") + tokens := token.Tokenize(src) + parameters := []string{} + + err := tokens.Split(func(parameter token.List) error { + parameters = append(parameters, parameter.Text(src)) + return nil + }) + + assert.Nil(t, err) + assert.DeepEqual(t, parameters, []string{"1+2", "3*4", "5*6", "7+8"}) + + err = tokens.Split(func(parameter token.List) error { + return fmt.Errorf("error") + }) + + assert.NotNil(t, err) + assert.Equal(t, err.Error(), "error") +} diff --git a/src/build/token/Position.go b/src/token/Position.go similarity index 100% rename from src/build/token/Position.go rename to src/token/Position.go diff --git a/src/build/token/Token.go b/src/token/Token.go similarity index 100% rename from src/build/token/Token.go rename to src/token/Token.go diff --git a/src/build/token/Token_test.go b/src/token/Token_test.go similarity index 96% rename from src/build/token/Token_test.go rename to src/token/Token_test.go index ba825cc..9396480 100644 --- a/src/build/token/Token_test.go +++ b/src/token/Token_test.go @@ -3,7 +3,7 @@ package token_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/token" "git.akyoto.dev/go/assert" ) diff --git a/src/build/token/Tokenize.go b/src/token/Tokenize.go similarity index 100% rename from src/build/token/Tokenize.go rename to src/token/Tokenize.go diff --git a/src/build/token/Tokenize_test.go b/src/token/Tokenize_test.go similarity index 99% rename from src/build/token/Tokenize_test.go rename to src/token/Tokenize_test.go index 4d6e36b..e00f978 100644 --- a/src/build/token/Tokenize_test.go +++ b/src/token/Tokenize_test.go @@ -3,7 +3,7 @@ package token_test import ( "testing" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/token" "git.akyoto.dev/go/assert" ) diff --git a/src/build/token/bench_test.go b/src/token/bench_test.go similarity index 90% rename from src/build/token/bench_test.go rename to src/token/bench_test.go index 3ec6007..acc6359 100644 --- a/src/build/token/bench_test.go +++ b/src/token/bench_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - "git.akyoto.dev/cli/q/src/build/token" + "git.akyoto.dev/cli/q/src/token" ) func BenchmarkLines(b *testing.B) { diff --git a/src/build/types/New.go b/src/types/New.go similarity index 100% rename from src/build/types/New.go rename to src/types/New.go diff --git a/src/build/types/NewList.go b/src/types/NewList.go similarity index 60% rename from src/build/types/NewList.go rename to src/types/NewList.go index 91bb4ca..c315c8d 100644 --- a/src/build/types/NewList.go +++ b/src/types/NewList.go @@ -1,15 +1,12 @@ package types -import ( - "git.akyoto.dev/cli/q/src/build/expression" - "git.akyoto.dev/cli/q/src/build/token" -) +import "git.akyoto.dev/cli/q/src/token" // NewList generates a list of types from comma separated tokens. func NewList(tokens token.List, source []byte) []Type { var list []Type - expression.EachParameter(tokens, func(parameter token.List) error { + tokens.Split(func(parameter token.List) error { typ := New(parameter.Text(source)) list = append(list, typ) return nil diff --git a/src/build/types/Type.go b/src/types/Type.go similarity index 100% rename from src/build/types/Type.go rename to src/types/Type.go diff --git a/tests/errors_test.go b/tests/errors_test.go index 61eab3d..484cf94 100644 --- a/tests/errors_test.go +++ b/tests/errors_test.go @@ -6,7 +6,7 @@ import ( "testing" "git.akyoto.dev/cli/q/src/build" - "git.akyoto.dev/cli/q/src/build/errors" + "git.akyoto.dev/cli/q/src/errors" "git.akyoto.dev/go/assert" ) diff --git a/tests/examples_test.go b/tests/examples_test.go index 2279740..63dd7f3 100644 --- a/tests/examples_test.go +++ b/tests/examples_test.go @@ -5,7 +5,7 @@ import ( "testing" "git.akyoto.dev/cli/q/src/build" - "git.akyoto.dev/cli/q/src/build/config" + "git.akyoto.dev/cli/q/src/config" "git.akyoto.dev/go/assert" ) diff --git a/tests/programs_test.go b/tests/programs_test.go index 7e002a7..a6b117f 100644 --- a/tests/programs_test.go +++ b/tests/programs_test.go @@ -8,7 +8,7 @@ import ( "testing" "git.akyoto.dev/cli/q/src/build" - "git.akyoto.dev/cli/q/src/build/config" + "git.akyoto.dev/cli/q/src/config" "git.akyoto.dev/go/assert" )