Size: a a a

Compiler Development

2020 June 23

VM

Victor Miasnikov in Compiler Development
MaxGraey
А то как разные CPU обрабатывают субнормальные числа это вообще отдельная история
А в GPU вообще любят считать в "DEC стиле", т.е. игнорируя нововведения в IEEE.

Т.е. зачем нам верифицировать то, что по определению неправильно?

--
 
У нас же есть соседний чат, про верификацию ПО. "Откочёвываем"?
источник

f

for(int c; (c = getc... in Compiler Development
Итогом работы парсера является дерево разбора (parse tree), включающее в себя части грамматики, не имеющие практически никакого значения для последующих этапов компиляции - различного рода скобки, токены для начала/конца массивов и так далее.

Если я правильно понимаю, дальнейшая работа компилятора основывается на абстрактном синтаксическом дереве (abstract syntax tree), в котором значительное число вспомогательных конструкций отсутствует и само представление кода сильно упрощено.

В тех книгах которые я читал рассматриваются различные алгоритмы разбора (LL, LR, LALR и т.д.), позволяющие получить дерево разбора и внутреннее представление (абстрактное синтаксическое дерево) но не рассматриваются алгоритмы по переводу одного в другое.

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

AT

Alexander Tsukanov in Compiler Development
AST можно строить сразу без дерева разбора
источник

AT

Alexander Tsukanov in Compiler Development
Дерево разбора получается если вы на каждое правило всегда создаете узел.
AST получается если действовать чуть умнее и создавать только реальные узлы
источник

f

for(int c; (c = getc... in Compiler Development
Да, я могу так сделать но мне все же не хочется смешивать все в одну кучу -  так я смогу написать генератор парсеров который дает мне просто дерево разбора и после чего его можно переписать под свои нужды. Не заставлять пользователя рассовывать по парсеру свои кусочки кода а просто дать ему готовое дерево.
источник

AT

Alexander Tsukanov in Compiler Development
на мой взгляд генерить сразу AST проще
источник

AT

Alexander Tsukanov in Compiler Development
ну если вы пишете парсер руками
если генератором парсеров, то там вы пляшете так как вам диктует генератор )
источник

AT

Alexander Tsukanov in Compiler Development
Вот например генерация AST при разборе выражений руками: https://gist.github.com/tsukanov-as/ab9b48bee66c31cdbbd2e2ec4f5f6bef
источник

AT

Alexander Tsukanov in Compiler Development
Есть ли хоть одна причина генерить тут дерево разбора? Лично я не вижу )
источник

f

fldlg2 in Compiler Development
Чтобы сразу генерить AST (в LL, LR и т.д.), нужен либо совсем простой предельно контекстно-свободный язык, либо нужно мучительно бороться с контекстами. Поэтому есть такой подход — создавать дерево разбора в виде недо-AST, а вторым проходом "уточнять" его до настоящего AST, заменяя некоторые "обобщённые" узлы "конкретными".
источник

f

fldlg2 in Compiler Development
Ключевое слово — "контекстуализация".
источник

AT

Alexander Tsukanov in Compiler Development
Ну я не настоящий сварщик. А есть пример чтоб было очевидно что это удобнее?
источник

f

fldlg2 in Compiler Development
Не удобнее. Производителнее, но с приемлемой сложностью разработки.
источник

f

for(int c; (c = getc... in Compiler Development
fldlg2
Чтобы сразу генерить AST (в LL, LR и т.д.), нужен либо совсем простой предельно контекстно-свободный язык, либо нужно мучительно бороться с контекстами. Поэтому есть такой подход — создавать дерево разбора в виде недо-AST, а вторым проходом "уточнять" его до настоящего AST, заменяя некоторые "обобщённые" узлы "конкретными".
Вот, это как раз ближе к тому что я хочу получить. Я пишу генератор парсеров - достаточно простой - и не хочу усложнять его дополнительными возможностями, доступными прямо во время разбора. Так что выдать "недо-AST" мне как раз гораздо удобнее.
источник

AT

Alexander Tsukanov in Compiler Development
Аааа, ну с генераторами то понятно )
источник

AT

Alexander Tsukanov in Compiler Development
Алгоритм для преобразования емнип в модерн компилерах описан
источник

f

fldlg2 in Compiler Development
А дерево разбора само по себе может быть полезно а) для реконструкции входного текста и б) для продвинутых сообщениях об ошибках и т.п.
источник

f

fldlg2 in Compiler Development
AST — это, всё-таки, потеря информации.
источник

AT

Alexander Tsukanov in Compiler Development
Alexander Tsukanov
Алгоритм для преобразования емнип в модерн компилерах описан
вру, забыл название
источник

AT

Alexander Tsukanov in Compiler Development
fldlg2
AST — это, всё-таки, потеря информации.
это потеря информации о процессе разбора
ничего другого там не теряется если этого специально не делать
источник