【问题标题】:Tokens not in order for tokenization / lexer (kotlin)令牌不适合令牌化/词法分析器(kotlin)
【发布时间】:2025-11-29 15:05:02
【问题描述】:

我正在 Kotlin / JVM 中创建一个标记化系统,它接收一个文件并将每个字符或字符序列作为标记返回。出于某种原因,每当我对字符串进行标记时,它都会在移动到下一个标记之前找到 s“字符串”标记的第二个实例,或者换句话说,标记不按顺序排列。我认为这可能与循环有关,但我无法弄清楚。我还在学习 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)

    }

【问题讨论】:

    标签: loops kotlin jvm token lexer


    【解决方案1】:

    在迭代时更改内容似乎是一种混乱的秘诀......

    而且您似乎没有增加索引来跳过消费的内容。我建议以允许您跳过已消费内容的方式更改循环

    我也会删除这一行:

    lexicon = lexicon.substring(secondQuote + 1, lexicon.length)
    

    然后替换

      val firstQuote = lexicon.indexOf(char)
    

      val firstQuote = index
    

    你也可以使用 substring 来代替 stringOf 的迭代

      val stringOf = lexicon.substring(
    

    此外,使用 toString 来检查 ':' 似乎效率低下

    【讨论】:

    • 非常感谢您的帮助。