Я хочу реализовать простой лексер в Kotlin.Я написал следующий код, чтобы получить целое число в качестве токена.
private var Code = "1+2*20-11%12*2"
private var CharIndex = 0
fun main(args:Array<String>)
{
println("Input Code : ${Code}\n")
lex().forEach{
println("${it.TokenType} ${it.TokenText}")
}
}
//Call ScanToken Method
fun lex():Array<Token>
{
for(i in 0..Code.length - 1)
ScanToken()
Tokens.add(RilioToken("", RilioTokenType.EOF))
return Tokens.toTypedArray()
}
private fun ScanToken()
{
var ch = Code[CharIndex].toString()
if(isNumeric(ch)){ //When it's a Integer
var TempIntString = ch
CharIndex++
while(isNumeric(Code[CharIndex].toString())) //Keep receiving until receive non-numeric char.
{
TempIntString = TempIntString + Code[CharIndex].toString()
CharIndex++
}
Tokens.add(Token(TempIntString, TokenType.Int)) //Return collected numbers
println(TempIntString) //TEST Code
}
//other string
else{Tokens.add(RilioToken(ch, TokenType.None))}
CharIndex++
}
Я думал, что код будет работать следующим образом:
Input Code : 1+2*20-11%12*2
1
2
20
11
12
2
Int 1
Int 2
Int 20
Int 11
Int 12
Int 2
Однако я получил следующую ошибку в коде.
Input Code : 1+2*20-11%12*2
1
2
20
11
12
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 14
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)
at java.base/java.lang.String.charAt(String.java:702)
at com.ril.Riliolang.RilioLexer.ScanToken(RilioLexer.kt:77)
at com.ril.Riliolang.RilioLexer.lex(RilioLexer.kt:16)
at com.ril.Riliolang.TestKt.main(test.kt:8)
Как я могу предотвратить превышение переменной CharIndex индекса в строке?