Skip to content

Commit 3bc9504

Browse files
committed
move to token-based parsing
1 parent 599cc6d commit 3bc9504

File tree

2 files changed

+65
-60
lines changed

2 files changed

+65
-60
lines changed

fieldeditors.ts

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ namespace microcode {
3535
toString(field: any): string {
3636
return ""
3737
}
38-
fromString(text: string): any {
38+
fromTokens(tokens: string[]): any {
3939
return undefined
4040
}
4141
}
@@ -102,8 +102,9 @@ namespace microcode {
102102
toString(field: BoxedNumAsStr) {
103103
return field.num
104104
}
105-
fromString(txt: string) {
106-
return { num: txt }
105+
fromTokens(tokens: string[]) {
106+
// TODO: check that we have a number
107+
return { num: tokens.length > 0 ? tokens[0] : "0" }
107108
}
108109
}
109110

@@ -183,22 +184,21 @@ namespace microcode {
183184
return img
184185
}
185186
toString(img: Bitmap) {
186-
let ret = ""
187+
let ret = "`"
187188
for (let row = 0; row < 5; row++) {
188189
for (let col = 0; col < 5; col++) {
189190
ret += img.getPixel(col, row) ? `1` : `.`
190191
if (col < 4) ret += " "
191192
}
192193
ret += `\n`
193194
}
194-
return ret
195+
return ret + "`"
195196
}
196-
fromString(txt: string): Bitmap {
197+
fromTokens(tokens: string[]): Bitmap {
197198
let ret = bitmaps.create(5, 5)
198-
let seq = txt.split("\n").join(" ").split(" ")
199-
seq.forEach((s, i) => {
200-
ret.setPixel(i % 5, Math.idiv(i, 5), s == "1" ? 1 : 0)
201-
})
199+
for (let i = 0; i < tokens.length && i < 25; i++) {
200+
ret.setPixel(i % 5, Math.idiv(i, 5), tokens[i] == "1" ? 1 : 0)
201+
}
202202
return ret
203203
}
204204
}
@@ -235,20 +235,22 @@ namespace microcode {
235235

236236
export function melodyToNotes(melody: Melody) {
237237
const notes = melody.notes.split("")
238-
let result = ""
238+
let result = "`"
239239
for (const n of notes) {
240240
if (n == ".") result += "- "
241241
else result += noteNames[parseInt(n)] + " "
242242
}
243-
return result
243+
return result + "`"
244244
}
245245

246-
function notesToMelody(txt: string) {
247-
const seq = txt.split(" ")
246+
function notesToMelody(tokens: string[]) {
248247
let res = ""
249-
seq.forEach((note, index) => {
248+
tokens.forEach((note, index) => {
250249
if (note == "-") res += "."
251-
else res += noteNames.indexOf(note).toString()
250+
else {
251+
const index = noteNames.indexOf(note)
252+
if (index >= 0) res += index.toString()
253+
}
252254
})
253255
return { notes: res, tempo: 120 }
254256
}
@@ -312,8 +314,8 @@ namespace microcode {
312314
toString(melody: Melody): string {
313315
return melodyToNotes(melody)
314316
}
315-
fromString(txt: string): Melody {
316-
return notesToMelody(txt)
317+
fromTokens(tokens: string[]): Melody {
318+
return notesToMelody(tokens)
317319
}
318320
}
319321

mcparser.ts

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -56,71 +56,74 @@ namespace microcode {
5656
}
5757
}
5858
const addTile = (tile: Tile, rule: RuleDefn) => {
59+
control.assert(rule != undefined)
5960
const tid = getTid(tile)
61+
if (isSensor(tid)) rule.push(tile, "sensors", false)
6062
if (isFilter(tid)) rule.push(tile, "filters", false)
6163
else if (isModifier(tid)) rule.push(tile, "modifiers", false)
6264
else rule.push(tile, "actuators", false)
6365
}
66+
let cursor = 0
67+
const whiteSpace = (s: string) => {
68+
return s == " " || s == "\n" || s == "\t"
69+
}
70+
const getToken = () => {
71+
let prev = cursor
72+
let gotToken = false
73+
while (cursor < str.length) {
74+
if (whiteSpace(str[cursor])) {
75+
if (gotToken) return str.slice(prev, cursor)
76+
cursor++
77+
prev = cursor
78+
} else {
79+
gotToken = true
80+
cursor++
81+
}
82+
}
83+
if (gotToken) return str.slice(prev, cursor)
84+
return undefined
85+
}
6486
const prog = new ProgramDefn()
6587
prog.pages = []
66-
const lines = str.split("\n")
88+
6789
let currPage: PageDefn = undefined
6890
let currRule: RuleDefn = undefined
6991
let currTile: Tile = undefined
70-
for (let i = 0; i < lines.length; i++) {
71-
console.log(`lines[${i}] = ${lines[i]}`)
72-
if (currTile && currTile instanceof IconEditor) {
73-
const all5 = lines.slice(i, i + 5).join("\n")
74-
console.log(`get the image?\n${all5}`)
75-
currTile.field = currTile.fieldEditor.fromString(all5)
76-
currTile = undefined
77-
i = i + 4 // loop count adds one more
78-
continue
79-
}
80-
const tokens = lines[i].split(" ")
81-
if (tokens.length == 0) continue
82-
console.log(`tokens = ${tokens.join(":")}`)
83-
let tok = tokens.shift()
92+
let tok: string = undefined
93+
while ((tok = getToken())) {
8494
console.log(`tok1 = ${tok}`)
85-
if (tok == "Page") {
95+
if (currTile) {
96+
if (
97+
currTile instanceof IconEditor ||
98+
currTile instanceof MelodyEditor
99+
) {
100+
control.assert(tok == "`")
101+
let iconTokens = []
102+
while ((tok = getToken()) != "`") iconTokens.push(tok)
103+
control.assert(tok == "`")
104+
currTile.field = currTile.fieldEditor.fromTokens(iconTokens)
105+
} else if (currTile instanceof DigitEditor) {
106+
currTile.field = currTile.fieldEditor.fromTokens([tok])
107+
}
108+
currTile = undefined
109+
} else if (tok == "Page") {
86110
if (currPage) {
87111
if (currRule) currPage.rules.push(currRule)
88112
prog.pages.push(currPage)
89113
currRule = undefined
90114
}
91115
currPage = new PageDefn()
116+
getToken() // consume page #
92117
continue
93118
} else if (tok == "When") {
94119
control.assert(currPage != undefined)
95120
if (currRule) currPage.rules.push(currRule)
96-
currRule = undefined
97-
tok = tokens.shift()
98-
}
99-
for (; tok !== undefined; tok = tokens.shift()) {
100-
console.log(`tok2 = ${tok}`)
101-
if (!tok) continue
102-
if (!currRule) {
103-
currRule = new RuleDefn()
104-
// can we have When followed by Do?
105-
currRule.sensors.push(token2tile(tok) as number)
106-
continue
107-
}
108-
if (tok == "Do") continue
121+
currRule = new RuleDefn()
122+
} else if (tok == "Do") {
123+
control.assert(currRule != undefined)
124+
} else {
109125
currTile = token2tile(tok)
110126
addTile(currTile, currRule)
111-
if (currTile instanceof IconEditor) {
112-
console.log(`got IconEditor`)
113-
break
114-
} else if (currTile instanceof DigitEditor) {
115-
currTile.field = currTile.fieldEditor.fromString(tok)
116-
currTile = undefined
117-
} else if (currTile instanceof MelodyEditor) {
118-
currTile.field = currTile.fieldEditor.fromString(
119-
tok + tokens.join(" ")
120-
)
121-
currTile = undefined
122-
break
123-
}
124127
}
125128
}
126129
if (currRule) currPage.rules.push(currRule)

0 commit comments

Comments
 (0)