令牌不是为了标记化/词法分析器 (kotlin)

问题描述

我正在 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 检查 ':' 似乎效率低下