Однажды один ветеран АСМ-соревнований задумавшись о подрастающем поколении, решил помочь им в освоении тайн и тонкостей спортивного программирования. Решил он создать страничку в Internet, на которой бы помещал статьи на различные программистские темы, описания интересных задачек, их решений, и, конечно же, исходные тексты решений. Но вот ведь незадача! Прекрасные тексты его замечательных решений на страничке выглядят блекло и уныло, совсем не так, как в его любимой среде разработке: ключевые слова не выделяются, комментарии ничем не отличаются от кода программы… Ничего не радует глаз.
Будучи знакомым с основами HTML, он знает, что добавление вручную тегов разметки, которые бы раскрасили синтаксис его программ, — жутко трудоёмкое и неинтересное занятие, на которое он точно никогда не решится.
— А вот написать программу, которая бы делала это всё за меня — раз плюнуть! — подумал он. — …или может не раз плюнуть… — …или может лучше всё-таки вручную как-нибудь… — …или может.… Эврика! Раз уж эта задачка мне оказалась не под силу, то нужно дать её на одном из ближайших АСМ соревнований — там-то её точно кто-нибудь решит! — …а если с ошибками решат … — …всё равно пусть попробуют!…
Исходные данные
Дан текст корректной программы на языке Паскаль. Длина входного текста не более 100 000 символов.
Результат
Необходимо вставить теги форматирования, чтобы можно было нужным образом раскрасить исходный текст данной на вход программы при помощи HTML. Для этого следует выполнить следующие условия:
- Все комментарии должны быть заключены в пару тегов “<span class=comment>” и “</span>”.
- Все ключевые слова должны быть заключены в пару тегов “<span class=keyword>” и “</span>”.
- Все строки должны быть заключены в пару тегов “<span class=string>” и “</span>”.
- Все числа должны быть заключены в пару тегов “<span class=number>” и “</span>”.
- Если ключевые слова, строки или числа попали в комментарии, то они считаются частью комментария и не считаются ключевыми словами, стоками или числами.
- Если ключевые слова, комментарии или числа попали в строки, то они считаются частью строки и не считаются ключевыми словами, комментариями или числами.
Строка — это последовательность символов ограниченная апострофами («’»), не содержащая внутри других апострофов. Либо символ решётка («#»), следом за которым идет непустая последовательность цифр. Во втором случае последовательность необходимо брать максимальную. То есть в последовательности символов “#123” подстрока “#1” не является строкой, в то время, как вся последовательность “#123” строкой является.
Числа начинаются с цифры, заканчиваются цифрой и внутри могут содержать лишь цифры и, возможно, одну точку («.»). Так же в случае со строкой, числом называется именно максимальная по включению последовательность символов, удовлетворяющая описанному правилу.
Идентификатор может начинаться с буквы либо знака подчёркивания и содержать буквы, цифры и знаки подчёркивания. Аналогично строке и числу, идентификатором называется лишь максимальная по включению, строка, удовлетворяющая данным требованиям.
Есть комментарии двух типов: комментарий первого типа начинается с ‘{’ и оканчивается ‘}’, обе скобки - часть комментария; комментарий второго типа начинается с ‘//’ и оканчивается переводом строки, слэши — часть комментария, а перевод строки — нет. Вложенные комментарии являются частью внешних комментариев.
Ключевые слова - это следующие идентификаторы:
'and', 'array', 'begin', 'case', 'class', 'const', 'div', 'do', 'else', 'end', 'for', 'function', 'if', 'implementation', 'interface', 'mod', 'not', 'of', 'or', 'procedure', 'program', 'record', 'repeat', 'shl', 'shr', 'string', 'then', 'to', 'type', 'unit', 'until', 'uses', 'var', 'with', 'while'.
Тут каждое ключевое слово заключено в апострофы, которые не следует считать частями ключевых слов. Ключевые слова показаны в нижнем регистре, но на самом деле они могут встречаться в тексте в любом регистре. Например, ImPlEmentAtioN — это ключевое слово.
Пример
исходные данные | результат |
---|
Begin
writeln('Hello world!');
end.
| <span class=keyword>Begin</span>
writeln(<span class=string>'Hello world!'</span>);
<span class=keyword>end</span>.
|
Замечания
Многие, наверное, догадались, что если сохранить результат программы в файл output.html, в начало этого файла добавить строки:
<STYLE>
span.string {color: fuchsia;}
span.number {color: darkblue;}
span.keyword {font-weight: bold; color: black;}
span.comment {font-style: italic; color: gray;}
</STYLE>
<PRE>
а в конец, соответственно, строку
то открыв этот файл в браузере, можно будет увидеть входной текст с подсвеченным синтаксисом.
Обратите внимание, что тесты могут содержать символы с ASCII-кодами более 127.
Автор задачи: Павел Егоров
Источник задачи: USU Championship 2004