I'm writing a simple math equation lexer and I've come to a point where I need
to join two terminal tokens to make a non-terminal token.
Here's an excerpt:
type
Token* = ref object of RootObj
position*: int
DigitToken = ref object of Token
value: uint
NumberToken = ref object of Token
value: int
method joinTokens*(a, b: Token): Token {.base.} =
quit "joinTokens base called " & repr(a) & "\n" & repr(b)
method joinTokens*(a, b: DigitToken): NumberToken =
result = NumberToken()
result.position = max(a.position, b.position)
result.value = int(a.value*10 + b.value)
method joinTokens*(a: NumberToken, b: DigitToken): NumberToken =
result = NumberToken()
result.position = max(a.position, b.position)
result.value = a.value*10 + int(b.value)
var digits: seq[Token]
digits.add DigitToken(value:1, position:0)
digits.add DigitToken(value:2, position:1)
var numberA = joinTokens(digits[0], digits[1])
Run
I've compiled it with `--multimethods:on`. I wanted `method joinTokens*(a, b:
DigitToken): NumberToken` to be called, but instead `method joinTokens*(a, b:
Token): Token {.base.}` gets called.
What can I do? I've tried `type case of` and I'd rather prefer to use this
parent-children hierachy I have now.