mirror of
https://github.com/irmen/prog8.git
synced 2025-02-06 01:30:23 +00:00
order
This commit is contained in:
parent
c75b1581d2
commit
f117805129
@ -1,7 +1,6 @@
|
|||||||
package prog8.compiler
|
package prog8.compiler
|
||||||
|
|
||||||
import com.github.michaelbull.result.onFailure
|
import com.github.michaelbull.result.onFailure
|
||||||
import prog8.ast.AstToSourceTextConverter
|
|
||||||
import prog8.ast.IBuiltinFunctions
|
import prog8.ast.IBuiltinFunctions
|
||||||
import prog8.ast.IStatementContainer
|
import prog8.ast.IStatementContainer
|
||||||
import prog8.ast.Program
|
import prog8.ast.Program
|
||||||
@ -12,6 +11,7 @@ import prog8.ast.statements.Directive
|
|||||||
import prog8.ast.statements.VarDecl
|
import prog8.ast.statements.VarDecl
|
||||||
import prog8.ast.walk.IAstVisitor
|
import prog8.ast.walk.IAstVisitor
|
||||||
import prog8.code.SymbolTableMaker
|
import prog8.code.SymbolTableMaker
|
||||||
|
import prog8.code.ast.PtProgram
|
||||||
import prog8.code.core.*
|
import prog8.code.core.*
|
||||||
import prog8.code.target.*
|
import prog8.code.target.*
|
||||||
import prog8.codegen.vm.VmCodeGen
|
import prog8.codegen.vm.VmCodeGen
|
||||||
@ -402,7 +402,8 @@ private fun createAssemblyAndAssemble(program: Program,
|
|||||||
// println("*********** COMPILER AST RIGHT BEFORE ASM GENERATION *************")
|
// println("*********** COMPILER AST RIGHT BEFORE ASM GENERATION *************")
|
||||||
// printProgram(program)
|
// printProgram(program)
|
||||||
|
|
||||||
val assembly = asmGeneratorFor(program, errors, compilerOptions).compileToAssembly()
|
val intermediateAst = IntermediateAstMaker(program, compilerOptions).transform()
|
||||||
|
val assembly = asmGeneratorFor(intermediateAst, compilerOptions, errors).compileToAssembly()
|
||||||
errors.report()
|
errors.report()
|
||||||
|
|
||||||
return if(assembly!=null && errors.noErrors()) {
|
return if(assembly!=null && errors.noErrors()) {
|
||||||
@ -432,28 +433,19 @@ private fun removeAllVardeclsFromAst(program: Program) {
|
|||||||
SearchAndRemove()
|
SearchAndRemove()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun printProgram(program: Program) {
|
internal fun asmGeneratorFor(program: PtProgram,
|
||||||
println()
|
options: CompilationOptions,
|
||||||
val printer = AstToSourceTextConverter(::print, program)
|
errors: IErrorReporter): IAssemblyGenerator
|
||||||
printer.visit(program)
|
|
||||||
println()
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun asmGeneratorFor(program: Program,
|
|
||||||
errors: IErrorReporter,
|
|
||||||
options: CompilationOptions): IAssemblyGenerator
|
|
||||||
{
|
{
|
||||||
val intermediateAst = IntermediateAstMaker(program, options).transform()
|
val stMaker = SymbolTableMaker(program, options)
|
||||||
|
|
||||||
val stMaker = SymbolTableMaker(intermediateAst, options)
|
|
||||||
val symbolTable = stMaker.make()
|
val symbolTable = stMaker.make()
|
||||||
|
|
||||||
if(options.experimentalCodegen)
|
return if(options.experimentalCodegen)
|
||||||
return prog8.codegen.experimental.CodeGen(intermediateAst, symbolTable, options, errors)
|
prog8.codegen.experimental.CodeGen(program, symbolTable, options, errors)
|
||||||
else if (options.compTarget.machine.cpu in arrayOf(CpuType.CPU6502, CpuType.CPU65c02))
|
else if (options.compTarget.machine.cpu in arrayOf(CpuType.CPU6502, CpuType.CPU65c02))
|
||||||
return prog8.codegen.cpu6502.AsmGen(intermediateAst, symbolTable, options, errors)
|
prog8.codegen.cpu6502.AsmGen(program, symbolTable, options, errors)
|
||||||
else if (options.compTarget.name == VMTarget.NAME)
|
else if (options.compTarget.name == VMTarget.NAME)
|
||||||
return VmCodeGen(intermediateAst, symbolTable, options, errors)
|
VmCodeGen(program, symbolTable, options, errors)
|
||||||
else
|
else
|
||||||
throw NotImplementedError("no asm generator for cpu ${options.compTarget.machine.cpu}")
|
throw NotImplementedError("no asm generator for cpu ${options.compTarget.machine.cpu}")
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@ import prog8.code.core.Position
|
|||||||
import prog8.code.core.SourceCode
|
import prog8.code.core.SourceCode
|
||||||
import prog8.code.core.ZeropageWish
|
import prog8.code.core.ZeropageWish
|
||||||
import prog8.code.target.C64Target
|
import prog8.code.target.C64Target
|
||||||
import prog8.compiler.printProgram
|
|
||||||
import prog8tests.helpers.DummyFunctions
|
import prog8tests.helpers.DummyFunctions
|
||||||
import prog8tests.helpers.DummyMemsizer
|
import prog8tests.helpers.DummyMemsizer
|
||||||
import prog8tests.helpers.DummyStringEncoder
|
import prog8tests.helpers.DummyStringEncoder
|
||||||
@ -147,7 +146,6 @@ class TestMemory: FunSpec({
|
|||||||
target = AssignTarget(null, null, DirectMemoryWrite(memexpr, Position.DUMMY), Position.DUMMY)
|
target = AssignTarget(null, null, DirectMemoryWrite(memexpr, Position.DUMMY), Position.DUMMY)
|
||||||
assign = Assignment(target, NumericLiteral.optimalInteger(0, Position.DUMMY), AssignmentOrigin.USERCODE, Position.DUMMY)
|
assign = Assignment(target, NumericLiteral.optimalInteger(0, Position.DUMMY), AssignmentOrigin.USERCODE, Position.DUMMY)
|
||||||
wrapWithProgram(listOf(assign))
|
wrapWithProgram(listOf(assign))
|
||||||
printProgram(target.definingModule.program)
|
|
||||||
target.isIOAddress(c64target.machine) shouldBe true
|
target.isIOAddress(c64target.machine) shouldBe true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@ import prog8.code.core.Position
|
|||||||
import prog8.code.core.toHex
|
import prog8.code.core.toHex
|
||||||
import prog8.code.target.C64Target
|
import prog8.code.target.C64Target
|
||||||
import prog8.code.target.cbm.Mflpt5
|
import prog8.code.target.cbm.Mflpt5
|
||||||
import prog8.compiler.printProgram
|
|
||||||
import prog8tests.helpers.ErrorReporterForTests
|
import prog8tests.helpers.ErrorReporterForTests
|
||||||
import prog8tests.helpers.compileText
|
import prog8tests.helpers.compileText
|
||||||
|
|
||||||
@ -201,7 +200,6 @@ class TestNumbers: FunSpec({
|
|||||||
val result = compileText(C64Target(), false, src, writeAssembly = false)!!
|
val result = compileText(C64Target(), false, src, writeAssembly = false)!!
|
||||||
val statements = result.program.entrypoint.statements
|
val statements = result.program.entrypoint.statements
|
||||||
statements.size shouldBe 8
|
statements.size shouldBe 8
|
||||||
printProgram(result.program)
|
|
||||||
(statements[1] as Assignment).value shouldBe NumericLiteral(DataType.UWORD, 32768.0, Position.DUMMY)
|
(statements[1] as Assignment).value shouldBe NumericLiteral(DataType.UWORD, 32768.0, Position.DUMMY)
|
||||||
(statements[3] as Assignment).value shouldBe NumericLiteral(DataType.UWORD, 65535.0, Position.DUMMY)
|
(statements[3] as Assignment).value shouldBe NumericLiteral(DataType.UWORD, 65535.0, Position.DUMMY)
|
||||||
(statements[5] as Assignment).value shouldBe NumericLiteral(DataType.UBYTE, 255.0, Position.DUMMY)
|
(statements[5] as Assignment).value shouldBe NumericLiteral(DataType.UBYTE, 255.0, Position.DUMMY)
|
||||||
|
@ -16,7 +16,6 @@ import prog8.code.core.DataType
|
|||||||
import prog8.code.core.Position
|
import prog8.code.core.Position
|
||||||
import prog8.code.target.C64Target
|
import prog8.code.target.C64Target
|
||||||
import prog8.code.target.Cx16Target
|
import prog8.code.target.Cx16Target
|
||||||
import prog8.compiler.printProgram
|
|
||||||
import prog8tests.helpers.*
|
import prog8tests.helpers.*
|
||||||
|
|
||||||
|
|
||||||
@ -265,7 +264,6 @@ class TestOptimization: FunSpec({
|
|||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
val result = compileText(C64Target(), false, src, writeAssembly = true)!!
|
val result = compileText(C64Target(), false, src, writeAssembly = true)!!
|
||||||
printProgram(result.program)
|
|
||||||
val stmts = result.program.entrypoint.statements
|
val stmts = result.program.entrypoint.statements
|
||||||
stmts.size shouldBe 8
|
stmts.size shouldBe 8
|
||||||
|
|
||||||
@ -401,7 +399,6 @@ class TestOptimization: FunSpec({
|
|||||||
}
|
}
|
||||||
}"""
|
}"""
|
||||||
val result = compileText(C64Target(), optimize=true, src, writeAssembly=false)!!
|
val result = compileText(C64Target(), optimize=true, src, writeAssembly=false)!!
|
||||||
printProgram(result.program)
|
|
||||||
/* expected:
|
/* expected:
|
||||||
ubyte z1
|
ubyte z1
|
||||||
z1 = 10
|
z1 = 10
|
||||||
@ -638,7 +635,6 @@ class TestOptimization: FunSpec({
|
|||||||
}
|
}
|
||||||
}"""
|
}"""
|
||||||
val result = compileText(C64Target(), optimize=true, src, writeAssembly=false)!!
|
val result = compileText(C64Target(), optimize=true, src, writeAssembly=false)!!
|
||||||
printProgram(result.program)
|
|
||||||
/*
|
/*
|
||||||
expected result:
|
expected result:
|
||||||
ubyte[] auto_heap_var = [1,4,99,3]
|
ubyte[] auto_heap_var = [1,4,99,3]
|
||||||
@ -679,7 +675,6 @@ class TestOptimization: FunSpec({
|
|||||||
}
|
}
|
||||||
}"""
|
}"""
|
||||||
val result = compileText(C64Target(), optimize=true, src, writeAssembly=false)!!
|
val result = compileText(C64Target(), optimize=true, src, writeAssembly=false)!!
|
||||||
printProgram(result.program)
|
|
||||||
val stmts = result.program.entrypoint.statements
|
val stmts = result.program.entrypoint.statements
|
||||||
stmts.size shouldBe 5
|
stmts.size shouldBe 5
|
||||||
val ifStmt = stmts[4] as IfElse
|
val ifStmt = stmts[4] as IfElse
|
||||||
@ -698,7 +693,6 @@ class TestOptimization: FunSpec({
|
|||||||
}
|
}
|
||||||
}"""
|
}"""
|
||||||
val result = compileText(C64Target(), optimize=true, src, writeAssembly=false)!!
|
val result = compileText(C64Target(), optimize=true, src, writeAssembly=false)!!
|
||||||
printProgram(result.program)
|
|
||||||
val stmts = result.program.entrypoint.statements
|
val stmts = result.program.entrypoint.statements
|
||||||
stmts.size shouldBe 5
|
stmts.size shouldBe 5
|
||||||
val ifStmt = stmts[4] as IfElse
|
val ifStmt = stmts[4] as IfElse
|
||||||
|
@ -6,6 +6,14 @@ import prog8.ast.walk.IAstVisitor
|
|||||||
import prog8.code.core.*
|
import prog8.code.core.*
|
||||||
|
|
||||||
|
|
||||||
|
fun printProgram(program: Program) {
|
||||||
|
println()
|
||||||
|
val printer = AstToSourceTextConverter(::print, program)
|
||||||
|
printer.visit(program)
|
||||||
|
println()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Produces Prog8 source text from a [Program] (AST node),
|
* Produces Prog8 source text from a [Program] (AST node),
|
||||||
* passing it as a String to the specified receiver function.
|
* passing it as a String to the specified receiver function.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user