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.

Reply via email to