本题的题目描述非常冗长,不需要背景故事。给定一个正则表达式,你的任务是按照题目说明中的规范,将其对应的自动机渲染为 ASCII 艺术图。请参考样例。
本题中的正则表达式由大写字母 A 到 Z、特殊字符 +、?、* 以及用于分组的括号组成。问题的输入由以下 BNF 文法中的 $\langle input \rangle$ 非终结符给出:
$\langle input \rangle ::= \langle expr \rangle$ $\langle expr \rangle ::= \langle term \rangle \mid \langle term \rangle \text{‘|’} \langle expr \rangle$ $\langle term \rangle ::= \langle atom \rangle \mid \langle atom \rangle \langle term \rangle \mid \langle term \rangle \langle atom \rangle$ $\langle atom \rangle ::= \langle letter \rangle \mid \text{‘(’} \langle expr \rangle \text{‘)’} \mid \langle atom \rangle \text{‘+’} \mid \langle atom \rangle \text{‘?’} \mid \langle atom \rangle \text{‘*’}$ $\langle letter \rangle ::= \text{‘A’} \mid \text{‘B’} \mid \dots \mid \text{‘Z’}$
正则表达式被渲染为一幅 ASCII 艺术图,需遵循以下精确规则。这些规则递归地定义了每个正则表达式的唯一表示,即一个具有指定行数和列数的矩形字符框。表示中的空字符(包括末尾的空字符)必须用空格填充。
由 $n$ 个大写字母组成的 $\langle term \rangle$ 被渲染为一个 3 行 $4+n$ 列的框,使用 + 和 - 字符在第一行、最后一行以及第一列和最后一列绘制边框,如样例所示。文法中 $\langle term \rangle$ 非终结符的产生式是有意模糊的。正则表达式中相邻的 $\langle letter \rangle$ 非终结符构成的最长序列必须被组合成一个 $\langle term \rangle$ 并渲染为一个单独的框。例如,‘NERC’ 的 $\langle term \rangle$ 渲染为如下 $3 \times 8$ 的框:
+------+ | NERC | +------+
由 $\langle atom \rangle$ 非终结符和包含字母的 $\langle term \rangle$ 非终结符组成的 $\langle term \rangle$(如上所述),通过将组成框从左到右排列来渲染,垂直方向顶部对齐,相邻框之间用 2 列分隔。结果框的高度等于组成框的最大高度。每对相邻框通过在它们之间的列的第 2 行渲染 -> 字符来连接。例如,‘N(E)RC’ 的 $\langle term \rangle$(由序列:‘A’ 的 $\langle atom \rangle$、‘(E)’ 的 $\langle atom \rangle$ 和仅含字母的 ‘RC’ 的 $\langle term \rangle$ 组成)渲染为如下 $3 \times 20$ 的框:
+---+ +---+ +----+ + N +->+ E +->+ RC + +---+ +---+ +----+
由单个 $\langle term \rangle$ 组成的 $\langle expr \rangle$ 渲染为其对应的 $\langle term \rangle$。
由 ‘|’ 分隔的 $\langle term \rangle$ 非终结符序列组成的 $\langle expr \rangle$,通过将对应的 $\langle term \rangle$ 框从上到下排列来渲染,左对齐,相邻 $\langle term \rangle$ 框之间用一行分隔。结果框的宽度等于 $\langle term \rangle$ 框的最大宽度加 6。左侧有 3 个额外列,右侧有 3 个额外列。第一列和最后一列使用 + 和 | 字符将所有 $\langle term \rangle$ 框的第 2 行从上到下连接起来,并在每个 $\langle term \rangle$ 框的第 2 行放置 +。左侧的第 2、3 列和右侧的倒数第 2、3 列在对应 $\langle term \rangle$ 框的第 2 行有 -> 字符。此外,较短的 $\langle term \rangle$ 框在右侧用额外的 - 字符连接到第 2 行。例如,‘C|ON|TEST’ 的 $\langle expr \rangle$ 渲染为如下 $11 \times 14$ 的框:
+---+ +->+ C +---->+ | +---+ | | | | +----+ | +->+ ON +--->+ | +----+ | | | | +------+ | +->+ TEST +->+ +------+
‘(’ $\langle expr \rangle$ ‘)’ 的 $\langle atom \rangle$ 渲染为其对应的 $\langle expr \rangle$。
$\langle atom \rangle$ ‘+’ 的 $\langle atom \rangle$ 渲染为一个框,其高度为源 $\langle atom \rangle$ 框的高度增加 2 行,宽度增加 6 列(左侧 3 列,右侧 3 列)。第一列和最后一列(从第 2 行开始)以及最后一行填充连接字符,如样例所示。 第 2 行以 +-> 开头,以 ->+ 结尾,以连接到源 $\langle atom \rangle$ 框的第 2 行。 最后一行以 +<- 开头,表示自动机中的反向边。
例如,‘A+’ 的 $\langle atom \rangle$ 渲染为如下 $5 \times 11$ 的框:
+---+ +->+ A +->+ | +---+ | | | +<--------+
$\langle atom \rangle$ ‘?’ 的 $\langle atom \rangle$ 渲染为一个框,其高度为源 $\langle atom \rangle$ 框的高度增加 3 行,宽度增加 6 列(左侧 3 列,右侧 3 列)。第一列和最后一列(从第 2 行到第 5 行)以及第 2 行填充连接字符,如样例所示。 ‘?’ 的 $\langle atom \rangle$ 的第一行始终为空(填充空格)。 第 2 行以 ->+ 结尾,表示对应自动机中的 epsilon 边。 * 第 5 行以 +-> 开头,以 ->+ 结尾,以连接到源 $\langle atom \rangle$ 框的第 2 行。
例如,‘B?’ 的 $\langle atom \rangle$ 渲染为如下 $6 \times 11$ 的框:
+-------->+ | | | +---+ | +->+ B +->+ +---+
$\langle atom \rangle$ ‘’ 的 $\langle atom \rangle$ 渲染为一个框,其高度为源 $\langle atom \rangle$ 框的高度增加 5 行(顶部 3 行,底部 2 行),宽度增加 6 列(左侧 3 列,右侧 3 列)。第一列和最后一列,以及第 2 行和最后一行,填充连接字符,如样例所示。 ‘’ 的 $\langle atom \rangle$ 的第一行始终为空(填充空格)。 第 2 行以 ->+ 结尾,表示对应自动机中的 epsilon 边。 第 5 行以 +-> 开头,以 ->+ 结尾,以连接到源 $\langle atom \rangle$ 框的第 2 行。 最后一行以 +<- 开头,表示自动机中的反向边。
例如,‘C*’ 的 $\langle atom \rangle$ 渲染为如下 $8 \times 11$ 的框:
+-------->+ | | | +---+ | +->+ C +->+ | +---+ | | | +<--------+
$\langle input \rangle$ 渲染为一个框,其宽度比对应的 $\langle expr \rangle$ 框多 6 列(左侧 3 列,右侧 3 列)。第 2 行以 S-> 开头表示自动机的起始状态,以 ->F 结尾表示自动机的最终状态。请参见样例输出。
输入格式
输入包含一行,对应于题目给出的文法中的 $\langle input \rangle$ 非终结符,长度不超过 100 个字符。
输出格式
在输出的第一行,写入两个整数 $h$ 和 $w$ —— 分别表示对应于给定 $\langle input \rangle$ 的 $h \times w$ 框的高度和宽度。在接下来的 $h$ 行中,每行写入对应 ASCII 艺术渲染的 $w$ 个字符。
样例
输入 1
NE?(ER)C++|(IS)*?|(CHA((LL))ENGING)
输出 1
23 57 +---+ +----+ +---+ S->+->+ N +->+-------->+->+ ER +->+->+->+ C +->+->+->+->F | +---+ | | +----+ | | +---+ | | | | | +---+ | | | | | | | +->+ E +->+ | +<--------+ | | | +---+ | | | | +<--------------+ | | | | | +->+--------------->+---------------------------->+ | | | | | | | | | +->+--------->+->+ | | | | | | | +----+ | | | +->+ IS +->+ | | | +----+ | | | | | | | +<---------+ | | | | +-----+ +----+ +--------+ | +->+ CHA +->+ LL +->+ ENGING +------------------->+ +-----+ +----+ +--------+