# 作业信息 | 课程 | 实验名称 | |------|----------| | 编译原理 | 语法分析器的构造 | # 要求 ## 《语法分析器的构造》综合性实验大纲 ### 一、实验目的 设计、编制、调试一个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, 请勿直接抄袭