令牌不是为了令牌化/词法分析器(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 检查“:”似乎效率低下