|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
15.07.2009, 08:37 | #1 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Разбор программы на логические блоки в один проход
Вопрос заключается в следующем. У меня имеется набросок интерпретатора, который должен разбирать программу на следующие структуры - фрагменты (аналоги Begin-end Паскаля), циклы (несколько видов) и условия. Все почти аналогично Паскалю - за заголовоком цикла следует фрагмент, условие может быть как в короткой форме так и в длинной (то есть условие - блок истинной ветви - блок ложной ветви).
Перед стартом программа анализирует входящий поток программы (из компонента не важно Memo или RichEdit) и расталкивает код по фрагментам в отдельные структуры. Это у меня работает. Я настроил и работу с фрагментами и циклами (то есть вместо ссылки на фрагмент после цикла сразу следует ссылка на цикл, а в нем уже находится вся остальная информация). Но как осуществить работу с условием? Интерпретатор имеет процедуры которые однозначно могут определить идентификатор строки (однозначно указывающий что это цикл такой-то, что это комментарий и пр.), а также извлечь все входящие параметры для данной строки (имена переменных, логические условия и пр.). То есть для примера строка Если Х=100 То Х=1000 или Если х=100 ТОГДА х=1000 одназначно вернет идентификатор условия и заполнит специальную структуру параметрами Х=100 и Х=1000. Вместо такой короткой формы я могу автоматически создать ссылку на условие и коротку часть поместить в фрагмент Х=1000. Почти наверняка я смогу осуществить и прикрепленный фрагмент истинной ветви. Но как прикрепить фрагмент ложной ветви? Общая схема такова Условный оператор (его обозначение не имеет значение, поскольку его можно изменить в любое время) Фрагмент Бла-бла Конец фрагмента Иначе Фрагмент Бла-Бла Конец фрагмента Все операторы условны их наименования и порядок следования параметров в них можно легко изменить.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
15.07.2009, 09:07 | #2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
15.07.2009, 09:12 | #3 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Тогда задается в одной строке с условием, ложная ветвь по аналогии с Else (ИНАЧЕ) всегда должна находиться на новой строке. Вообще синтаксис требует от программиста ВСЕГДА разносить на фрагменты условие если для него предусмотрена ложная ветвь.
Например, такая конструкция будет неверна - Если х=10 то х=100 Иначе х=1000 Цель таких заморочек заставить программиста писать "понятные" для других программы (а не только для него в текущий момент времени), короче выдрессировать его к определенному стилю.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
15.07.2009, 09:43 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Ну тогда полюбому следующая строка после Если х=10
Будет BEGIN
I'm learning to live...
|
15.07.2009, 09:54 | #5 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Код:
Код должен допускать сразу после если либо начало нового фрагмента либо пустые строки. Условия проверяются в строке if id=9 then (код не рабочий). Какие будут предложения? Id для иначе = 54
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Stilet; 15.07.2009 в 10:09. |
15.07.2009, 10:25 | #6 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Тест:
Фрагмент Содержимое пустого фрагмента конец фрагмента Фрагмент Цикл: х от 10 до 1000+12 Фрагмент Сало маслом не испортишь Конец фрагмента конец фрагмента Фрагмент Если х=10 тогда фрагмент Условие истинной ветви конец фрагмента конец фрагмента Результаты теста: 0 1 2 3 4 Содержимое фрагментов Содержимое фрагмента: 0 Информация о фрагменте 0 =================================== ========================== Содержимое пустого фрагмента =================================== ========================== =================================== ================= Содержимое фрагмента: 1 Информация о фрагменте 1 =================================== ========================== + цикл 2 =================================== ========================== =================================== ================= Содержимое фрагмента: 2 Информация о фрагменте 2 =================================== ========================== Сало маслом не испортишь =================================== ========================== =================================== ================= Содержимое фрагмента: 3 Информация о фрагменте 3 =================================== ========================== + условие 4 =================================== ========================== =================================== ================= Содержимое фрагмента: 4 Информация о фрагменте 4 =================================== ========================== Условие истинной ветви =================================== ========================== =================================== ================= Список циклов: 2 Содержимое циклов Содержимое цикла: 2 Параметры цикла Х 10 1000 + 12 Тело: 2 Тип цикла: 4 =================================== ================= Список условий: 4 Содержимое условий Содержимое условия: 4 Условие: Х = 10 Истинная ветвь: 4 Ложная ветвь: 5 =================================== =================
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
15.07.2009, 10:40 | #7 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Давай так, я покажу как я понимаю проблему и ее решение, а ты потом в меня помидорами покидаешся
Попробуй на вкус пример.
I'm learning to live...
|
15.07.2009, 13:54 | #8 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Помидорами не буду . Мельком глянул, сейчас буду расковыривать, позже обязательно отчитаюсь о результатах .
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
15.07.2009, 14:17 | #9 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
И это только для IF такое, но можно и под FOR подстроить.
I'm learning to live...
|
|
15.07.2009, 14:21 | #10 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
С циклами проблем нет .
В общем-то уперся в ту же проблему. Ложная ветвь в условии может быть, а может и не быть. Как это отследить? И отсюда встает проблема ошибок, в твоем примере я пишу els вместо else и все равно получаю параметры, а это не есть хорошо. Хорошо два условия следуют подряд - первое без ложной ветви, второе с ложной ветвью. Твой алгоритм найдет результат некорректно .
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разбор кода программы на Bison+Flex | Corol | Помощь студентам | 2 | 03.07.2009 09:57 |
Разбиение текста на блоки. | gosu | Общие вопросы C/C++ | 11 | 04.06.2009 19:12 |
Как имея один exe файл получить исходник программы? | Skoroxod | Общие вопросы Delphi | 4 | 20.02.2009 10:41 |
один файл, две программы... | Deathwatcher | Общие вопросы Delphi | 0 | 18.11.2008 12:39 |
Сортирование масивов за один проход | NightWishMaster | Паскаль, Turbo Pascal, PascalABC.NET | 10 | 18.10.2007 08:05 |