Seems like there is a bug, if you comment out the first method you get
    
    
    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: DigitToken, 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
    
    
    Error: type mismatch: got <Token, Token>
    but expected one of:
    method joinTokens(a: DigitToken; b: DigitToken): NumberToken
      first type mismatch at position: 1
      required type for a: DigitToken
      but expression 'digits[0]' is of type: Token
    method joinTokens(a: NumberToken; b: DigitToken): NumberToken
      first type mismatch at position: 1
      required type for a: NumberToken
      but expression 'digits[0]' is of type: Token
    
    expression: joinTokens(digits[0], digits[1])
    
    
    Run

You can raise it in the issue tracker: 
[https://github.com/nim-lang/Nim/issues](https://github.com/nim-lang/Nim/issues)

Apart from that I really don't like to pull the "actually what you are asking 
is not what you want" card, but this is not how you should write a lexer.

I suggest you use the npegs module which will let you define a grammar in a 
declarative way: [https://github.com/zevv/npeg](https://github.com/zevv/npeg)

Reply via email to