|
@@ -57,6 +57,7 @@ func NewCompiler(debug bool) *Compiler {
|
|
|
// second stage to push labels and determine the right
|
|
// second stage to push labels and determine the right
|
|
|
// position.
|
|
// position.
|
|
|
func (c *Compiler) Feed(ch <-chan token) {
|
|
func (c *Compiler) Feed(ch <-chan token) {
|
|
|
|
|
+ var prev token
|
|
|
for i := range ch {
|
|
for i := range ch {
|
|
|
switch i.typ {
|
|
switch i.typ {
|
|
|
case number:
|
|
case number:
|
|
@@ -73,10 +74,14 @@ func (c *Compiler) Feed(ch <-chan token) {
|
|
|
c.labels[i.text] = c.pc
|
|
c.labels[i.text] = c.pc
|
|
|
c.pc++
|
|
c.pc++
|
|
|
case label:
|
|
case label:
|
|
|
- c.pc += 5
|
|
|
|
|
|
|
+ c.pc += 4
|
|
|
|
|
+ if prev.typ == element && isJump(prev.text) {
|
|
|
|
|
+ c.pc++
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
c.tokens = append(c.tokens, i)
|
|
c.tokens = append(c.tokens, i)
|
|
|
|
|
+ prev = i
|
|
|
}
|
|
}
|
|
|
if c.debug {
|
|
if c.debug {
|
|
|
fmt.Fprintln(os.Stderr, "found", len(c.labels), "labels")
|
|
fmt.Fprintln(os.Stderr, "found", len(c.labels), "labels")
|
|
@@ -181,6 +186,8 @@ func (c *Compiler) compileElement(element token) error {
|
|
|
pos := big.NewInt(int64(c.labels[rvalue.text])).Bytes()
|
|
pos := big.NewInt(int64(c.labels[rvalue.text])).Bytes()
|
|
|
pos = append(make([]byte, 4-len(pos)), pos...)
|
|
pos = append(make([]byte, 4-len(pos)), pos...)
|
|
|
c.pushBin(pos)
|
|
c.pushBin(pos)
|
|
|
|
|
+ case lineEnd:
|
|
|
|
|
+ c.pos--
|
|
|
default:
|
|
default:
|
|
|
return compileErr(rvalue, rvalue.text, "number, string or label")
|
|
return compileErr(rvalue, rvalue.text, "number, string or label")
|
|
|
}
|
|
}
|
|
@@ -201,8 +208,8 @@ func (c *Compiler) compileElement(element token) error {
|
|
|
case stringValue:
|
|
case stringValue:
|
|
|
value = []byte(rvalue.text[1 : len(rvalue.text)-1])
|
|
value = []byte(rvalue.text[1 : len(rvalue.text)-1])
|
|
|
case label:
|
|
case label:
|
|
|
- value = make([]byte, 4)
|
|
|
|
|
- copy(value, big.NewInt(int64(c.labels[rvalue.text])).Bytes())
|
|
|
|
|
|
|
+ value = big.NewInt(int64(c.labels[rvalue.text])).Bytes()
|
|
|
|
|
+ value = append(make([]byte, 4-len(value)), value...)
|
|
|
default:
|
|
default:
|
|
|
return compileErr(rvalue, rvalue.text, "number, string or label")
|
|
return compileErr(rvalue, rvalue.text, "number, string or label")
|
|
|
}
|
|
}
|