From 3ee6675e72841dc88331a0e11345c6abd3fa9fb1 Mon Sep 17 00:00:00 2001 From: Kagura Date: Wed, 19 Jun 2024 21:03:45 +0800 Subject: [PATCH] Add remove left recusive --- LL1/src/AnalyzeTable.kt | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/LL1/src/AnalyzeTable.kt b/LL1/src/AnalyzeTable.kt index f22ef5b..dee0b25 100644 --- a/LL1/src/AnalyzeTable.kt +++ b/LL1/src/AnalyzeTable.kt @@ -13,25 +13,40 @@ class AnalyzeTable { constructor() : this( """ - E ::= TE' - E' -> +TE'|ε - T -> FT' - T' ::= *FT'|ε - F -> (E)|i + E->E+T|T + T->T*F|F + F->(E)|i """.trimIndent() ) constructor(lang: String, _s: String? = null) { start = _s ?: lang.trim()[0].toString() - val lang = if ("::=" in lang) { // 换成一个符号方便 + val newLang = if ("::=" in lang) { // 换成一个符号方便 lang.replace("::=", "->") } else { lang } + // 检查并消除左递归 + var noLeftRecLang = "" + for (line in newLang.split("\n")) { + val l = line.split("->")[0] + val r = line.split("->")[1] + + if (r.startsWith(l)){ + val rec = r.split("|", limit = 2)[0].substring(l.length) + val rest = r.split("|", limit = 2)[1] + noLeftRecLang += "$l->$rest$l'\n" + + "$l'->$rec$l'|$NULL\n" + }else{ + noLeftRecLang += line + } + + } + // 先拆分 - lang.split("\n").forEach { s -> + noLeftRecLang.split("\n").forEach { s -> val vn = s.split("->")[0].trim() if (vn.isNotEmpty() && !V_n.contains(vn)) { V_n.add(vn)