U529730 编译原理:求 First 集

题目背景

在编译原理中,First 集 用于描述一个非终结符符号推导出的第一个终结符。计算每个非终结符的 First 集 是语法分析中的基础步骤,帮助编译器在分析输入时做出正确的决策。 First 集 计算是自顶向下的语法分析方法中一个基础且关键的步骤,尤其是在预测分析法和 LL(1) 文法的处理中,它帮助分析器根据输入流中的当前符号选择正确的产生式,从而决定语法分析的下一步操作。

题目描述

给定一个上下文无关文法CFG (产生式左部只有一个符号,且为非终结符),要求你计算每个非终结符的 First 集。 First 集 是指一个非终结符符号推导出的第一个终结符。如果非终结符能推导出空串(ε),则空串也属于该非终结符的 First 集。 此处用#替代空串(ε)。 给定以下文法规则,请计算并输出每个非终结符的 First 集。对于每个非终结符,输出它的 First 集 中包含的终结符,并按字母顺序排列。 流程如下: ![](https://cdn.luogu.com.cn/upload/image_hosting/cxuuk7bt.png) 可参考本人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,终结符个数