Size: a a a

Compiler Development

2020 June 20

АК

Андрей Казанцев... in Compiler Development
Спасибо
источник

А

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

АК

Андрей Казанцев... in Compiler Development
Да, я понял что лексер это преобразователь из алфавита в алфавит
источник

K

Kir in Compiler Development
Андрей Казанцев
Да, я понял что лексер это преобразователь из алфавита в алфавит
Из UTF-8 в поток слов-токенов
источник

PS

Peter Sovietov in Compiler Development
Алексей ayaye :)
Традиционно для  лексера использовались регулярные выражения,  а для парсеров - кс грамматики. но для лексера тоже можно использовать кс-грамматику, в antlr так и делается.
Именно. И ведь можно также расширить нотацию КС-грамматик конструкциями регулярных выражений. Тогда можно будет вовсе забыть и о лексерах, и регулярных выражениях, как таковых.  Эта «свежая» мысль приходила в голову еще разработчикам начала 60-х :)
источник

А

Алексей ayaye :)... in Compiler Development
Peter Sovietov
Именно. И ведь можно также расширить нотацию КС-грамматик конструкциями регулярных выражений. Тогда можно будет вовсе забыть и о лексерах, и регулярных выражениях, как таковых.  Эта «свежая» мысль приходила в голову еще разработчикам начала 60-х :)
но тогда приходилось больше думать о производительности, чем о сложности разработки. и это накладывало ограничения на языки.
источник

ВМ

Виталий Медоваров... in Compiler Development
Андрей Казанцев
Зачем нужен лексер и в каких случаях без него не обойтись?
Если парсить парсер комбинаторами и вообще рекурсивным спуском — можно обойтись и без лексера
источник

K

Kir in Compiler Development
Да, тогда серьёзно раздумывали над тем, как сделать однопроходовый компилятор вместо много проходовгого - отсюда и forward declarations в C и Паскале.
источник

K

Kir in Compiler Development
Виталий Медоваров
Если парсить парсер комбинаторами и вообще рекурсивным спуском — можно обойтись и без лексера
Не рекомендую. Искать, в каком из парсеров потерялся проблел - такое себе. Уж лучше тогда и лексер руками написать. А уже на выходе лексера делать рекурсивный спуск.
источник

АК

Андрей Казанцев... in Compiler Development
https://ps-group.github.io/compilers/ast
Если есть Восходящий разбор методом свёртки то есть и нисходящий?
источник

K

Kir in Compiler Development
Андрей Казанцев
https://ps-group.github.io/compilers/ast
Если есть Восходящий разбор методом свёртки то есть и нисходящий?
LL - это нисходящий, [G]LR и LALR - восходящие, насколько я помню
источник

АК

Андрей Казанцев... in Compiler Development
Вот, а  там написано Восходящий разбор методом свёртки(LL,..
источник

M

MaxGraey in Compiler Development
Вот кстати интерестное предложение заменить регулярные выражения на ABNF правила:
https://www.sitepoint.com/alternative-to-regular-expressions
источник

ВМ

Виталий Медоваров... in Compiler Development
у триситтера примерно такую же идею можно заюзать https://github.com/Azganoth/tree-sitter-lua/blob/master/grammar.js
источник

M

MaxGraey in Compiler Development
Есть еще VerbalExpressions но они лишь рещают проблему читабельности, а так это все те же регулярные выражения
https://github.com/VerbalExpressions/JSVerbalExpressions#testing-if-we-have-a-valid-url
источник

M

MaxGraey in Compiler Development
Виталий Медоваров
у триситтера примерно такую же идею можно заюзать https://github.com/Azganoth/tree-sitter-lua/blob/master/grammar.js
Очень похоже на parser combinator
источник

ВМ

Виталий Медоваров... in Compiler Development
Не, это всё же генератор парсеров, из грамматики на джаваскрипте генерится либка сишная и можно потом кучей врапперов для разных языков разбирать дерево
источник

ВМ

Виталий Медоваров... in Compiler Development
фича в том что эта штука делает нам инкрементальный парсер
источник

ВМ

Виталий Медоваров... in Compiler Development
очень нужно для IDE всяких, чтобы при обновлении контента не перепаршивать весь файл, а так же парсинг не падает если обнаруживается ошибка парсинга
источник

K

Kir in Compiler Development
Оно не падает, да, оно просто вместо какого-то узла выдаёт (ERROR <пачка токенов>)
источник