☰
Java实现SLR(1)语法分析器:从FIRST/FOLLOW到分析表与双栈驱动
2026/11/6 5:40:54 网站建设 项目流程

简介:面向编译原理课程实验的 SLR(1) 语法分析器 Java 实现,适合计算机专业学生、课程设计者以及希望弄清自底向上解析流程的自学者。内容围绕上下文无关文法展开,涵盖文法表示、消除左递归与左公因子、FOLLOW 集构造、闭包与 GOTO 集计算、分析表生成及逐符号移进归约的解析过程,可用于对照实验要求理解 SLR(1) 的建表逻辑与运行机制。压缩包共 85 个文件,约 40KB,以 76 个 Java 源文件为主体,另有 6 个 XML 配置及 iml、gitignore、txt 等辅助文件,整体为可导入 IDE 的 Maven 项目结构,便于阅读源码、调试断点与二次修改。已有 524 人学习,适合作为课程实验参考、算法梳理样本和排错对照材料。

1. 手推分析表总是差一格?先看清这套 SLR(1) 分析器能替你做哪几步

编译原理实验做到语法分析这一节,大概率会撞上同一个场景:老师丢过来一份文法,要求求 FIRST/FOLLOW、画 LR(0) 项目集规范族、填 SLR(1) 分析表,最后拿一个句子手推移进-归约。推到第三个状态就开始对不上,回头看是 FOLLOW 集漏了一个符号,整张表跟着错位。这份 Java 写的 SLR(1) 语法分析器实验工程,就是把上面这套流程全部代码化:读入文法文件,自动算 FIRST/FOLLOW、生成项目集规范族、填 ACTION/GOTO 表,再用双栈驱动分析输入串,每一步打印状态栈、符号栈、剩余输入和动作。它适合正在做编译原理实验、想拿机器结果对照手工推导的人,也适合想把分析表接到界面上做演示的开发者。

2. 项目骨架与运行链:从目录结构到一次完整输出

这个工程没有把全部逻辑塞进一个Main.java,而是按「领域对象—算法—驱动—输入输出」拆成了四层。这样拆的好处很直接:换文法不用碰算法,换输出格式不用碰分析表构造,调驱动逻辑时也不会被一堆打印语句干扰。下面按目录、文法格式、启动方式三块讲清楚。

2.1 目录结构与模块职责

工程是标准 Maven 布局,Java 源码放在src/main/java下,根包名可以按自己习惯改。核心目录如下:

路径职责关键类
model/文法与项目的领域对象Production、Item、Grammar、Action
algo/FIRST/FOLLOW、LR(0) 规范族、分析表构造FirstFollow、LR0Automaton、SLRTable
driver/双栈分析器Parser
io/文法读取与表格打印GrammarReader、TablePrinter
grammar/示例文法文件expr.txt、sample.txt
input/待分析句子expr_ok.txt

模块之间的依赖是单向的:io依赖model,algo依赖model,driver同时依赖algo和model,Main负责把整条链路串起来。这种依赖方向不是画着好看的,它直接决定你后面改代码的成本。比如实验指导书换了一份文法,你只需要改grammar/下的文本;想把分析表输出成 Markdown 表格交作业,只需要改TablePrinter,算法层一行不用动。

我一般会再加一个util/包放Set求交并差、集合拷贝这类小工具,但这个工程体量不大,直接写在各个类里也能接受。真正值得保持的是「算法层不打印」这条纪律,打印集中在TablePrinter和Parser里,否则调试时满屏输出,根本看不清是哪一步出的问题。

2.2 文法文件的格式与读取约束

文法文件是纯文本,一行一条产生式,写法尽量贴近实验指导书:

# 经典表达式文法,第一行左部 E 是开始符号 E -> E + T | T T -> T * F | F F -> ( E ) | id

读取时有几条隐含约定,不写清楚很容易在第一次运行就翻车:

  • #开头是注释行,空行跳过。
  • 箭头支持->和→两种写法,照顾从文档里直接复制的情况。
  • |分隔同一左部的多个候选式,读取时展开成多条产生式。
  • 空产生式写ε或@,内部转成空列表。
  • 开始符号默认取第一行左部;所有出现在右部但不在左部集合里的符号,自动判定为终结符。
  • 结尾符$由程序追加,不需要在文法文件里写。

这里有一个顺序问题:必须先扫一遍所有左部,收集齐非终结符集合,再扫右部判定终结符。如果边读边判,E -> E + T里的E在右部出现时,非终结符集合还没建完,就会被误判成终结符,后面 FIRST 集直接算错。这个坑我在第 5 章还会展开。

另外,默认实现按单字符切分右部,也就是说id会被拆成i和d两个符号。教学文法里id通常当整体用,所以读取器要留一个「多字符终结符表」的口子:在配置文件里声明id、

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询