Size: a a a

Compiler Development

2020 November 25

PS

Peter Sovietov in Compiler Development
Lev
Доброго вечера. Кто знает, в каких компиляторах (из хоть как-то используемых) парсер написан рекурсивным спуском?
В практически всех современных промышленных компиляторах парсер реализован именно таким образом.
источник

PS

Peter Sovietov in Compiler Development
Hirrolot
у rustc LR емнип
И опять Rust, ну что ты будешь делать! В любом случае, мало похоже вот это на LR :)
https://github.com/rust-lang/rust/blob/master/compiler/rustc_parse/src/parser/stmt.rs
источник

VK

Vladimir Kazanov in Compiler Development
Peter Sovietov
И опять Rust, ну что ты будешь делать! В любом случае, мало похоже вот это на LR :)
https://github.com/rust-lang/rust/blob/master/compiler/rustc_parse/src/parser/stmt.rs
Ну хорошо. В питоне и старый, и новый парсеры реализованы на собственном генераторе компиляторов.
источник

K

Kakadu in Compiler Development
Наверное ещё стоит кратко сформулировать, почему именно рекурсивный спуск, а не что-то другое...
источник

PS

Peter Sovietov in Compiler Development
Vladimir Kazanov
Ну хорошо. В питоне и старый, и новый парсеры реализованы на собственном генераторе компиляторов.
Новый вариант — PEG, который, на самом деле, "синтаксический сахар" над тем же рекурсивным спуском :)
источник

PS

Peter Sovietov in Compiler Development
Kakadu
Наверное ещё стоит кратко сформулировать, почему именно рекурсивный спуск, а не что-то другое...
Похоже, надо уже заметку на эту тему разместить на github, чтобы не повторяться.
источник

VK

Vladimir Kazanov in Compiler Development
Kakadu
Наверное ещё стоит кратко сформулировать, почему именно рекурсивный спуск, а не что-то другое...
Если вы задаетесь этим вопросом, то вам просто стоит использовать тот метод, который лично вам знаком лучше 😊 Парсер это самый скучный из возможных аспектов компиляторов.
источник

K

Kakadu in Compiler Development
Peter Sovietov
Похоже, надо уже заметку на эту тему разместить на github, чтобы не повторяться.
Давно пора
источник

VK

Vladimir Kazanov in Compiler Development
Peter Sovietov
Новый вариант — PEG, который, на самом деле, "синтаксический сахар" над тем же рекурсивным спуском :)
Ну так и оригинальный LL(1) это есть механизированный рекурсивный спуск 😊
источник

K

Kakadu in Compiler Development
Vladimir Kazanov
Если вы задаетесь этим вопросом, то вам просто стоит использовать тот метод, который лично вам знаком лучше 😊 Парсер это самый скучный из возможных аспектов компиляторов.
Нет, я как раз хочу разобраться почему его используют и обоснованно ли. Так ли уж плохо пытаться восстанавливать и ругаться об ошибках в других способах?
источник

SB

Sergey Belyshev in Compiler Development
Рекурсивный спуск интересен в первую очередь простотой реализации, в т ч сложных вещей, см. напр. commit message "нового" C парсера в GCC: https://gcc.gnu.org/pipermail/gcc-patches/2004-October/153285.html
источник

PS

Peter Sovietov in Compiler Development
Kakadu
Нет, я как раз хочу разобраться почему его используют и обоснованно ли. Так ли уж плохо пытаться восстанавливать и ругаться об ошибках в других способах?
источник

AG

Alex Gryzlov in Compiler Development
я бы дописал к "сортировочной станции" в скобках shunting yard
источник

PS

Peter Sovietov in Compiler Development
Alex Gryzlov
я бы дописал к "сортировочной станции" в скобках shunting yard
Спасибо! (PR я тоже принимаю :)
источник

YS

Yaroslav Schekin in Compiler Development
Может, стоит добавить и каких-то недостатков recursive descent (я понимаю, что статья не об этом... или предупреждение о том, что минусы тут не рассматриваются)?

