Skip to content

Commit 6b04088

Browse files
committed
Add IOAnalysis, addressing #22
1 parent 8d02ed2 commit 6b04088

File tree

4 files changed

+52
-16
lines changed

4 files changed

+52
-16
lines changed

src/main/groovy/net/zomis/brainf/analyze/Brainalyze.groovy

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ class Brainalyze implements BrainfuckListener {
1717
private final int[] actionsPerCommand
1818
private final int[] codeCommands
1919
private final MemoryCell[] cells
20-
private final IndexCounters whileLoopCounts = new IndexCounters()
2120
private final List<Map> problematicCommands = []
2221
private final GroovyBFContext groovy
2322
@PackageScope final Map<Class<?>, Object> analysis = [:]
@@ -147,10 +146,6 @@ class Brainalyze implements BrainfuckListener {
147146
this.memoryIndexBelowZero = true
148147
}
149148

150-
if (command == BrainFCommand.READ) {
151-
cell.userInputs.add(codeIndex)
152-
}
153-
154149
switch (command) {
155150
case BrainFCommand.ADD:
156151
case BrainFCommand.SUBTRACT:
@@ -162,9 +157,6 @@ class Brainalyze implements BrainfuckListener {
162157
break
163158
}
164159

165-
if (command == BrainFCommand.WRITE) {
166-
cell.prints.add(codeIndex)
167-
}
168160
}
169161

170162
@Override

src/main/groovy/net/zomis/brainf/analyze/MemoryCell.groovy

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ class MemoryCell {
1515

1616
final int index
1717
boolean used
18-
IndexCounter prints = new IndexCounter('print')
19-
IndexCounter userInputs = new IndexCounter('userInput')
2018

2119
private final Map<Class<?>, Object> analysis = [:]
2220

@@ -60,8 +58,7 @@ class MemoryCell {
6058
Stream<CellTagger> taggers = this.analysis.values().stream()
6159
.filter({it instanceof CellTagger})
6260
.map({it as CellTagger})
63-
Stream<CellTagger> oldTaggers = Stream.of(prints, userInputs)
64-
Stream.concat(taggers, oldTaggers)
61+
taggers
6562
.flatMap({it.tags(loopNames)})
6663
.sorted()
6764
.collect(countingCollector())
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package net.zomis.brainf.analyze.analyzers
2+
3+
import net.zomis.brainf.analyze.BrainfuckAnalyzer
4+
import net.zomis.brainf.analyze.CellTagger
5+
import net.zomis.brainf.analyze.IndexCounter
6+
import net.zomis.brainf.analyze.MemoryCell
7+
import net.zomis.brainf.model.BrainfuckCommand
8+
import net.zomis.brainf.model.BrainfuckRunner
9+
import net.zomis.brainf.model.classic.BrainFCommand
10+
11+
import java.util.function.Function
12+
import java.util.stream.Stream
13+
14+
class IOAnalysis implements BrainfuckAnalyzer {
15+
16+
public static class CellIO implements CellTagger {
17+
IndexCounter prints = new IndexCounter('print')
18+
IndexCounter userInputs = new IndexCounter('userInput')
19+
20+
@Override
21+
Stream<String> tags(Function<Integer, String> indexToStringFunction) {
22+
return Stream.concat(prints.tags(indexToStringFunction), userInputs.tags(indexToStringFunction))
23+
}
24+
25+
@Override
26+
String toString() { 'CellIO ' }
27+
}
28+
29+
@Override
30+
Object createMemoryData() {
31+
return new CellIO()
32+
}
33+
34+
@Override
35+
void beforePerform(MemoryCell cell, BrainfuckRunner runner, BrainfuckCommand command) {
36+
int codeIndex = runner.code.commandIndex
37+
if (command == BrainFCommand.READ) {
38+
cell.data(this, CellIO).userInputs.add(codeIndex)
39+
}
40+
41+
if (command == BrainFCommand.WRITE) {
42+
cell.data(this, CellIO).prints.add(codeIndex)
43+
}
44+
45+
}
46+
}

src/test/groovy/net/zomis/brainf/BrainTest.groovy

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.zomis.brainf
22

33
import net.zomis.brainf.analyze.IndexCounters
44
import net.zomis.brainf.analyze.MemoryCell
5+
import net.zomis.brainf.analyze.analyzers.IOAnalysis
56
import net.zomis.brainf.analyze.analyzers.MemoryValues
67
import net.zomis.brainf.analyze.analyzers.ReadWriteAnalysis
78
import net.zomis.brainf.analyze.analyzers.WhileLoopAnalysis
@@ -70,7 +71,7 @@ public class BrainTest extends BrainfuckTest {
7071
public void userInputTag() {
7172
String commands = '++++[->,<]'
7273
brain = BrainF.createFromCodeAndInput(30, commands, 'INPUT')
73-
analyze()
74+
analyze(new IOAnalysis())
7475
cellTagsContains(analyze.cell(1), 'userInput')
7576
}
7677

@@ -138,9 +139,9 @@ public class BrainTest extends BrainfuckTest {
138139
@Test
139140
public void printedMemory() {
140141
source.addCommands('>.<+++.[-.]')
141-
analyze()
142-
assert analyze.cell(0).prints.toString() == '[6, 9 * 3]' // printed by code index 6 once, code index 9 thrice
143-
assert analyze.cell(1).prints.toString() == '[1]'
142+
analyze(new IOAnalysis())
143+
assert analyze.cell(0).data(IOAnalysis.CellIO).prints.toString() == '[6, 9 * 3]' // printed by code index 6 once, code index 9 thrice
144+
assert analyze.cell(1).data(IOAnalysis.CellIO).prints.toString() == '[1]'
144145
}
145146

146147
@Test

0 commit comments

Comments
 (0)