![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 15.03.2014
Сообщений: 2
|
![]()
Задача - написать простейший форматтер программ на паскале, вот то что есть, вроде со всем разобрался, но есть небольшие проблемы, если присутствует, допустим, полный блок if внутри блока for, отступы неверно расставляются. И не понимаю как сделать отступы после "незакрывающихся" ключевых слов типа var, const, что бы потом всё заново начиналось с 1 бегина. Помогите, пожалуйста. 1 - сам код программы, 2 - результат выполнения на одной из программ.
Код:
Код:
|
![]() |
![]() |
![]() |
#2 |
Новичок
Джуниор
Регистрация: 15.03.2014
Сообщений: 2
|
![]()
ну хотя бы на мысль натолкните
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]()
Слишком у тебя просто) Слишком мало возможных вариантов.
При чтении строки нужно определять, что если она является комментарием, то писать ее без изменений и исключать из логики обработки, как будто ее вовсе нету. Первым делом прочитать весь файл и за каждым begin поставить перенос строки (если его нету). Перед каждым end - тоже (если его нету). Естессно, с тестом на закоменченность, begin и end же вполне себе такие литературные английские слова. Например, если строка содержит do и заканчивается двоеточием, то увеличивать последующий отступ не надо, иначе - если следующая за do строка пустая, то делаем ничего и ищем строку, которая с символами (но не комментарий!), если найденная строка содержит begin, то увеличиваем отступ и выходим из этой кучи ифов, иначе если найденная строка начинается с ключевых слов, то пихаем в стек состояние - "идет обработка do" и начинаем обработку в соответствии с найденным ключ.словом, иначе входим в цикл: если строка первая - увеличиваем отступ, далее пишем найденную строку, а если найденная строка заканчивается точкасзапятой, то уменьшаем отступ и выходим из цикла... Предположим, тут закончилась обработка случая с do - тогда вытаскиваем из стека предыдущее состояние и продолжаем обработку в соответствии с этим состоянием... если встретилось одно из спец.ключ.слов (const, var), то делать все следующие строки с отступом до тех пор, пока не встретилась строка, начинающаяся с любого ключ слов (включая procedure и function) - тогда уменьшать отступ. Кароч, темный сумерек) Последний раз редактировалось Smogg; 16.03.2014 в 01:36. |
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]()
А если покороче - то тебе надо ввести "состояние программы". Пусть будут два - нормальное, обработка constvar (желательно еще и третье - многострочный коммент, но с ним достаточно хитро и без стека не обойтись).
тогда логика будет такая: цикл вайл нот(еоф) если строка пустая - пишем без изменений и continue; если строка - однострочный коммент, то пишем без изменений и continue; если строка начинается с var|const, то делаем отступ = 0, ставим состояние "constvar", сохраняем строку, увеличиваем отступ и continue; если строка начинается с ваще любого ключ.слова и программа в состоянии "constvar", то уменьшаем отступ, ставим состояние "нормально" и продолжаем обработку; если строка содержит do и оканчивается на точкасзапятой, то сохраняем и continue; иначе просто сохраняем и проверяем сразу же след строку - если a) след строка начинается с begin, то сохраняем begin, потом увеличиваем отступ и continue; b) оканчивается на точкасзапятой то сначала увеличиваем отступ, затем сохраняем, уменьшаем отступ и continue; ну и дальше - как у тебя Последний раз редактировалось Smogg; 16.03.2014 в 20:40. |
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Создание программ на PASCAL домашняя контрольная*( | BBC25 | Помощь студентам | 3 | 27.01.2011 23:20 |
Форматирование Pascal-кода в Word | InternetStranger | Общие вопросы Delphi | 4 | 20.05.2010 01:21 |