diff --git a/LL1/src/AnalyzeTable.kt b/LL1/src/AnalyzeTable.kt index 1dd4a47..796271d 100644 --- a/LL1/src/AnalyzeTable.kt +++ b/LL1/src/AnalyzeTable.kt @@ -14,17 +14,21 @@ class AnalyzeTable { constructor() : this( """ - E -> TE' + E ::= TE' E' -> +TE'|ε T -> FT' - T' -> *FT'|ε + T' ::= *FT'|ε F -> (E)|i - """.trimIndent(), - "E" - ) + """.trimIndent()) - constructor(lang: String, _s: String) { - start = _s + constructor(lang: String, _s: String? = null) { + start = _s?:lang.trim()[0].toString() + + val lang = if ("::=" in lang){ // 换成一个符号方便 + lang.replace("::=","->") + }else{ + lang + } // 先拆分 lang.split("\n").forEach { s -> @@ -227,11 +231,16 @@ class AnalyzeTable { if (backup == copy) { - throw RuntimeException( + var pad = "" + for (i in 0..(string.length - copy.length) + 1) { + pad += " " + } + + throw UnknownSymbolException( """ - 出现了未知符号${copy[0]} - at: $copy - ^---------This + 出现了未知符号: ${copy[0]} + at: $string + $pad^---------This """.trimIndent() ) } @@ -302,4 +311,6 @@ class AnalyzeTable { } } } + + class UnknownSymbolException(msg: String) : Exception("\n"+msg) } \ No newline at end of file diff --git a/LL1/src/README.md b/LL1/src/README.md new file mode 100644 index 0000000..6689081 --- /dev/null +++ b/LL1/src/README.md @@ -0,0 +1,86 @@ +# 作业信息 +| 课程 | 实验名称 | +|------|----------| +| 编译原理 | 语法分析器的构造 | + +# 要求 +## 《语法分析器的构造》综合性实验大纲 +### 一、实验目的 +设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。 +### 二、实验内容 +设计并实现一个LL(1)语法分析器,实现对算术文法 +``` +E->E+T|T +T->T*F|F +F->(E)|i +``` +所定义的符号串进行识别,例如符号串`98+99+80`为文法所定义的句子,符号串`(106-80(*95)`不是文法所定义的句子。 +### 三、实验要求 +- 1、检测左递归,如果有则进行消除; +- 2、求解FIRST集和FOLLOW集; +- 3、构建LL(1)分析表; +- 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。 +以上实验要求可分两个同学完成。例如构建分析表一个同学完成、构建分析程序并分析符号串一个同学完成。 +### 四、实验报告 +参看《考核方法及实验/实习报告》中实验报告内容及要求。 +### 五、思考题 +1. 能否不采用预先定义的文法,而是允许用户输入文法的若干规则,生成文法? + +# 结果 +``` +输入的文法: +0: E->TE' +1: E'->+TE' +2: E'->ε +3: T->FT' +4: T'->*FT' +5: T'->ε +6: F->(E) +7: F->i +分析表: +E,(: E->TE' +E,i: E->TE' +E',+: E'->+TE' +E',#: E'->ε +E',): E'->ε +T,(: T->FT' +T,i: T->FT' +T',*: T'->*FT' +T',+: T'->ε +T',#: T'->ε +T',): T'->ε +F,(: F->(E) +F,i: F->i +分析过程:98+99+80 +1: #E i+i+i# E->TE' +2: #E'T i+i+i# T->FT' +3: #E'T'F i+i+i# F->i +4: #E'T'i i+i+i# +5: #E'T' +i+i# T'->ε +6: #E' +i+i# E'->+TE' +7: #E'T+ +i+i# +8: #E'T i+i# T->FT' +9: #E'T'F i+i# F->i +10: #E'T'i i+i# +11: #E'T' +i# T'->ε +12: #E' +i# E'->+TE' +13: #E'T+ +i# +14: #E'T i# T->FT' +15: #E'T'F i# F->i +16: #E'T'i i# +17: #E'T' # T'->ε +18: #E' # E'->ε +19: # # 成功 +分析过程:(106-80(*95) +Exception in thread "main" AnalyzeTable$UnknownSymbolException: +出现了未知符号: - +at: (i-i(*i) + ^---------This + at AnalyzeTable.splitToVn(AnalyzeTable.kt:239) + at AnalyzeTable.analyze(AnalyzeTable.kt:258) + at MainKt.main(Main.kt:19) + at MainKt.main(Main.kt) +``` + +# Credits +2024 Kagura, 请勿直接抄袭 \ No newline at end of file