Как стать автором
Обновить

Комментарии 13

где вы были когда я сдавал «Принципы компиляторов» =(
вопрос, насколько понятные сообщения о синтаксических ошибках будет давать компилятор? насколько сложно будет добавить красивые сообщения об ошибках типа

test.jsk line 1 pos 4: '(' expected got number

if 10 < x) {
   ^


Встроенных бизоньих средств для этого не знаю; но знаю, где хакать в сгенерированном парсере, чтоб сообщения были такими :)
Интересная идея для будущих постов, кстати.
т.е. если требуется улучшить сообщение об ошибке надо править сгенерированный код?

при этом если потребуется поправить что-то в грамматике придется перегенерировать парсер, а потом туда перекопировать аккуратно все свои правки связанные с улучшениями сообщений об ошибках?

не очень удобно, вы не находите?
Не нахожу.
Один раз делаю дифф, и накладываю его на сгенерированный парсер сразу после генерации, той же строчкой в мейкфайле.
От компиляции к компиляции в парсере меняются только таблицы, код остаётся каким был.
Встроенных бизоньих средств нет, так как это не его область ответственности.
Обычно это делают в лексере: т.е. на паттерн "\n" делают счётчик строк и сброс положения столбца. А в остальные правила добавляют счётчик количества прочитанного символа (что-то вроде CurColumn+=strlen(yytext); )
А дальше с каждым токеном сопоставляют информацию о положении: имя файла, начало и конец.
Это верно, но информацию «какой символ попался и какой должен был быть» бизон мог бы и передавать в yyerror().
По умолчанию, не передаёт.

Передавать, как выяснилось, умеет: нужно упомянуть в разделе объявлений %error-verbose

[tyomitch@home ~]$ ./a.out
if 10 < x {
syntax error, unexpected NUM, expecting '(', line 1
Извините, как-то однобоко. Вы рассмотрели грамматики и разбор, и совершенно упустили (а) проверку типов (какие синтаксические конструкции разрешены, а какие — нет), (б) семантику (описание выполнения). В настоящих языках программирования это гораздо важнее, причем именно с точки зрения их использования.
Вы хотите, чтобы весь язык поместился в один пост?
Всё знакомо до дикой боли в голове) Как раз в этом семестре компилятор писали. Где же вы были полгода назад?)
Надеюсь, осенью этот текст пригодится следующему курсу)
Еще как пригодится! Компилятор хоть и не пишем, только общая теория языков и грамматик, но все равно!
Спасибо за цикл статей!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории