Проблемы с реализацией лексер-парсера с помощью операторов цикла в Kotlin (StringIndexOutOfBoundsException) - PullRequest
1 голос
/ 26 сентября 2019

Я хочу реализовать простой лексер в 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 индекса в строке?

1 Ответ

0 голосов
/ 26 сентября 2019

Вы можете проверить, достигнут ли конец, прежде чем увеличивать.

if (CharIndex < Code.length) {
    CharIndex++
}
...