Вступление
Язык D++, в развитие которого было вложено столько сил участниками наших мартовских соревнований, продолжает совершенствоваться. Его создатели пытаются сделать синтаксис языка как можно более простым и свободным с тем, чтобы облегчить программирование на этом языке будущего. Конечно, некоторое минимальное количество правил должно остаться.
Ваша программа должна проверять соблюдение некоторых из этих правил, связанных с расстановкой скобок и комментариями.
Задача
Текст правильной программы на D++ состоит из символьной части, арифметических выражений и комментариев. Комментарии могут встречаться где угодно и содержать любые символы. Комментарий всегда открывается парой символов '(*' и заканчивается парой символов '*)'. Каждый комментарий обязательно должен закрываться. Арифметические выражения в D++ всегда открываются круглой скобкой '(', закрываются круглой скобкой ')' и могут содержать внутри себя только символы '=+-*/0123456789)(' и переводы строк. Арифметическое выражение не может начинаться с пары символов '(*'. Скобки в арифметическом выражении могут быть вложенными; при этом они обязаны быть сбалансированными. Это означает, кто как '((1)))', так и '(23))((+)' не являются правильными арифметическими выражениями. Правильность выражения определяется только правильностью расстановки в нем скобок. Наконец, весь остальной текст программы (получающийся из исходного отбрасыванием всех комментариев и арифметических выражений) может состоять из произвольных символов, за исключением символов '(' и ')'.
Отметим, что пробелы ВПОЛНЕ возможны в тексте программы везде, кроме арифметических выражений.
Исходные данные
На входе записан некоторый текст. Объем этого текста не превышает 10000 символов. В тексте могут встречаться латинские буквы, цифры, скобки, знаки арифметических действий, пробелы и переводы строк.
Результат
Выведите YES, если введенный текст является корректной программой на D++, и NO в противном случае.
Пример
исходные данные |
---|
Hello, here is a sample D++ program. It contains some arithmetical expressions like
(2+2=4), (2+-/*) and ((3+3)*3=20(*this is not true, but you don’t have to verify it :-) *)+8)
(* the closing bracket in the previous comment is also in order, since this bracket
does not belong to any arithmetical expression*)
|
результат |
---|
YES
|
Автор задачи: Леонид Волков, Алексей Лысенко
Источник задачи: Второе командное соревнование школьников Свердловской области по программированию, 7 октября 2000