applying new astwalker for modifications

This commit is contained in:
Irmen de Jong 2020-03-19 22:36:15 +01:00
parent 5e50ea14f8
commit 29ac160811
12 changed files with 169 additions and 152 deletions

View File

@ -4,7 +4,7 @@ import prog8.ast.Module
import prog8.ast.Program
import prog8.ast.processing.*
import prog8.compiler.CompilationOptions
import prog8.optimizer.FlattenAnonymousScopesAndRemoveNops
import prog8.optimizer.FlattenAnonymousScopesAndNopRemover
// the name of the subroutine that should be called for every block to initialize its variables
@ -16,9 +16,10 @@ internal fun Program.checkValid(compilerOptions: CompilationOptions, errors: Err
checker.visit(this)
}
internal fun Program.anonscopeVarsCleanup(errors: ErrorReporter) {
val mover = MoveAnonScopeVarsToSubroutine(errors)
internal fun Program.moveAnonScopeVarsToSubroutine(errors: ErrorReporter) {
val mover = AnonScopeVarsToSubroutineMover(errors)
mover.visit(this)
mover.applyModifications()
}
internal fun Program.reorderStatements() {
@ -56,12 +57,12 @@ internal fun Program.checkIdentifiers(errors: ErrorReporter) {
}
internal fun Program.makeForeverLoops() {
val checker = MakeForeverLoops()
val checker = ForeverLoopsMaker()
checker.visit(this)
checker.applyModifications()
}
internal fun Program.removeNopsFlattenAnonScopes() {
val flattener = FlattenAnonymousScopesAndRemoveNops()
val flattener = FlattenAnonymousScopesAndNopRemover()
flattener.visit(this)
}

View File

@ -0,0 +1,39 @@
package prog8.ast.processing
import prog8.ast.Node
import prog8.ast.base.ErrorReporter
import prog8.ast.statements.AnonymousScope
import prog8.ast.statements.Subroutine
import prog8.ast.statements.VarDecl
class AnonScopeVarsToSubroutineMover(val errors: ErrorReporter): AstWalker() {
override fun after(scope: AnonymousScope, parent: Node): Iterable<IAstModification> {
val decls = scope.statements.filterIsInstance<VarDecl>()
val sub = scope.definingSubroutine()
if(sub!=null) {
val existingVariables = sub.statements.filterIsInstance<VarDecl>().associateBy { it.name }
var conflicts = false
decls.forEach {
val existing = existingVariables[it.name]
if (existing!=null) {
errors.err("variable ${it.name} already defined in subroutine ${sub.name} at ${existing.position}", it.position)
conflicts = true
}
}
if(!conflicts)
return listOf(MoveVardecl(decls, scope, sub))
}
return emptyList()
}
private class MoveVardecl(val decls: Collection<VarDecl>,
val scope: AnonymousScope,
val sub: Subroutine) : IAstModification {
override fun perform() {
decls.forEach { scope.remove(it) }
sub.statements.addAll(0, decls)
decls.forEach { it.parent = sub }
}
}
}

View File

@ -9,10 +9,10 @@ import prog8.ast.expressions.*
import prog8.ast.statements.*
abstract class AstModification(val node: Node) {
abstract fun perform()
interface IAstModification {
fun perform()
class Remove(node: Node, val parent: Node) : AstModification(node) {
class Remove(val node: Node, val parent: Node) : IAstModification {
override fun perform() {
if(parent is INameScope) {
if (!parent.statements.remove(node))
@ -23,10 +23,10 @@ abstract class AstModification(val node: Node) {
}
}
class Replace(statement: Statement, val replacement: Statement, val parent: Node) : AstModification(statement) {
class Replace(val statement: Statement, val replacement: Statement, val parent: Node) : IAstModification {
override fun perform() {
if(parent is INameScope) {
val idx = parent.statements.indexOf(node)
val idx = parent.statements.indexOf(statement)
parent.statements[idx] = replacement
replacement.linkParents(parent)
} else {
@ -38,97 +38,97 @@ abstract class AstModification(val node: Node) {
abstract class AstWalker {
open fun before(addressOf: AddressOf, parent: Node): Iterable<AstModification> = emptyList()
open fun before(array: ArrayLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
open fun before(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<AstModification> = emptyList()
open fun before(assignTarget: AssignTarget, parent: Node): Iterable<AstModification> = emptyList()
open fun before(assignment: Assignment, parent: Node): Iterable<AstModification> = emptyList()
open fun before(block: Block, parent: Node): Iterable<AstModification> = emptyList()
open fun before(branchStatement: BranchStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun before(breakStmt: Break, parent: Node): Iterable<AstModification> = emptyList()
open fun before(builtinFunctionStatementPlaceholder: BuiltinFunctionStatementPlaceholder, parent: Node): Iterable<AstModification> = emptyList()
open fun before(contStmt: Continue, parent: Node): Iterable<AstModification> = emptyList()
open fun before(decl: VarDecl, parent: Node): Iterable<AstModification> = emptyList()
open fun before(directive: Directive, parent: Node): Iterable<AstModification> = emptyList()
open fun before(expr: BinaryExpression, parent: Node): Iterable<AstModification> = emptyList()
open fun before(expr: PrefixExpression, parent: Node): Iterable<AstModification> = emptyList()
open fun before(forLoop: ForLoop, parent: Node): Iterable<AstModification> = emptyList()
open fun before(foreverLoop: ForeverLoop, parent: Node): Iterable<AstModification> = emptyList()
open fun before(functionCall: FunctionCall, parent: Node): Iterable<AstModification> = emptyList()
open fun before(functionCallStatement: FunctionCallStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun before(identifier: IdentifierReference, parent: Node): Iterable<AstModification> = emptyList()
open fun before(ifStatement: IfStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun before(inlineAssembly: InlineAssembly, parent: Node): Iterable<AstModification> = emptyList()
open fun before(jump: Jump, parent: Node): Iterable<AstModification> = emptyList()
open fun before(label: Label, parent: Node): Iterable<AstModification> = emptyList()
open fun before(memread: DirectMemoryRead, parent: Node): Iterable<AstModification> = emptyList()
open fun before(memwrite: DirectMemoryWrite, parent: Node): Iterable<AstModification> = emptyList()
open fun before(module: Module, parent: Node): Iterable<AstModification> = emptyList()
open fun before(nopStatement: NopStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun before(numLiteral: NumericLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
open fun before(postIncrDecr: PostIncrDecr, parent: Node): Iterable<AstModification> = emptyList()
open fun before(program: Program, parent: Node): Iterable<AstModification> = emptyList()
open fun before(range: RangeExpr, parent: Node): Iterable<AstModification> = emptyList()
open fun before(registerExpr: RegisterExpr, parent: Node): Iterable<AstModification> = emptyList()
open fun before(repeatLoop: RepeatLoop, parent: Node): Iterable<AstModification> = emptyList()
open fun before(returnStmt: Return, parent: Node): Iterable<AstModification> = emptyList()
open fun before(scope: AnonymousScope, parent: Node): Iterable<AstModification> = emptyList()
open fun before(string: StringLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
open fun before(structDecl: StructDecl, parent: Node): Iterable<AstModification> = emptyList()
open fun before(structLv: StructLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
open fun before(subroutine: Subroutine, parent: Node): Iterable<AstModification> = emptyList()
open fun before(typecast: TypecastExpression, parent: Node): Iterable<AstModification> = emptyList()
open fun before(whenChoice: WhenChoice, parent: Node): Iterable<AstModification> = emptyList()
open fun before(whenStatement: WhenStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun before(whileLoop: WhileLoop, parent: Node): Iterable<AstModification> = emptyList()
open fun before(addressOf: AddressOf, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(array: ArrayLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(assignTarget: AssignTarget, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(assignment: Assignment, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(block: Block, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(branchStatement: BranchStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(breakStmt: Break, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(builtinFunctionStatementPlaceholder: BuiltinFunctionStatementPlaceholder, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(contStmt: Continue, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(decl: VarDecl, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(directive: Directive, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(expr: BinaryExpression, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(expr: PrefixExpression, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(forLoop: ForLoop, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(foreverLoop: ForeverLoop, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(functionCall: FunctionCall, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(functionCallStatement: FunctionCallStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(identifier: IdentifierReference, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(ifStatement: IfStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(inlineAssembly: InlineAssembly, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(jump: Jump, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(label: Label, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(memread: DirectMemoryRead, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(memwrite: DirectMemoryWrite, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(module: Module, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(nopStatement: NopStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(numLiteral: NumericLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(postIncrDecr: PostIncrDecr, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(program: Program, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(range: RangeExpr, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(registerExpr: RegisterExpr, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(repeatLoop: RepeatLoop, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(returnStmt: Return, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(scope: AnonymousScope, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(string: StringLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(structDecl: StructDecl, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(structLv: StructLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(subroutine: Subroutine, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(typecast: TypecastExpression, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(whenChoice: WhenChoice, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(whenStatement: WhenStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun before(whileLoop: WhileLoop, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(addressOf: AddressOf, parent: Node): Iterable<AstModification> = emptyList()
open fun after(array: ArrayLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
open fun after(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<AstModification> = emptyList()
open fun after(assignTarget: AssignTarget, parent: Node): Iterable<AstModification> = emptyList()
open fun after(assignment: Assignment, parent: Node): Iterable<AstModification> = emptyList()
open fun after(block: Block, parent: Node): Iterable<AstModification> = emptyList()
open fun after(branchStatement: BranchStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun after(breakStmt: Break, parent: Node): Iterable<AstModification> = emptyList()
open fun after(builtinFunctionStatementPlaceholder: BuiltinFunctionStatementPlaceholder, parent: Node): Iterable<AstModification> = emptyList()
open fun after(contStmt: Continue, parent: Node): Iterable<AstModification> = emptyList()
open fun after(decl: VarDecl, parent: Node): Iterable<AstModification> = emptyList()
open fun after(directive: Directive, parent: Node): Iterable<AstModification> = emptyList()
open fun after(expr: BinaryExpression, parent: Node): Iterable<AstModification> = emptyList()
open fun after(expr: PrefixExpression, parent: Node): Iterable<AstModification> = emptyList()
open fun after(forLoop: ForLoop, parent: Node): Iterable<AstModification> = emptyList()
open fun after(foreverLoop: ForeverLoop, parent: Node): Iterable<AstModification> = emptyList()
open fun after(functionCall: FunctionCall, parent: Node): Iterable<AstModification> = emptyList()
open fun after(functionCallStatement: FunctionCallStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun after(identifier: IdentifierReference, parent: Node): Iterable<AstModification> = emptyList()
open fun after(ifStatement: IfStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun after(inlineAssembly: InlineAssembly, parent: Node): Iterable<AstModification> = emptyList()
open fun after(jump: Jump, parent: Node): Iterable<AstModification> = emptyList()
open fun after(label: Label, parent: Node): Iterable<AstModification> = emptyList()
open fun after(memread: DirectMemoryRead, parent: Node): Iterable<AstModification> = emptyList()
open fun after(memwrite: DirectMemoryWrite, parent: Node): Iterable<AstModification> = emptyList()
open fun after(module: Module, parent: Node): Iterable<AstModification> = emptyList()
open fun after(nopStatement: NopStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun after(numLiteral: NumericLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
open fun after(postIncrDecr: PostIncrDecr, parent: Node): Iterable<AstModification> = emptyList()
open fun after(program: Program, parent: Node): Iterable<AstModification> = emptyList()
open fun after(range: RangeExpr, parent: Node): Iterable<AstModification> = emptyList()
open fun after(registerExpr: RegisterExpr, parent: Node): Iterable<AstModification> = emptyList()
open fun after(repeatLoop: RepeatLoop, parent: Node): Iterable<AstModification> = emptyList()
open fun after(returnStmt: Return, parent: Node): Iterable<AstModification> = emptyList()
open fun after(scope: AnonymousScope, parent: Node): Iterable<AstModification> = emptyList()
open fun after(string: StringLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
open fun after(structDecl: StructDecl, parent: Node): Iterable<AstModification> = emptyList()
open fun after(structLv: StructLiteralValue, parent: Node): Iterable<AstModification> = emptyList()
open fun after(subroutine: Subroutine, parent: Node): Iterable<AstModification> = emptyList()
open fun after(typecast: TypecastExpression, parent: Node): Iterable<AstModification> = emptyList()
open fun after(whenChoice: WhenChoice, parent: Node): Iterable<AstModification> = emptyList()
open fun after(whenStatement: WhenStatement, parent: Node): Iterable<AstModification> = emptyList()
open fun after(whileLoop: WhileLoop, parent: Node): Iterable<AstModification> = emptyList()
open fun after(addressOf: AddressOf, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(array: ArrayLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(assignTarget: AssignTarget, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(assignment: Assignment, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(block: Block, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(branchStatement: BranchStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(breakStmt: Break, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(builtinFunctionStatementPlaceholder: BuiltinFunctionStatementPlaceholder, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(contStmt: Continue, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(decl: VarDecl, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(directive: Directive, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(expr: BinaryExpression, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(expr: PrefixExpression, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(forLoop: ForLoop, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(foreverLoop: ForeverLoop, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(functionCall: FunctionCall, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(functionCallStatement: FunctionCallStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(identifier: IdentifierReference, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(ifStatement: IfStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(inlineAssembly: InlineAssembly, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(jump: Jump, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(label: Label, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(memread: DirectMemoryRead, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(memwrite: DirectMemoryWrite, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(module: Module, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(nopStatement: NopStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(numLiteral: NumericLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(postIncrDecr: PostIncrDecr, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(program: Program, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(range: RangeExpr, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(registerExpr: RegisterExpr, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(repeatLoop: RepeatLoop, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(returnStmt: Return, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(scope: AnonymousScope, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(string: StringLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(structDecl: StructDecl, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(structLv: StructLiteralValue, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(subroutine: Subroutine, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(typecast: TypecastExpression, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(whenChoice: WhenChoice, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(whenStatement: WhenStatement, parent: Node): Iterable<IAstModification> = emptyList()
open fun after(whileLoop: WhileLoop, parent: Node): Iterable<IAstModification> = emptyList()
private val modifications = mutableListOf<Triple<AstModification, Node, Node>>()
private val modifications = mutableListOf<Triple<IAstModification, Node, Node>>()
private fun track(mods: Iterable<AstModification>, node: Node, parent: Node) {
private fun track(mods: Iterable<IAstModification>, node: Node, parent: Node) {
for (it in mods) modifications += Triple(it, node, parent)
}

View File

@ -7,21 +7,21 @@ import prog8.ast.statements.RepeatLoop
import prog8.ast.statements.WhileLoop
internal class MakeForeverLoops: AstWalker() {
override fun before(repeatLoop: RepeatLoop, parent: Node): Iterable<AstModification> {
internal class ForeverLoopsMaker: AstWalker() {
override fun before(repeatLoop: RepeatLoop, parent: Node): Iterable<IAstModification> {
val numeric = repeatLoop.untilCondition as? NumericLiteralValue
if(numeric!=null && numeric.number.toInt() == 0) {
val forever = ForeverLoop(repeatLoop.body, repeatLoop.position)
return listOf(AstModification.Replace(repeatLoop, forever, parent))
return listOf(IAstModification.Replace(repeatLoop, forever, parent))
}
return emptyList()
}
override fun before(whileLoop: WhileLoop, parent: Node): Iterable<AstModification> {
override fun before(whileLoop: WhileLoop, parent: Node): Iterable<IAstModification> {
val numeric = whileLoop.condition as? NumericLiteralValue
if(numeric!=null && numeric.number.toInt() != 0) {
val forever = ForeverLoop(whileLoop.body, whileLoop.position)
return listOf(AstModification.Replace(whileLoop, forever, parent))
return listOf(IAstModification.Replace(whileLoop, forever, parent))
}
return emptyList()
}

View File

@ -11,9 +11,9 @@ internal class ImportedModuleDirectiveRemover: AstWalker() {
private val moduleLevelDirectives = listOf("%output", "%launcher", "%zeropage", "%zpreserved", "%address")
override fun before(directive: Directive, parent: Node): Iterable<AstModification> {
override fun before(directive: Directive, parent: Node): Iterable<IAstModification> {
if(directive.directive in moduleLevelDirectives) {
return listOf(AstModification.Remove(directive, parent))
return listOf(IAstModification.Remove(directive, parent))
}
return emptyList()
}

View File

@ -1,41 +0,0 @@
package prog8.ast.processing
import prog8.ast.Program
import prog8.ast.base.ErrorReporter
import prog8.ast.statements.AnonymousScope
import prog8.ast.statements.Statement
import prog8.ast.statements.VarDecl
class MoveAnonScopeVarsToSubroutine(private val errors: ErrorReporter): IAstModifyingVisitor {
private val varsToMove: MutableMap<AnonymousScope, List<VarDecl>> = mutableMapOf()
override fun visit(program: Program) {
varsToMove.clear()
super.visit(program)
for((scope, decls) in varsToMove) {
val sub = scope.definingSubroutine()!!
val existingVariables = sub.statements.filterIsInstance<VarDecl>().associateBy { it.name }
var conflicts = false
decls.forEach {
val existing = existingVariables[it.name]
if (existing!=null) {
errors.err("variable ${it.name} already defined in subroutine ${sub.name} at ${existing.position}", it.position)
conflicts = true
}
}
if (!conflicts) {
decls.forEach { scope.remove(it) }
sub.statements.addAll(0, decls)
decls.forEach { it.parent = sub }
}
}
}
override fun visit(scope: AnonymousScope): Statement {
val scope2 = super.visit(scope) as AnonymousScope
val vardecls = scope2.statements.filterIsInstance<VarDecl>()
varsToMove[scope2] = vardecls
return scope2
}
}

View File

@ -117,7 +117,7 @@ fun compileProgram(filepath: Path,
if(writeAssembly) {
// asm generation directly from the Ast, no need for intermediate code
val zeropage = CompilationTarget.machine.getZeropage(compilerOptions)
programAst.anonscopeVarsCleanup(errors)
programAst.moveAnonScopeVarsToSubroutine(errors)
errors.handle()
val assembly = CompilationTarget.asmGenerator(programAst, zeropage, compilerOptions, outputDir).compileToAssembly(optimize)
assembly.assemble(compilerOptions)

View File

@ -11,7 +11,7 @@ import prog8.functions.BuiltinFunctions
import kotlin.math.floor
class ConstantFolding(private val program: Program, private val errors: ErrorReporter) : IAstModifyingVisitor {
class ConstantFoldingOptimizer(private val program: Program, private val errors: ErrorReporter) : IAstModifyingVisitor {
var optimizationsDone: Int = 0
override fun visit(decl: VarDecl): Statement {

View File

@ -17,7 +17,7 @@ import kotlin.math.pow
*/
internal class SimplifyExpressions(private val program: Program) : IAstModifyingVisitor {
internal class ExpressionSimplifier(private val program: Program) : IAstModifyingVisitor {
var optimizationsDone: Int = 0
override fun visit(assignment: Assignment): Statement {

View File

@ -5,7 +5,7 @@ import prog8.ast.base.ErrorReporter
internal fun Program.constantFold(errors: ErrorReporter) {
val optimizer = ConstantFolding(this, errors)
val optimizer = ConstantFoldingOptimizer(this, errors)
optimizer.visit(this)
while(errors.isEmpty() && optimizer.optimizationsDone>0) {
@ -27,7 +27,7 @@ internal fun Program.optimizeStatements(errors: ErrorReporter): Int {
}
internal fun Program.simplifyExpressions() : Int {
val optimizer = SimplifyExpressions(this)
val optimizer = ExpressionSimplifier(this)
optimizer.visit(this)
return optimizer.optimizationsDone
}

View File

@ -8,7 +8,7 @@ import prog8.ast.statements.AnonymousScope
import prog8.ast.statements.NopStatement
import prog8.ast.statements.Statement
internal class FlattenAnonymousScopesAndRemoveNops: IAstVisitor {
internal class FlattenAnonymousScopesAndNopRemover: IAstVisitor {
private var scopesToFlatten = mutableListOf<INameScope>()
private val nopStatements = mutableListOf<NopStatement>()

View File

@ -4,12 +4,30 @@
main {
sub start() {
ubyte x11=44
byte bb0=99
A=x11
while true {
A=99
}
repeat {
ubyte x1
x1=A
A=x1
if A==44 {
ubyte y1
A=y1
} else {
byte bb1=99
bb1 += A
bb0=bb1
}
A=44
} until false