Здравствуйте, stace, Вы писали:
S>Привет всем, я очень извиняюсь, с программированием знаком на уровне новичка, но все же. В институте задали ужас какой то. К сожалению текст на английском.
Если внимательно прочтёшь текст задания — то обнаружишь там ключ к ответу

Последовательно читая текст, ты можешь сказать: вот здесь такое форматирование, а вот здесь — этакое... И порождать соответствующий html.
Так что, есть 3 подзадачи:
— парсер (читающий входной текст, и выделяющий в нём тэги \b, \i, \color)
— интерпретатор (реагирующий на тэги и выдающий команды наружу)
— генератор (пишущий правильный html).
Спроектируем каждую из них.
Парсер
— читает файл посимвольно,
— когда встречает '\', то считает, что дальше идёт тэг (одно слово т.е. последовательность букв)
— в случае тэга \color проверяет, нет ли далее '=', и если есть — считывает "rgb(N,N,N)"
— извещает интерпретатора о встреченных тэгах.
Для простоты, предположим, что интерпретатор имеет интерфейс к парсеру
struct ParserEvents
{
virtual void on_begin() = 0;
virtual void on_text(string text) = 0;
virtual void on_bold() = 0;
virtual void on_italic() = 0;
virtual void on_color(int r, int g, int b) = 0;
virtual void on_color_off() = 0;
virtual void on_end() = 0;
};
Интерпретатор
Состояние интерпретатора — это флаги bold, italic и стек цветов (поскольку могут встретиться "\color=rgb1 \color=rgb2 \color \color").
Поскольку допускается, что области действия тэгов могут пересекаться — то можно
— или придумать навороты с отслеживанием стека html-тэгов (ввести стек тэгов, разматывать-наматывать его...)
— или жёстко постулировать, что всего есть 3 уровня форматирования: жирность, курсив, цвет. И на выходе не будет никакой вложенности сверх этого.
Как бы, у нас есть только три вида скобок (жирные, курсивные, цветные), и можно вкладывать курсив в цвет, но не цвет в курсив...
Но воспользуемся тем, что одно и то же форматирование можно записывать разными html-последовательностями.
То есть, "aaa \i bbb \color=111 ccc"
мы заменим на "aaa <i> bbb </i><font color=#111><i> ccc".
А если идут подряд "aaa \color=111 bbb \color=222 ccc \color ddd \color eee",
то напишем "aaa <font color=#111> bbb </font><font color=#222> ccc </font><font color=#111> ddd </font> eee"
(при этом обрати внимание: внутри интерпретатора мы завели стек цветов, но html получилися одноуровневым).
Ну и в начале файла нужно записать шапку "<html><body>", а по окончании файла нужно закрыть все тэги и записать концовку "</body></html>".
В общем-то, механика несложная. Попробуй смоделировать на бумажке.
Генератор
На генератора можно возложить примитивные операции, чтобы не тащить все строковые литералы и форматирование в интерпретатор:
struct Generator
{
void header();
void footer();
void text();
void bold_on();
void bold_off();
void italic_on();
void italic_off();
void color_on(int r, int g, int b);
void color_off();
};
Генератор, помимо прочего, может изящно оформить html, сделав табуляцию и т.д. А может и не брать на себя такую инициативу.