Re[3]: Восстановление после ошибок парсинга
От: Кодт Россия  
Дата: 28.06.13 22:26
Оценка: 20 (1)
Здравствуйте, VladD2, Вы писали:

VD>Нет. Не нужен. Просто чуть-чуть иной алгоритм. Когда мы доходим до этого места, то парсер падает на всех имеющихся правилах. Далее мы тупо пропускаем по одному символу и пытаемся парситься дальше. После пропуска двух символов мы встречаем разумное продолжение и продолжаем парсинг. В итогде /* записываются в мусор и как бы игнорируются парсером.


Я вот подумал: а нельзя ли сюда приплести какую-нибудь недетерминированную систему (скрытую марковскую модель там...)
Это будет не совсем "тупо пропускаем по символу", а, например, так.

Рассмотрим n-граммы лексем или даже термов, и их вероятности.
Вероятность /* всякая фигня, ломающая лексер высоко вероятна; /* something() breaking parser тоже вероятно; /* {good();code(); сравнимо с обычным кодом.

Как только парсер или лексер споткнулся, прекращаем детерминированное чтение и начинаем недетерминированное, выбирая, я уж не знаю, 100 лучших гипотез на каждую лексему. В недетерминированном должны встречаться эпсилон-переходы, то есть, мысленное дописывание забытых лексем (закрывающих */, например) и мысленное вычёркивание лишних.
Пройдя достаточно длинный отрезок текста, выбираем наилучшую гипотезу и парсим её.

Эвристический подход состоит в разбиении текста по характерным местам для восстановления: это ';' и '}', а также EOF (лечимся от кривых инклудов) и пробельные строки (здравый смысл подсказывает).
Тем самым мы занимаемся догадками (как выше) или восстанавливаем контекст (как ты предложил) не слишком мелочно и не слишком далеко по тексту.

Для интеллисенса должно помочь.
Перекуём баги на фичи!
Re[3]: Восстановление после ошибок парсинга
От: hattab  
Дата: 28.06.13 22:40
Оценка:
Здравствуйте, Кодт, Вы писали:

К> У турбо-паскаля было именно такое поведение: тыкал носом в первую встреченную ошибку, а не выдавал 100 наведённых.

К> Офигительно "удобно", сто попыток перекомпиляции, пока каждую ошибку не исправишь.

С его-то скоростью компиляции — не проблема вообще.
avalon 1.0rc3 build 432, zlib 1.2.5
Re[4]: Восстановление после ошибок парсинга
От: Кодт Россия  
Дата: 28.06.13 23:31
Оценка:
Здравствуйте, hattab, Вы писали:

H>С его-то скоростью компиляции — не проблема вообще.


Ещё какая проблема. Ты использовал паскаль для промышленного программирования, а не школьно-институтского? Я использовал. Бесит — это ничего не сказать.
Перекуём баги на фичи!
Re[5]: Восстановление после ошибок парсинга
От: hattab  
Дата: 29.06.13 05:54
Оценка:
Здравствуйте, Кодт, Вы писали:

К> H>С его-то скоростью компиляции — не проблема вообще.


К> Ещё какая проблема. Ты использовал паскаль для промышленного программирования, а не школьно-институтского? Я использовал. Бесит — это ничего не сказать.


Я его использую. Не турбо-паскаль конечно. В дельфях Ctrl+F9 (Compilation) можно рассматривать как хоткей для перехода на следующую ошибку — зверски быстро
avalon 1.0rc3 build 432, zlib 1.2.5
Re[6]: Восстановление после ошибок парсинга
От: Кодт Россия  
Дата: 29.06.13 08:55
Оценка:
Здравствуйте, hattab, Вы писали:

H>Я его использую. Не турбо-паскаль конечно. В дельфях Ctrl+F9 (Compilation) можно рассматривать как хоткей для перехода на следующую ошибку — зверски быстро


Нда... а я надеялся, что хоть потомки будут жить при коммунизме, и в дельфях этой фичи не будет.
Вообще, странно, что именно в паскале с его простым синтаксисом не смогли сделать такой предсказатель.
Перекуём баги на фичи!
Re[7]: Восстановление после ошибок парсинга
От: hattab  
Дата: 29.06.13 09:27
Оценка: 2 (1)
Здравствуйте, Кодт, Вы писали:

К> H>Я его использую. Не турбо-паскаль конечно. В дельфях Ctrl+F9 (Compilation) можно рассматривать как хоткей для перехода на следующую ошибку — зверски быстро


К> Нда... а я надеялся, что хоть потомки будут жить при коммунизме, и в дельфях этой фичи не будет.

К> Вообще, странно, что именно в паскале с его простым синтаксисом не смогли сделать такой предсказатель.

Сделали. Но Ctrl+F9 использовать сильно проще
avalon 1.0rc3 build 432, zlib 1.2.5
Re: Восстановление после ошибок парсинга
От: nikov США http://www.linkedin.com/in/nikov
Дата: 22.07.13 17:26
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Большинство компиляторов скажут что в конце файла ожидается "*/", т.е. комментарий не закрыт.

VD>Но в принципе тут можно восстановиться записав "/*" в грязь (т.е. проигнорировать начало комментария).
VD>Какой вариант по вашему лучше? И какие подводные грабли тут могут возникнуть?

В идеале, надо предполагать, что отсутствующий токен */ находится в такой позиции, которая ведёт к наименьшему количеству ошибок в проекте. Предчувствую, что это непросто реализовать
Re[2]: Восстановление после ошибок парсинга
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.13 19:14
Оценка:
Здравствуйте, nikov, Вы писали:

N>В идеале, надо предполагать, что отсутствующий токен */ находится в такой позиции, которая ведёт к наименьшему количеству ошибок в проекте. Предчувствую, что это непросто реализовать


Ага. Экспонента вылезает.

Мы уже угаждываем продолжение не хуже ИИ . Но в идеале нужно тупо перебирать все варианты продолжения и пытаться опарсить хвост в штатном решжие. Тут появляются ветвления. А в них свои ветвления...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Восстановление после ошибок парсинга
От: alpha21264 СССР  
Дата: 22.07.13 19:47
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ага. Экспонента вылезает.


VD>Мы уже угаждываем продолжение не хуже ИИ . Но в идеале нужно тупо перебирать все варианты продолжения и пытаться опарсить хвост в штатном решжие. Тут появляются ветвления. А в них свои ветвления...


Ну, в общем двоичное дерево.
Причем ветвления только на открывающих комментариях.
Причем только в том случае, если последний не закрыт.
Причем любой кусок текста может быть только в двух состояниях — комментарий и программа.

По моему, не так страшно. Потренироваться можно на кошках.
То есть, поиграть на файле, который содержит только комментарии

К стати, почему мы говорим "синтаксическое дерево",
хотя это сначала это "синтаксический список"
и только потом он становится деревом?

Течёт вода Кубань-реки куда велят большевики.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.