Chesee
Программа оформления исходников.
На данный момент, функции программы ограничиваются тем, что исходный текст (.cpp) преобразуется в .HTML или .tex файл.
По замыслу данная программа, должна преобразовывать исходные тексты на Си, выдавая
их в любом требуемом виде формате.
Пока что работа на программой приостановленна. Сделаны только основные системы. Но если у меня будет
свободное время или необходимость оформления больших исходников, я обязательно её доделаю.
Программу легко расширять.
Использование
Пока что вся работа осуществляется через перенаправление ввода вывода. Обязательно нужно указать
формат выходного файла. Пример:
cheese.exe -out=tex -fmt=full < 1.cpp > 1.tex
|
- -help - информация
- -out=... - опция выходного формата
- -out=cpp - простая переработка
- -out=tex - преобразование в tex
- -out=html - преобразование в html
- -in-tab-size - размер табуляции входного файла
- -out-tab-size - размер табуляции выходного файла (для tex,html - определяет размеры отступов)
- -cpp-nospace - не использовать табуляцию в выходном cpp файле
- -fmt=... - способ изменения исходного текста
- -fmt=none - без изменения текста
- -fmt=ident - изменение отступов
- -fmt=full - полное форматирование
Примеры
Исходный текст:
// hello !! ;)
void TEX::PrintChar(char sym)
{
switch(sym) {
case '_': fprintf(out_file,"\\underline{ }"); break;
case '{': fprintf(out_file,"\\{"); break;
case '}': fprintf(out_file,"\\}"); break;
case '\\': fprintf(out_file,"\\(\\backslash\\)"); break;
default: fputc(sym,out_file); break;
}
}
|
Результат:
// hello !! ;)
void TEX::PrintChar(char sym)
{
switch(sym) {
case '_': fprintf(out_file,"\\underline{ }"); break;
case '{': fprintf(out_file,"\\{"); break;
case '}': fprintf(out_file,"\\}"); break;
case '\\': fprintf(out_file,"\\(\\backslash\\)"); break;
default: fputc(sym,out_file); break;
}
}
|
Режим полного форматирования:
// hello !! ;)
void TEX::PrintChar(char sym)
{
switch(sym)
{
case '_':
fprintf(out_file,"\\underline{ }");
break;
case '{':
fprintf(out_file,"\\{");
break;
case '}':
fprintf(out_file,"\\}");
break;
case '\\':
fprintf(out_file,"\\(\\backslash\\)");
break;
default:
fputc(sym,out_file);
break;
}
}
|
Механизмы
К сожалению, описание абсолютно не подробное, потому как мне некогда.
Первоначальный текст, обрабатывается классом под названием Syntax_engine.
Его назначение состоит в том чтобы выделить из текста отдельные токены и расстояния между ними.
Различия между табуляцией и пробелами не делается, всё преобразуется в расстояние между словами.
Примеры токенов: <>, >=, :, ::, +, ++, =, break, l1, "fff" (строковые константы и коментарии являются цельными токенами).
Вторая стадия обработки: Format_engine. Данный класс осущетвляет форматирование текста. Т.е. изменение
его исходного вида.
Последняя стадия: Output_interface. Интерфейс вывода. Преобразует подготовленный текст в файл
с заданым форматом (TeX, Html и т.д.).
По сути Format_engine является вложенным классом Syntax_engine, а out_interface глобальной ссылкой на объект.
out_interface
Глобальная ссылка на объект осущевляющий конечное преобразование. Данный объект должен быть унаследован от объекта
Output_interface
class Output_interface{
protected:
bool isKeyWord(char*);
virtual void PrintChar(char);
public:
virtual void Start();
virtual void Stop();
virtual void Ident(int);
virtual void Write(char*);
virtual void ScanOptions(char**,int);
};
|
- isKeyWord(text) - сервисная функция, которая проверяет является заданное слово (text) ключевым словом.
- PrintChar - осуществляет вывод отдельного символа в итоговый текст. Не перегруженный
вариант просто печатает символ в выходной файл. В Html или TeX перегружает данный метод, для того чтобы заменять
некоторые специфичные символы управляющими последовательностями.
- Start - вызывается для записи начала текста файла (не перегруженная версия пуста).
- Stop - вызывается для записи конца текста файла (не перегруженная версия пуста).
- Ident - выполняет отступ между словами. Не перегруженная версия просто записывает в текст заданное количество пробелов.
CPP перегружает данный метод, для того чтобы преобразовывать часть пробелов в табуляции (расстояние равные одному пробелу не преобразуются).
- Write - вызывается для записи слова в выходной файл. Неперегруженная версия просто выводит текст, вызывая
PrintChar в цикле. HTML или TeX может перегружать данный метод, для того чтобы выделять ключевые слова другим цветом
или шрифтом.
- ScanOptions - считывание настроек характерных для данного выходного формата. Не перегруженная весия пуста.
Format_engine
- FormatReadLn - обрабатывает отдельные токены. Определяя для каждого из них размер предшествующего отступа,
и колисчество переводов строки после.
- FormatStmt - выделяет отдельные операторы исходника. Например for(;;), {, if(a==b), printf("hello").
Текущий выделеный оператор хранится ввиде вектора, в котором записаны отдельные токены, а так же размер отступа
перед токеном и количество переводов строки после него.
- FormatH() - работает с отдельным оператором. Определяет размеры горизонтального отступа в начале строки.
- FormatV() - работает с отдельным оператором. Определяет вертикальные отступы. Т.е. где будут расставлены
переводы строк и в каком количестве.
- Output() - выводит вектор с сохранённым оператором в выходной файл. Делая нужные оступы между токенами,
нужный отступ в начале строки, а так же переводы строк в нужных местах.
- TokenType - полезная функция. Опознает один из известных ей токенов и выдает число идентификатор.
Download
chesee.zip