Инфраструктура обработки ошибок в языках

Issue #311 new
Oleg Sychev repo owner created an issue

Originally reported on Google Code with ID 311

Сразу хорошо мы не сделаем (по ошибкам парсера позже придется поработать), но пока надо
обеспечить возможность клиентам блока проверять лексическую/синтаксическую корректность
строки на языке до попытки ее обработать и ругаться (хоть как-то) пользователю где
что не так.

Поэтому - добавил в processed_string поле errors (не стал делать set_errors - если
надо, напишите). Лексер и парсер должны туда копировать объекты ошибок - дети от ast_node_base
с прописанной позицией в тексте. Эти же объекты могут включаться в поток лексем/дерево,
чтобы оно было все-таки деревом и чтобы ничего не было пропущено - можете посмотреть
на block_regex_constructor как он показывает в дереве синтаксические ошибки, там мы
реализовывали похожий подход. (Кстати, там есть забавный подход к отлову скобочных
ошибок в выражениях; но боюсь для полного С++ парсера это будет тяжко, нужно другие
варианты искать).

Сейчас критично сделать обработку лексических и хоть в каком-то виде синтаксических
(т.е. без подробных и понятных сообщений о природе ошибки там где их сделать нелегко,
ибо в LALR-парсинге это далеко не всегда очевидная задача - но с position и включенных
в дерево) - чтобы лексер/персер заполняли массив errors (может понадобится написать
set_errors) и он мог использоваться клиентами. 

Также для этой задачи требуется давно нужное добавление в позицию charstart/charend
- координат в символах от начала строки (считая символы перевода строки), в противном
случае обрабатывать многострончные "строки" очень неудобно. Говорил я вам об этом давно.
Работа более-менее механическая в лексере, плюс немного кода в парсере. Работу в лексере
можете после пары примером поручить кому-то из младших, если они ждут вас по своим
задачам...

Reported by oasychev on 2014-12-03 00:30:43

Comments (6)

  1. Former user Account Deleted
    Подождите, очень странно - в классе у нас в node_position все позиции хранятся и для
    начала строки и с переносом и безе переноса. Что-то странно...
    

    Reported by mamontov.dp on 2014-12-03 12:12:57

  2. Oleg Sychev reporter
    А, сорри - позиции да есть.
    Нужно тогда заполнить массив ошибками, чтобы клиенты могли легко проверить их наличие
    и печатать сообщения....
    

    Reported by oasychev on 2014-12-05 16:21:17

  3. Former user Account Deleted
    Я правильно понял, что имеются ввиду ошибки лексического и синтаксического разбора?
    

    Reported by mamontov.dp on 2014-12-05 18:35:29

  4. Oleg Sychev reporter
    Да, причем ошибки лексические могут быть описаны полноценным образом, а синтаксические
    - как получится учитывая LALR. Но position быть должны "объекты ошибок - дети от ast_node_base
    с прописанной позицией в тексте"
    

    Reported by oasychev on 2015-04-09 20:53:40

  5. Dmitry Mamontov

    Сделал первый подход к реализации данной задачи. Вообще понял, что у нас как-то странно это организовано - есть же lexical_error, который отвечает за ошибки при разборе. Сделал, чтобы его объектами заполнялось данное поле - при лексическом поле оно копируется из block_formal_langs_token_stream::errors, при синтаксическом разборе - заполняется объектами block_formal_langs_parsing_error.

  6. Dmitry Mamontov

    Кстати - не могу изменить статус, что, не есть хорошо. Не стоит ли посмотреть права?

  7. Log in to comment