令牌不是为了令牌化/词法分析器(kotlin)
Tokens not in order for tokenization / lexer (kotlin)
我正在 Kotlin/JVM 中创建一个标记化系统,它接受一个文件和 returns 每个字符或字符序列作为标记。出于某种原因,每当我标记一个字符串时,它都会在移动到下一个标记之前找到 s“string”标记的第二个实例,或者换句话说,标记没有顺序。我认为这可能与循环有关,但我无法弄清楚。我还在学习 Kotlin,所以如果有人也能给我指点,那就太好了!非常感谢任何帮助。
代币输出:
[["chello", string], ["tomo", string], [:, keyV], ["hunna", string], ["moobes", string], ["hunna", 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
对于 stringOf
,您也可以使用子字符串而不是迭代
val stringOf = lexicon.substring(
此外,使用 toString 检查“:”似乎效率低下
我正在 Kotlin/JVM 中创建一个标记化系统,它接受一个文件和 returns 每个字符或字符序列作为标记。出于某种原因,每当我标记一个字符串时,它都会在移动到下一个标记之前找到 s“string”标记的第二个实例,或者换句话说,标记没有顺序。我认为这可能与循环有关,但我无法弄清楚。我还在学习 Kotlin,所以如果有人也能给我指点,那就太好了!非常感谢任何帮助。
代币输出:
[["chello", string], ["tomo", string], [:, keyV], ["hunna", string], ["moobes", string], ["hunna", 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
对于 stringOf
,您也可以使用子字符串而不是迭代 val stringOf = lexicon.substring(
此外,使用 toString 检查“:”似乎效率低下