Входной файл: | Стандартный вход | Ограничение времени: | 2 сек | |
Выходной файл: | Стандартный выход | Ограничение памяти: | 512 Мб | |
Максимальный балл: | 1 |
Пусть выражение присваивания описывается следующей грамматикой
Comma = ",", { " " };
Digit = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
Number = "0" | ( Digit, { Digit | "0" } );
Letter = "A" | "B" | "C" | "D" | "E" | "F" | "G"
| "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U"
| "V" | "W" | "X" | "Y" | "Z" | "a" | "b"
| "c" | "d" | "e" | "f" | "g" | "h" | "i"
| "j" | "k" | "l" | "m" | "n" | "o" | "p"
| "q" | "r" | "s" | "t" | "u" | "v" | "w"
| "x" | "y" | "z" ;
Variable = Letter, { Letter | Digit | "0" };
Value = Variable | Number | EnclosedValueList | EmptyList;
ValueList = Value, { Comma, Value }, [ Comma ];
EnclosedValueList = "(", ValueList , ")";
EmptyList = "(", { " " }, ")";
Destination = Variable | EnclosedDestinationList;
DestinationList = Destination, { Comma, Destination }, ( [ Comma, "*", Variable ] | [ Comma ] );
EnclosedDestinationList = "(", DestinationList, ")";
Assignment = ( DestinationList | EnclosedDestinationList ), " = ", ( ValueList | EnclosedValueList );
Обе стороны выражения считаются потенциально вложенными списками. Переменной на левой стороне присваивается значение, расположенное на соответствующей позиции справа. Значение может быть числом (Number), переменной (Variable) или списком. Список должен быть заключен в круглые скобки и содержать как минимум одну запятую. Например, (a,)
— список, но (a)
— то же самое, что просто a
. Также скобки могут быть опущены на верхнем уровне с обоих сторон. Присваивание выполняется сверху вниз, слева направо. Таким образом, переменная может является элементом списка справа, если ей уже были присвоено некоторое значение. В случае, если имя переменной начинается с символа *
, ей присваивается потенциально пустой список, состоящий из всех оставшихся значений на этом уровне. Присваивание не может быть выполнено в том случае, когда для элемента списка с одной стороны не найдётся соответствующего элемента с другой, или переменная используется в качестве значения до присвоения ей значения.
Ваша задача написать программу, раскладывающую такой присваивание на множество простых: одной переменной присваивается число или список чисел.
Входные данные содержат единственную строку — выражение присваивания.
Если присваивание не может быть выполнено, необходимо вывести единственное число -1. Иначе выходные данные должны содержать простое выражение присваивания для каждой переменной в алфавитном порядке по одному в строке. Выражение должно соответствовать следующей грамматике
SimpleAssignment = Variable, " = ", NumberOrList;
NumberOrList= Number | ( "(", NumberOrList, { Comma, NumberOrList }, [ Comma ] ")" ) | EmptyList;
Гарантируется, что исходное выражение соответствует грамматике.
Размер входных данных не превосходит 104 символов.
№ | Стандартный вход | Стандартный выход |
---|---|---|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|