> возможен разбор для неограниченных или Тьюринг-полных грамматик.

Я в этом не разбираюсь, но разве это не одно и то же (точнее, мне кажется, что это "неограниченные грамматики" = "машины Тьюринга")?

> не выдерживает столкновения с реальностью в виде контекстно-зависимых грамматик сложных языков программирования

Просто вопрос — а у каких сложных языков именно формально контекстно-зависимые грамматики?
источник

PS

Peter Sovietov in Compiler Development
Yaroslav Schekin
Может, стоит добавить и каких-то недостатков recursive descent (я понимаю, что статья не об этом... или предупреждение о том, что минусы тут не рассматриваются)?

> возможен разбор для неограниченных или Тьюринг-полных грамматик.

Я в этом не разбираюсь, но разве это не одно и то же (точнее, мне кажется, что это "неограниченные грамматики" = "машины Тьюринга")?

> не выдерживает столкновения с реальностью в виде контекстно-зависимых грамматик сложных языков программирования

Просто вопрос — а у каких сложных языков именно формально контекстно-зависимые грамматики?
> Я в этом не разбираюсь, но разве это не одно и то же (точнее, мне кажется, что это "неограниченные грамматики" = "машины Тьюринга")?

Добавлю для определенности "иначе". Спасибо!

> Просто вопрос — а у каких сложных языков именно формально контекстно-зависимые грамматики?

Тот же lexer hack — следствие зависимости от контекста. Попробуйте найти старый вариант gcc, где использовались flex/bison — думаю, ужаснетесь, какой там "изящный" код  :)
источник

А

Алексей ayaye :)... in Compiler Development
LR же вроде быстрее, чем LL. про память не помню уже
источник

АП

Антон Пилипчук... in Compiler Development
Vladimir Kazanov
Если вы задаетесь этим вопросом, то вам просто стоит использовать тот метод, который лично вам знаком лучше 😊 Парсер это самый скучный из возможных аспектов компиляторов.
мне кажется скучнее только лексер
источник

PS

Peter Sovietov in Compiler Development
Yaroslav Schekin
Может, стоит добавить и каких-то недостатков recursive descent (я понимаю, что статья не об этом... или предупреждение о том, что минусы тут не рассматриваются)?

> возможен разбор для неограниченных или Тьюринг-полных грамматик.

Я в этом не разбираюсь, но разве это не одно и то же (точнее, мне кажется, что это "неограниченные грамматики" = "машины Тьюринга")?

> не выдерживает столкновения с реальностью в виде контекстно-зависимых грамматик сложных языков программирования

Просто вопрос — а у каких сложных языков именно формально контекстно-зависимые грамматики?
> Может, стоит добавить и каких-то недостатков recursive descent (я понимаю, что статья не об этом... или предупреждение о том, что минусы тут не рассматриваются)?

Недостатки появились в конце заметки. Спасибо!
источник

YS

Yaroslav Schekin in Compiler Development
Peter Sovietov
> Я в этом не разбираюсь, но разве это не одно и то же (точнее, мне кажется, что это "неограниченные грамматики" = "машины Тьюринга")?

Добавлю для определенности "иначе". Спасибо!

> Просто вопрос — а у каких сложных языков именно формально контекстно-зависимые грамматики?

Тот же lexer hack — следствие зависимости от контекста. Попробуйте найти старый вариант gcc, где использовались flex/bison — думаю, ужаснетесь, какой там "изящный" код  :)
Я почему-то помнил, что lexer hack и ему подобные — это семантический контекст (т.е. "зависимость от контекста" тут используется неформально, а формально — это unrestricted grammar)... неправильно думал, получается?

>  думаю, ужаснетесь, какой там "изящный" код  :)

Да во многих реальных парсерах, использующих bison и т.п., что-то подобное (разнообразные hacks, в т.ч. "дополнительные семантические действия на стадии разбора") есть, наверное — но не просто так, а чтобы остаться в LALR(1). ;)
источник