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)