OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 20 Май, 2019 10:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 71 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 25 Март, 2010 21:59 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8088
Откуда: Троицк, Москва
Чем месить насчет сканеров, лучше бы мастера обсудили проблему введения принудительной индентации в (учебный) компилятор КП/ББ.
Достают школьники своей неаккуратностью.
Даже F5 недостаточное средство.

Последней каплей стала вот эта промелькнувшая тут недавно ссылка: http://okasaki.blogspot.com/2008/02/in- ... n-for.html.

Итак, насколько трудно поправить компилятор КП/ББ, чтобы принудить к индентации?
Впечатление, что не очень трудно.
Хорошо бы конкретным знатокам на сей счет хотя бы высказаться.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 22:04 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2931
Откуда: г. Ярославль
Возможно, автоматический отступ (сразу при наборе текста) спасёт, и компилятор переделывать не нужно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 22:21 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2300
Откуда: Россия, Санкт-Петербург
Я обеими руками ЗА. Ведь где принудительный отступ, там и принудительный перевод строки. Надоели трёхэтажные IF-ELSE'ы в одну строчку.
PS: точку с запятой можно будет окончательно упразднить, по крайней мере в коде.
PPS: как и многие END'ы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 22:46 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9117
Откуда: Россия, Орёл
Да, это было б хорошее средство для обучения.

Можно сделать примочкой, видимо.
Простой синт. анализатор, который не анализирует глубже, чем отдельные операторы. И проверяет правильность индентации. Если нет, бьёт маркерами ошибок по голове.

И совершенно не трогать основной компилятор.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 22:50 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2300
Откуда: Россия, Санкт-Петербург
Илья Ермаков писал(а):
Можно сделать примочкой, видимо... И совершенно не трогать основной компилятор.
Ну, если не трогать компилятор, то можно вообще сделать форматировалку, которая перед компиляцией будет сама вставлять нужное число табуляций и вообще "наводить красоту".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 22:51 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9117
Откуда: Россия, Орёл
Нефиг, нефиг - пусть руками ставят!!!
То, что делается "само", совершенно не впечатывается, как необходимое.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 22:59 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8088
Откуда: Троицк, Москва
Илья Ермаков писал(а):
И совершенно не трогать основной компилятор.
Если бы удалось сделать так, то было бы отлично, а главное -- Компонентно :D


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 23:00 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Александр Ильин писал(а):
PS: точку с запятой можно будет окончательно упразднить, по крайней мере в коде.
язык не трогать... не забывайте, речь идёт об учебном компиляторе...

Илья Ермаков писал(а):
И совершенно не трогать основной компилятор.

На счёт не трогать - согласен.

Насчет "анализирует глубже, чем отдельные операторы." надо аккуратно. Тов. Кузьмицкий уже наступил на грабли подобного подхода у CpcBeautifier-а...

Надо разбирать полностью. Взять Coco/R, всунуть туда пустую грамматику КП, и добавить выдачу семанитческих ошибок при неправильных отступах; насчет синт. ошибок КП - ещё подумать надо... Пример для Coco счас выложу...

Ещё идея - мутить что-то типа анализатора, используя стандартные модули компилятора... гм... да и (один модуль) анализатора вполне можно скопировать и поковыряться внутрях... Или прямо в нём опцию проверки отступов внедрить...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 25 Март, 2010 23:30 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8088
Откуда: Троицк, Москва
А может еще проще? В смысле, без коко,
типа, какой-нить "консервативный" проверяльщик начал строк...

Даже просто наказывать за пробелы вместо отступов в пустом начале строки -- уже было бы дело.

Заодно: может, в режиме Ctrl+H пробелы серыми точками показывать -- как в Ворде?
18 лет пользуюсь -- мелочь, а полезно. Включить-посмотреть-выключить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 00:54 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2931
Откуда: г. Ярославль
Илья Ермаков писал(а):
Нефиг, нефиг - пусть руками ставят!!!
То, что делается "само", совершенно не впечатывается, как необходимое.


Кстати, это же маркер! Если чел не делает руками необходимые отступы, значит, у него в голове чего-то не сформировалось.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 01:25 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Info21 писал(а):
А может еще проще? В смысле, без коко,...
Парсер считает текущий ур. вложенности, скажем в глобальной переменной сканера. Сканер считает число табов с начала строки (ругается на все кроме табов) и проверяет чтобы оно совпадало с тек. вложенностью.

Осталось выбрать, чего писать или где менять... Свои слова на счет не трогать компилятор в школьной сборке ББ беру назад...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 03:42 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Или подсчёт вложенности оказался не прост... или идея проверять его в сканере не верна... :oops:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 08:39 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3043
Откуда: Астрахань
Не... Уровень вложенности - сканером не обойдешься. Это же для каждой единицы программы, в которой есть end; А end - это уже синтаксический уровень.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 09:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8088
Откуда: Троицк, Москва
На всякий случай:

