问题描述
我正在 Kotlin / JVM 中创建一个标记化系统,它接收一个文件并将每个字符或字符序列作为标记返回。出于某种原因,每当我标记一个字符串时,它会在移动到下一个标记之前找到 s “字符串”标记的第二个实例,或者换句话说,标记没有顺序。我认为这可能与循环有关,但我无法弄清楚。我还在学习 Kotlin,所以如果有人也能给我指点,那就太好了!非常感谢任何帮助。
令牌输出:
[["chello",string],["tomo",[:,keyv],["hunna",["moobes",string]]
我的文件看起来像这样。
STORE "chello" : "tomo" as 1235312
SEND "hunna" in Hollo
GET "moobes"
GET "hunna"
fun tokenCreator (file: BufferedReader) {
var lexicon : String = file.readText()
val numRegex = Regex("^[1-9]\\d*(\\.\\d+)?\$")
val dataRegex = Regex("[(){}]")
val token = mutablelistof<List<Any>>()
for((index,char) in lexicon.withIndex()) {
println(char)
when {
char.isWhitespace() -> continue
char.toString() == ":" -> token.add(listof(char.toString(),"keyv") )
char.toString().matches(Regex("[()]")) -> token.add(listof(char,"group") )
char.toString().matches(dataRegex) -> token.add(listof(char,"data_group" ) )
char == '>' -> token.add(listof(char.toString(),"verbline") )
char == '"' -> {
var stringOf = ""
val firstQuote = lexicon.indexOf(char)
val secondQuote = lexicon.indexOf(char,firstQuote + 1)
if(firstQuote == -1 || secondQuote == -1) {
break
}
for(i in firstQuote..secondQuote) {
stringOf += lexicon[i]
}
lexicon = lexicon.substring(secondQuote + 1,lexicon.length)
token.add(listof(stringOf,"string"))
}
}
}
println(token)
}
解决方法
在迭代时更改内容似乎是一种混淆的方法...
而且您似乎没有增加索引以跳过已消费的内容。我建议以一种允许您跳过已消费内容的方式更改循环
我也会删除这一行:
lexicon = lexicon.substring(secondQuote + 1,lexicon.length)
然后替换
val firstQuote = lexicon.indexOf(char)
与
val firstQuote = index
您也可以使用 substring 代替 stringOf 迭代
val stringOf = lexicon.substring(
此外,使用 toString 检查 ':' 似乎效率低下