OberonCore
https://forum.oberoncore.ru/

принудительные отступы в Оберонах?
https://forum.oberoncore.ru/viewtopic.php?f=7&t=2484
Страница 1 из 4

Автор:  Info21 [ Четверг, 25 Март, 2010 21:59 ]
Заголовок сообщения:  принудительные отступы в Оберонах?

Чем месить насчет сканеров, лучше бы мастера обсудили проблему введения принудительной индентации в (учебный) компилятор КП/ББ.
Достают школьники своей неаккуратностью.
Даже F5 недостаточное средство.

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

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

Автор:  Иван Кузьмицкий [ Четверг, 25 Март, 2010 22:04 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Возможно, автоматический отступ (сразу при наборе текста) спасёт, и компилятор переделывать не нужно.

Автор:  Александр Ильин [ Четверг, 25 Март, 2010 22:21 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

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

Автор:  Илья Ермаков [ Четверг, 25 Март, 2010 22:46 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Да, это было б хорошее средство для обучения.

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

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

Автор:  Александр Ильин [ Четверг, 25 Март, 2010 22:50 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Илья Ермаков писал(а):
Можно сделать примочкой, видимо... И совершенно не трогать основной компилятор.
Ну, если не трогать компилятор, то можно вообще сделать форматировалку, которая перед компиляцией будет сама вставлять нужное число табуляций и вообще "наводить красоту".

Автор:  Илья Ермаков [ Четверг, 25 Март, 2010 22:51 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Нефиг, нефиг - пусть руками ставят!!!
То, что делается "само", совершенно не впечатывается, как необходимое.

Автор:  Info21 [ Четверг, 25 Март, 2010 22:59 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Илья Ермаков писал(а):
И совершенно не трогать основной компилятор.
Если бы удалось сделать так, то было бы отлично, а главное -- Компонентно :D

Автор:  Евгений Темиргалеев [ Четверг, 25 Март, 2010 23:00 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Александр Ильин писал(а):
PS: точку с запятой можно будет окончательно упразднить, по крайней мере в коде.
язык не трогать... не забывайте, речь идёт об учебном компиляторе...

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

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

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

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

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

Автор:  Info21 [ Четверг, 25 Март, 2010 23:30 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

А может еще проще? В смысле, без коко,
типа, какой-нить "консервативный" проверяльщик начал строк...

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

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

Автор:  Иван Кузьмицкий [ Пятница, 26 Март, 2010 00:54 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Илья Ермаков писал(а):
Нефиг, нефиг - пусть руками ставят!!!
То, что делается "само", совершенно не впечатывается, как необходимое.


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

Автор:  Евгений Темиргалеев [ Пятница, 26 Март, 2010 01:25 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Info21 писал(а):
А может еще проще? В смысле, без коко,...
Парсер считает текущий ур. вложенности, скажем в глобальной переменной сканера. Сканер считает число табов с начала строки (ругается на все кроме табов) и проверяет чтобы оно совпадало с тек. вложенностью.

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

Автор:  Евгений Темиргалеев [ Пятница, 26 Март, 2010 03:42 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Или подсчёт вложенности оказался не прост... или идея проверять его в сканере не верна... :oops:

Автор:  Валерий Лаптев [ Пятница, 26 Март, 2010 08:39 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Не... Уровень вложенности - сканером не обойдешься. Это же для каждой единицы программы, в которой есть end; А end - это уже синтаксический уровень.

Автор:  Info21 [ Пятница, 26 Март, 2010 09:43 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

На всякий случай:

Цитата:
... 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 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Ну да, я это читал - нужно вносить в грамматику и парсер новые лексемы.

Автор:  Евгений Темиргалеев [ Пятница, 26 Март, 2010 16:09 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

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

Ставит ошибку 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

Автор:  Info21 [ Пятница, 26 Март, 2010 19:59 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

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

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

Автор:  Евгений Темиргалеев [ Суббота, 27 Март, 2010 14:11 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Эта схема получилась раза с третьего-четвёртого... Одна из целей - минимально менять сканер/парсер...

Определённые терминалы в грамматике размечаются исходя из соображений расстановки отступов и соотв-е проверки вносятся в парсер...
Код:
@   проверка: соответствует ли число табов в начале строки текущему ур. отступа
>   увеличить ур. отступа
<   уменьшить ур. отступа
Итого:
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 КБ | Просмотров: 14315 ]

Автор:  Евгений Темиргалеев [ Суббота, 27 Март, 2010 14:23 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Если этот подход будет сочтён приемлемым, то надо проверять реализацию на всех частях грамматики... Уже увидел проблему с атрибутами записи [ABSTRACT | EXTENSIBLE | LIMITED]...

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

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

Автор:  ==== [ Суббота, 27 Март, 2010 16:26 ]
Заголовок сообщения:  Re: принудительные отступы в Оберонах?

Евгений Темиргалеев -
Может лучше ограничится кнопкой "Форматировать текст".

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

Страница 1 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/