Цитата:
... mandatory indentation is harder to deal with using traditional scanners and parsers based strictly on regular expressions and context-free grammars, respectively.
But it's usually trivial to modify the scanner to keep track of indentation and issue an INDENT token when indentation increases, and one or more OUTDENT tokens when indentation decreases.
The parser can then treat these tokens just like normal BEGIN/END keywords.
In this approach the scanner is no longer based strictly on regular expressions, but most scanners aren't anyway (for example, when dealing with nested comments).
Using the INDENT/OUTDENT tokens, the parser can still be based strictly on context-free grammars.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 13:08 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3043
Откуда: Астрахань
Ну да, я это читал - нужно вносить в грамматику и парсер новые лексемы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 16:09 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Опробуйте. Изменённый (для учебных целей) сканер/парсер из 1.6-rc6. Изменения выделены цветом.
Вроде как получилось. Строгой проверки нет, но для учебных целей должно хватить... Схематичное описание внизу PrivCPIndentDev: немного слов+пометки в грамматике.
Вложение:
Комментарий к файлу: Tools->Decode
CPIndents.txt [129.94 КБ]
Скачиваний: 284

Ставит ошибку 1000, если строка со значимыми литерами начинается не с табов; ошибку 1001, если отступ перед терминалом не правильный.

Сам проверять сейчас не могу, моск в ступоре...

Добавка:
27.03.2010: Внёс (те же самые) изменения в сканер/парсер 1.5
... 16:03 Исправил ошибку: viewtopic.php?p=45119#p45119. (были пропущены два места в парсере где распознавался RECORD)

02.04.2010:
Пропускаются объявления в строке с CONST, VAR, TYPE. viewtopic.php?p=45437#p45437
Забытая ранее проверка IMPORT сделана аналогично...

14.04.2010:
Составные операторы IF (без ELSIF), WHILE, REPEAT, содержащие только простые (присв.; вызов процедуры; RETURN, EXIT) разрешается записать в одну строку. (Имеется ввиду введённая строка - до явного разрыва по enter, а не сформированная по ширине страницы наборщиком TextSetters.Setter).
Сделана проверка отступов для RETURN, EXIT


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Март, 2010 19:59 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8088
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Опробуйте. Изменённый (для учебных целей) сканер/парсер из 1.6-rc6.
Рад бы. Да школьные версии основаны на 1.5. Честно попробовал скомпилировать под 1.5, но там слишком много черных квадратиков получилось :)

Надо еще проще.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 27 Март, 2010 14:11 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Эта схема получилась раза с третьего-четвёртого... Одна из целей - минимально менять сканер/парсер...

Определённые терминалы в грамматике размечаются исходя из соображений расстановки отступов и соотв-е проверки вносятся в парсер...
Код:
@   проверка: соответствует ли число табов в начале строки текущему ур. отступа
>   увеличить ур. отступа
<   уменьшить ур. отступа
Итого:
1) Отступы проверяются только для помеченных терминалов, а не для всех строк. С последним были какие-то проблемы (простоты реализации)... Т.е. для некоторых частей проверки нет вовсе и их можно лепить как угодно.
2) Если уровень отступа изменился, то проверяемый терминал должен быть на новой строке. Т.е. требования к новым строкам и отступам становятся более жёсткими.

Для учебных целей - научить ставить отступы, думаю, это приемлемо. Т.к. самые вычурные варианты, которые в текущей "разметке" не проверяются, будут в глаза бросаться, и чтобы их получить, надо специально извратиться.

Пример:
Код:
DeclSeq    = ... {TYPE @ {TypeDecl >@ ";" < }...
Type    = ... | [ABSTRACT | EXTENSIBLE | LIMITED] RECORD > ["("Qualident")"] FieldList @ {";" FieldList @} END <@

1) атрибуты, RECORD, ["("Qualident")"] не проверяются, могут быть где угодно.
2) FieldList должно находиться на отступ дальше чем TypeDecl. END на том же что и TypeDecl

A1..A3 - ошибки "неправльный отступ"
A4..A5 - нормально
A6 - извращение
Вложение:
1.png
1.png [ 4.74 КБ | Просмотров: 8852 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 27 Март, 2010 14:23 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Если этот подход будет сочтён приемлемым, то надо проверять реализацию на всех частях грамматики... Уже увидел проблему с атрибутами записи [ABSTRACT | EXTENSIBLE | LIMITED]...

Сложность работы с парсером в том, что закодированная там грамматика сильно отличается от исходной (что в сообщении о языке)... Плюс штуки типа LIMITED и пр. не лексема (вероятно от того, что в ручной реализации проблематично поменять выверенные и упорядоченные для быстрых проверок коды лексем; реализация унаследовалась от оберона2)...

P.S. Ошибка исправлена


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 27 Март, 2010 16:26 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
Евгений Темиргалеев -
Может лучше ограничится кнопкой "Форматировать текст".

В 1С так сделано.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 71 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB