Add README.md
This commit is contained in:
parent
978699086c
commit
7db9d93132
2 changed files with 108 additions and 11 deletions
|
@ -14,17 +14,21 @@ class AnalyzeTable {
|
||||||
|
|
||||||
constructor() : this(
|
constructor() : this(
|
||||||
"""
|
"""
|
||||||
E -> TE'
|
E ::= TE'
|
||||||
E' -> +TE'|ε
|
E' -> +TE'|ε
|
||||||
T -> FT'
|
T -> FT'
|
||||||
T' -> *FT'|ε
|
T' ::= *FT'|ε
|
||||||
F -> (E)|i
|
F -> (E)|i
|
||||||
""".trimIndent(),
|
""".trimIndent())
|
||||||
"E"
|
|
||||||
)
|
|
||||||
|
|
||||||
constructor(lang: String, _s: String) {
|
constructor(lang: String, _s: String? = null) {
|
||||||
start = _s
|
start = _s?:lang.trim()[0].toString()
|
||||||
|
|
||||||
|
val lang = if ("::=" in lang){ // 换成一个符号方便
|
||||||
|
lang.replace("::=","->")
|
||||||
|
}else{
|
||||||
|
lang
|
||||||
|
}
|
||||||
|
|
||||||
// 先拆分
|
// 先拆分
|
||||||
lang.split("\n").forEach { s ->
|
lang.split("\n").forEach { s ->
|
||||||
|
@ -227,11 +231,16 @@ class AnalyzeTable {
|
||||||
|
|
||||||
|
|
||||||
if (backup == copy) {
|
if (backup == copy) {
|
||||||
throw RuntimeException(
|
var pad = ""
|
||||||
|
for (i in 0..(string.length - copy.length) + 1) {
|
||||||
|
pad += " "
|
||||||
|
}
|
||||||
|
|
||||||
|
throw UnknownSymbolException(
|
||||||
"""
|
"""
|
||||||
出现了未知符号${copy[0]}
|
出现了未知符号: ${copy[0]}
|
||||||
at: $copy
|
at: $string
|
||||||
^---------This
|
$pad^---------This
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -302,4 +311,6 @@ class AnalyzeTable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class UnknownSymbolException(msg: String) : Exception("\n"+msg)
|
||||||
}
|
}
|
86
LL1/src/README.md
Normal file
86
LL1/src/README.md
Normal file
|
@ -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, 请勿直接抄袭
|
Loading…
Reference in a new issue