Size: a a a

Compiler Development

2020 May 13

AT

Alexander Tchitchigi... in Compiler Development
источник

A

Alex in Compiler Development
ilya sheprut @optozorax
Привет. Подскажите пожалуйста на каком принципе делаются парсеры для современных языков программирования, что они пытаются продолжать парсинг даже когда встретили некорректные последовательности, и стараются охватить как можно больше ошибок за раз. Ну и литературу которую в эту сторону читать. Например, на данном скриншоте выведутся ошибки для let let let let, так и для невалидного.токена, хотя для простого парсера, парсинг должен был остановиться на этапе с let let let let, и вывелась ошибка бы только для этого, а невалидный.токен пропущен.
Общие принципы - как уже сказали в Драконе. На практике - можно покурить обработку ошибок в bison и попытаться сделать самому. Это проще чем кажется. Как это транслируется в другие парсеры - не знаю. В целом (один из вариантов) можно просто выделить продукцию, которая является выражением и при встрече ошибки в ней игнорировать символы вплоть до идентификатора конца выражения. Потом продолжить "как ни в чём не бывало"
источник

IK

Ivan Kochurkin in Compiler Development
В ANTLR тоже есть как встроенная, так и кастомная обработка ошибок. Во встроенной есть несколько типов: отсутствующий и лишние токены, неправильная цепочка токенов (до синхронизирующего), и самый общий - отсутствующая альтернатива.
источник

is

ilya sheprut @optozo... in Compiler Development
Окей, тогда гляну книгу Дракона
источник

is

ilya sheprut @optozo... in Compiler Development
Ivan Kochurkin
В ANTLR тоже есть как встроенная, так и кастомная обработка ошибок. Во встроенной есть несколько типов: отсутствующий и лишние токены, неправильная цепочка токенов (до синхронизирующего), и самый общий - отсутствующая альтернатива.
А синхронизирующий токен - это, например, закрывающая скобка или точка с запятой?
источник

PS

Peter Sovietov in Compiler Development
ilya sheprut @optozorax
Окей, тогда гляну книгу Дракона
Минуточку, Вас интересовало современное положение дел или вводная информация? Если последнее — то еще проще посмотреть у Вирта.
источник

IK

Ivan Kochurkin in Compiler Development
ilya sheprut @optozorax
А синхронизирующий токен - это, например, закрывающая скобка или точка с запятой?
Да - ANTLR сам его определяет, как замыкающий токен альтернативы.
источник

is

ilya sheprut @optozo... in Compiler Development
Peter Sovietov
Минуточку, Вас интересовало современное положение дел или вводная информация? Если последнее — то еще проще посмотреть у Вирта.
Ну вводную я знаю по идее: формальные грамматики, разбиение на токены, построение AST и потом его обработка, вот как раз сейчас этим в миниатюре занимаюсь. Так что, видимо, интересует современное положение дел
источник

PS

Peter Sovietov in Compiler Development
ilya sheprut @optozorax
Ну вводную я знаю по идее: формальные грамматики, разбиение на токены, построение AST и потом его обработка, вот как раз сейчас этим в миниатюре занимаюсь. Так что, видимо, интересует современное положение дел
Современное — это вопросы восстановления после ошибок в парсерах комбинаторов, в PEG, в GLR-парсерах, в том же ANTLR. В PEG, например, специально вводят нетерминалы-альтернативы для восстановления. В результате получается многословно, но более гибко, чем в ANTLR.
источник

is

ilya sheprut @optozo... in Compiler Development
То есть в момент когда я получаю AST, мне нужно предусмотреть в нём ошибочное состояние, и расширить грамматику PEG до условно такого:

S <- '{' Expr '}' / '{' AnythingExceptBrace '}'

?
источник

is

ilya sheprut @optozo... in Compiler Development
Peter Sovietov
Современное — это вопросы восстановления после ошибок в парсерах комбинаторов, в PEG, в GLR-парсерах, в том же ANTLR. В PEG, например, специально вводят нетерминалы-альтернативы для восстановления. В результате получается многословно, но более гибко, чем в ANTLR.
За термин "восстановление" спасибо, похоже гугл по этому выдаёт релевантные результаты

Ага, действительно, по этому запросу даже статья на википедии есть 🤦‍♂️
источник

PS

Peter Sovietov in Compiler Development
ilya sheprut @optozorax
То есть в момент когда я получаю AST, мне нужно предусмотреть в нём ошибочное состояние, и расширить грамматику PEG до условно такого:

S <- '{' Expr '}' / '{' AnythingExceptBrace '}'

?
Да, и в AnythingExceptBrace должно быть сообщение об очередной ошибке. Только надо учитывать, что это будет работать в PEG, но не в каком-нибудь yacc/bison.
источник

EM

Evgenii Moiseenko in Compiler Development
"современное состояние дел" и книга дракона несовместимые понятия
источник

EM

Evgenii Moiseenko in Compiler Development
вброшу ещё в качестве троллинга — давайте запретим в чате предлагать книгу дракона :)
или давайте хотя бы бота добавим, который на любой вопрос в чате будет кидать ссылку на книгу дракона
источник

PS

Peter Sovietov in Compiler Development
Evgenii Moiseenko
вброшу ещё в качестве троллинга — давайте запретим в чате предлагать книгу дракона :)
или давайте хотя бы бота добавим, который на любой вопрос в чате будет кидать ссылку на книгу дракона
Первые 2 дракона очень интересны по историческим причинам. Где еще прочитаешь разбор компилятора языка Bliss? А в последнем есть глава по Datalog. Так что Вы уж слишком категоричны! :)
источник

is

ilya sheprut @optozo... in Compiler Development
Evgenii Moiseenko
"современное состояние дел" и книга дракона несовместимые понятия
окей, спасибо 👌
источник
2020 May 14

G

Gymmasssorla in Compiler Development
Я правильно понимаю, что здесь речь о непроверяемых исключениях идёт?
источник

Dv

Dr. Friedrich von Ne... in Compiler Development
Gymmasssorla
Я правильно понимаю, что здесь речь о непроверяемых исключениях идёт?
А как проверяемость исключений поменяет эту картину?
источник

G

Gymmasssorla in Compiler Development
Dr. Friedrich von Never
А как проверяемость исключений поменяет эту картину?
Понадобиться добавить после throws новое исключение по всей цепочке
источник

Dv

Dr. Friedrich von Ne... in Compiler Development
Gymmasssorla
Понадобиться добавить после throws новое исключение по всей цепочке
Да, ты понимаешь правильно.
источник