【问题标题】:Problems with lexer parser implementation with loop statements in Kotlin (StringIndexOutOfBoundsException)在 Kotlin 中使用循环语句实现词法分析器解析器的问题 (StringIndexOutOfBoundsException)
【发布时间】:2020-01-26 16:16:10
【问题描述】:

我想在 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 变量超出字符串中的索引?

【问题讨论】:

    标签: kotlin while-loop indexoutofboundsexception


    【解决方案1】:

    你可以在递增之前检查是否已经到达终点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多