#P3201. Little Quilt

Little Quilt

描述

小被子(Little Quilt)是由Ravi Sethi在其著作《编程语言》中提出的一种小型语言。这里介绍的是其受限版本。

该语言由以下BNF语法定义:

<QUILT> ::= A | B | turn(<QUILT>) | sew(<QUILT>,<QUILT>)

A和B代表两种原始被子。每种原始被子对应一个2×22 \times 2的字符矩阵排列。turn()和sew()是对被子的操作。

指令turn(x)将被子x顺时针旋转90度。下表展示了原始被子及turn()操作的效果示例:

相应地,指令sew(x,y)sew(x,y)将被子xx缝在被子yy的左侧。xxyy必须具有相同的高度,否则会生成错误。下图展示了sew(A,turn(B))sew(A,turn(B))的结果:

//||

/+||

sew(turn(sew(B,turn(B))),A)sew(turn(sew(B,turn(B))),A)会生成错误信息。

你的任务是构建一个小被子语言的解释器。

输入

输入文件是一个文本文件,包含多个小被子表达式,每个表达式以分号(;)结尾。空格和换行符必须被忽略;这意味着一个表达式可以跨越多行。

输出

输出文件包含解释输入表达式后生成的被子。

每个被子前必须有一行左对齐的格式:

Quilt i:

其中ii是被子的编号,从11开始。如果表达式解释过程中生成错误,则必须打印:

errorerror

输入数据 1

sew(turn(sew(B,turn(B))),
       turn(sew(turn(B),B)))   ;


   sew(turn(sew(B,turn(B))),A);
sew(turn(sew(A,turn(A))),
 turn(turn(

   turn(sew(A,turn(A))))))

   ;

输出数据 1

Quilt 1:
||--
||--
--||
--||
Quilt 2:
error
Quilt 3:
\\//
+\/+
+/\+
//\\

来源

哥伦比亚2006