U529730 编译原理:求 First 集
题目背景
在编译原理中,First 集 用于描述一个非终结符符号推导出的第一个终结符。计算每个非终结符的 First 集 是语法分析中的基础步骤,帮助编译器在分析输入时做出正确的决策。
First 集 计算是自顶向下的语法分析方法中一个基础且关键的步骤,尤其是在预测分析法和 LL(1) 文法的处理中,它帮助分析器根据输入流中的当前符号选择正确的产生式,从而决定语法分析的下一步操作。
题目描述
给定一个上下文无关文法CFG (产生式左部只有一个符号,且为非终结符),要求你计算每个非终结符的 First 集。
First 集 是指一个非终结符符号推导出的第一个终结符。如果非终结符能推导出空串(ε),则空串也属于该非终结符的 First 集。
此处用#替代空串(ε)。
给定以下文法规则,请计算并输出每个非终结符的 First 集。对于每个非终结符,输出它的 First 集 中包含的终结符,并按字母顺序排列。
流程如下:

可参考本人CSDN博客:[CFG中First集合与Follow集合的Java代码实现](https://blog.csdn.net/qq_74204532/article/details/143907897?spm=1001.2014.3001.5502)
输入格式
第一行包含一个整数 n,表示文法中的产生式数量。
接下来的 n 行,每行描述一个产生式,
格式为:**非终结符 -> 产生式**
其中 产生式 可以包含终结符(小写字母)、非终结符(大写字母)或者空串 #。多个右部之间由 | 分隔。
终结符使用小写字母表示,例如 a, b, c 等。
非终结符使用大写字母表示,例如 S, A, B 等。
#表示空串。
产生式中不包含空格、制表符等。
输出格式
顺序输出非终结符,对于文法中的每个非终结符,输出它的 First 集。
输出格式为:
**非终结符: First(非终结符)**
其中,每个非终结符 First 集 中的元素按字母顺序排列,并以逗号分隔。如果一个非终结符能推导出空串#,则需包含#。
说明/提示
样例一解释:
A 的 First 集 包含 a 和 #,因为 A 可以推导出 a 和 #。
B 的 First 集 包含 b 和 c,因为 B 可以推导出 b 或 c。
S 的 First 集 包含 a(从 A)以及 b 和 c(从 B)。
**约束:**
本题不会出现左递归。
每个非终结符只有一条产生式,产生式中不包含空格。
产生式中的终结符为单个小写字母或空串#,非终结符为单个大写字母。
$1\leq n\leq5,非终结符个数=n,终结符个数