Skip to content

Commit 08c27b3

Browse files
committed
Issue #3: Implement penUp and penDown functions
1 parent 9b0f67a commit 08c27b3

File tree

10 files changed

+79
-12
lines changed

10 files changed

+79
-12
lines changed

app/src/main/java/com/amrdeveloper/turtle/ui/preview/TurtleCanvasView.kt

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import com.amrdeveloper.lilo.backend.MoveXInst
4141
import com.amrdeveloper.lilo.backend.MoveYInst
4242
import com.amrdeveloper.lilo.backend.NewTurtleInst
4343
import com.amrdeveloper.lilo.backend.Operator
44+
import com.amrdeveloper.lilo.backend.PenInst
4445
import com.amrdeveloper.lilo.backend.RectangleInst
4546
import com.amrdeveloper.lilo.backend.SleepInst
4647
import com.amrdeveloper.lilo.backend.SpeedInst
@@ -100,26 +101,32 @@ class TurtleCanvasView @JvmOverloads constructor(
100101
when (val inst = instructionList[sp++]) {
101102
is RectangleInst -> {
102103
val turtle = turtlePointers[inst.id]
103-
turtlePaint.color = turtle.color
104-
canvas.drawRect(turtle.x, turtle.y, turtle.y + inst.right, turtle.y + inst.bottom, turtlePaint)
104+
if (turtle.isPenDown) {
105+
turtlePaint.color = turtle.color
106+
canvas.drawRect(turtle.x, turtle.y, turtle.y + inst.right, turtle.y + inst.bottom, turtlePaint)
107+
}
105108
}
106109
is CircleInst -> {
107110
val turtle = turtlePointers[inst.id]
108-
turtlePaint.color = turtle.color
109-
canvas.drawCircle(turtle.x, turtle.y, inst.radius, turtlePaint)
111+
if (turtle.isPenDown) {
112+
turtlePaint.color = turtle.color
113+
canvas.drawCircle(turtle.x, turtle.y, inst.radius, turtlePaint)
114+
}
110115
}
111116
is LineInst -> {
112117
val turtle = turtlePointers[inst.id]
113-
val angel = turtle.degree * Math.PI / 180
114-
val length = inst.length
115-
val endX = (turtle.x + length * sin(angel)).toFloat()
116-
val endY = (turtle.y + length * cos(angel)).toFloat()
118+
if (turtle.isPenDown) {
119+
val angel = turtle.degree * Math.PI / 180
120+
val length = inst.length
121+
val endX = (turtle.x + length * sin(angel)).toFloat()
122+
val endY = (turtle.y + length * cos(angel)).toFloat()
117123

118-
turtlePaint.color = turtle.color
119-
canvas.drawLine(turtle.x, turtle.y, endX, endY, turtlePaint)
124+
turtlePaint.color = turtle.color
125+
canvas.drawLine(turtle.x, turtle.y, endX, endY, turtlePaint)
120126

121-
turtlePointers[inst.id].x = endX
122-
turtlePointers[inst.id].y = endY
127+
turtlePointers[inst.id].x = endX
128+
turtlePointers[inst.id].y = endY
129+
}
123130
}
124131
is MoveXInst -> {
125132
turtlePointers[inst.id].x = inst.amount
@@ -145,6 +152,9 @@ class TurtleCanvasView @JvmOverloads constructor(
145152
is VisibilityInst -> {
146153
turtlePointers[inst.id].isVisible = inst.isVisible
147154
}
155+
is PenInst -> {
156+
turtlePointers[inst.id].isPenDown = inst.isDown
157+
}
148158
is SpeedInst -> {
149159
instructionSpeed = inst.time.toLong()
150160
}

app/src/main/java/com/amrdeveloper/turtle/ui/preview/TurtlePointer.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ data class TurtlePointer(
88
var degree: Float,
99
var color : Int = Color.BLACK,
1010
var isVisible: Boolean = true,
11+
var isPenDown : Boolean = true,
1112
)

lilo/src/main/java/com/amrdeveloper/lilo/ast/Statements.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,22 @@ class HidePointerStatement(
259259
}
260260
}
261261

262+
class PenUpStatement(
263+
override var id: Int = 0,
264+
) : TurtleStatement(id) {
265+
override fun <R> accept(visitor: StatementVisitor<R>): R {
266+
return visitor.visit(this)
267+
}
268+
}
269+
270+
class PenDownStatement(
271+
override var id: Int = 0,
272+
) : TurtleStatement(id) {
273+
override fun <R> accept(visitor: StatementVisitor<R>): R {
274+
return visitor.visit(this)
275+
}
276+
}
277+
262278
class StopStatement : Statement() {
263279
override fun <R> accept(visitor: StatementVisitor<R>): R {
264280
return visitor.visit(this)

lilo/src/main/java/com/amrdeveloper/lilo/ast/Visitors.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ interface StatementVisitor<R> {
4343
fun visit(statement: SleepStatement): R
4444
fun visit(statement: ShowPointerStatement): R
4545
fun visit(statement: HidePointerStatement): R
46+
fun visit(statement: PenUpStatement): R
47+
fun visit(statement: PenDownStatement): R
4648
fun visit(statement: StopStatement): R
4749
fun visit(statement: RotateStatement): R
4850
fun visit(statement: ForwardStatement): R

lilo/src/main/java/com/amrdeveloper/lilo/backend/Instruction.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class CircleInst(val id : Int, val radius : Float) : Instruction()
4848
class LineInst(var id : Int, val length : Float) : Instruction()
4949
class VisibilityInst(val id : Int, val isVisible : Boolean) : Instruction()
5050

51+
class PenInst(val id : Int, val isDown : Boolean) : Instruction()
52+
5153
class SleepInst(val time: Int) : Instruction()
5254

5355
class SpeedInst ( val time : Int ) : Instruction()

lilo/src/main/java/com/amrdeveloper/lilo/backend/LiloEvaluator.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,14 @@ class LiloEvaluator : TreeVisitor<Unit, Any> {
252252
emitInstruction(VisibilityInst(statement.id, false))
253253
}
254254

255+
override fun visit(statement: PenUpStatement) {
256+
emitInstruction(PenInst(statement.id, false))
257+
}
258+
259+
override fun visit(statement: PenDownStatement) {
260+
emitInstruction(PenInst(statement.id, true))
261+
}
262+
255263
override fun visit(statement: StopStatement) {
256264
shouldTerminate = true
257265
}

lilo/src/main/java/com/amrdeveloper/lilo/fmt/LiloFormatter.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ import com.amrdeveloper.lilo.ast.MoveXStatement
5454
import com.amrdeveloper.lilo.ast.MoveYStatement
5555
import com.amrdeveloper.lilo.ast.NewTurtleExpression
5656
import com.amrdeveloper.lilo.ast.NumberExpression
57+
import com.amrdeveloper.lilo.ast.PenDownStatement
58+
import com.amrdeveloper.lilo.ast.PenUpStatement
5759
import com.amrdeveloper.lilo.ast.RepeatStatement
5860
import com.amrdeveloper.lilo.ast.ReturnStatement
5961
import com.amrdeveloper.lilo.ast.RightStatement
@@ -230,6 +232,14 @@ class LiloFormatter : TreeVisitor<String, String> {
230232
return indentation() + "hide\n"
231233
}
232234

235+
override fun visit(statement: PenUpStatement): String {
236+
return indentation() + "penUp\n"
237+
}
238+
239+
override fun visit(statement: PenDownStatement): String {
240+
return indentation() + "penDown\n"
241+
}
242+
233243
override fun visit(statement: StopStatement): String {
234244
return indentation() + "stop\n"
235245
}

lilo/src/main/java/com/amrdeveloper/lilo/frontend/LiloParser.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ class LiloParser(private val tokens: List<Token>, private val diagnostics: LiloD
113113
TokenType.TOKEN_SPEED -> parseSpeedStatement()
114114
TokenType.TOKEN_POINTER_SHOW -> parsePointerShowStatement()
115115
TokenType.TOKEN_POINTER_HIDE -> parsePointerHideStatement()
116+
TokenType.TOKEN_PEN_UP -> parsePenUpStatement()
117+
TokenType.TOKEN_PEN_DOWN -> parsePenDownStatement()
116118
TokenType.TOKEN_STOP -> parseStopStatement()
117119
TokenType.TOKEN_ROTATE -> parseRotateStatement()
118120
TokenType.TOKEN_FORWARD -> parseForwardStatement()
@@ -244,6 +246,18 @@ class LiloParser(private val tokens: List<Token>, private val diagnostics: LiloD
244246
return HidePointerStatement()
245247
}
246248

249+
private fun parsePenUpStatement(): Statement {
250+
Timber.tag(TAG).d("Parse Pointer penUp statement")
251+
consume(TokenType.TOKEN_PEN_UP, "Expect penUp keyword.")
252+
return PenUpStatement()
253+
}
254+
255+
private fun parsePenDownStatement(): Statement {
256+
Timber.tag(TAG).d("Parse Pointer penDown statement")
257+
consume(TokenType.TOKEN_PEN_DOWN, "Expect penDown keyword.")
258+
return PenDownStatement()
259+
}
260+
247261
private fun parseStopStatement(): Statement {
248262
Timber.tag(TAG).d("Parse Stop statement")
249263
consume(TokenType.TOKEN_STOP, "Expect Stop keyword.")

lilo/src/main/java/com/amrdeveloper/lilo/frontend/LiloTokenizer.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ class LiloTokenizer(private val script : String) {
183183
"sleep" to TokenType.TOKEN_SLEEP,
184184
"show" to TokenType.TOKEN_POINTER_SHOW,
185185
"hide" to TokenType.TOKEN_POINTER_HIDE,
186+
"penUp" to TokenType.TOKEN_PEN_UP,
187+
"penDown" to TokenType.TOKEN_PEN_DOWN,
186188
"stop" to TokenType.TOKEN_STOP,
187189
"rotate" to TokenType.TOKEN_ROTATE,
188190
"forward" to TokenType.TOKEN_FORWARD,

lilo/src/main/java/com/amrdeveloper/lilo/frontend/TokenType.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ enum class TokenType {
4545
TOKEN_SLEEP,
4646
TOKEN_POINTER_SHOW,
4747
TOKEN_POINTER_HIDE,
48+
TOKEN_PEN_UP,
49+
TOKEN_PEN_DOWN,
4850
TOKEN_STOP,
4951
TOKEN_ROTATE,
5052
TOKEN_FORWARD,

0 commit comments

Comments
 (0)