Size: a a a

Compiler Development

2021 February 18

YS

Yaroslav Schekin in Compiler Development
MrSmith
Я бы ещё хотел понять зачем токенизатор
По многим причинам, например:
1. Упрощает реализацию задачи (к примеру, парсеру не нужно мучиться с комментариями, whitespace, line continuations, semicolon insertion и т.п.).
2. Для реализации [большей части] лексического анализа можно применять специализированные средства — regular expressions и построение по ним DFA (или сразу генерирование кода распознавания tokens).
3. Для изменения фактического уровня разбираемой грамматики в иерархии Хомского (без чего для существенной доли практических языков CFG-парсеры — "фальшивки жалкие" ;) ).
4. И да, это сейчас памяти обычно более чем достаточно, а раньше lexers занимались управлением буферизацией входного потока и лексем, и прочими подобными делами.
источник

M

MrSmith in Compiler Development
Поясните 3
источник

M

MrSmith in Compiler Development
Как я понимаю, в реальности кругом обман и на самом деле тот же бизон как раз CDG если учитывать всякие resolution rule и actions
источник

YS

Yaroslav Schekin in Compiler Development
MrSmith
Поясните 3
К примеру, тот же python на уровне символов — не контекстно-свободный язык (из-за семантически значимой indentation), и никакой "истинный лекслес CFG парсер" его в принципе не способен разобрать.
Аналогично с here documents-подобными конструкциями, ну и так далее.
источник

M

MrSmith in Compiler Development
Почему?
источник

M

MrSmith in Compiler Development
Lexerless разве не имеет что то вроде функции скипа
источник

M

MrSmith in Compiler Development
Берём, меняем ее, получаем символ
источник

YS

Yaroslav Schekin in Compiler Development
MrSmith
Берём, меняем ее, получаем символ
И заодно получаем и примитивный lexer. ;)
Т.е. да, "в реальности кругом обман и на самом деле" и т.п. Конечно, не кругом, но случаев хватает.
источник

M

MrSmith in Compiler Development
Надо короче копать историю, конечно скорей всего оно действительно так, чем не так, но хочется понять кто все же отвечает точно к примеру за peek
источник

M

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

K

Kir in Compiler Development
MrSmith
Я бы ещё хотел понять зачем токенизатор
Потому что после токенизатора можно влепить расстановщик { ; } и сделать indentation-dependent язык, например
источник

K

Kir in Compiler Development
MrSmith
Я бы ещё хотел понять зачем токенизатор
Да и не захочет никто писать парсер, орудующий над буквами, это exercise in frustration.

Лексер сильно упрощает задачу.
источник

AT

Alexander Tchitchigi... in Compiler Development
Kir
Да и не захочет никто писать парсер, орудующий над буквами, это exercise in frustration.

Лексер сильно упрощает задачу.
"У нас" в Spoofax SGLR, "орудующий над буквами" -- жить, вроде, можно. Сейчас, правда, возникают грустные моменты с инкрепентализацией, но с другой стороны -- много ли вообще инкрепентальных парсеров, кроме tree sitter?
источник

s

suhr in Compiler Development
Kir
Да и не захочет никто писать парсер, орудующий над буквами, это exercise in frustration.

Лексер сильно упрощает задачу.
Контрпример: PEG.
источник

s

suhr in Compiler Development
Да, и парсинг это всего лишь построение доказательства того, что строка соответствует языку, описываемому грамматикой.
источник

s

suhr in Compiler Development
Дерево разбора это нично иное, как proof tree.
источник

K

Kir in Compiler Development
suhr
Контрпример: PEG.
Если завернуть все парсеры "токенов" в токенизаторы, то да. Я довольно долго пользовался парсеркомбинаторами, которые packrat-без-мемоизации, и это ну такое
источник

K

Kir in Compiler Development
Чем мне нравится LR(1), несмотря на все его проблемы (dangling else, etc) - так это тем что кофликт в нём означает проблему в _грамматике_. А PEG просто сожрёт всё своим left-biased choice.
источник

K

Kir in Compiler Development
Есть, вообще, какой-нибудь обзор вида "мы проанализировали X случаев применения LR(1) и это принесло такие-то и сякие-то проблемы?"
источник

J

JohnByte in Compiler Development
Kir
Да и не захочет никто писать парсер, орудующий над буквами, это exercise in frustration.

Лексер сильно упрощает задачу.
Да. Проще расширять синтаксис языка, в котором нетерминалов может быть в разы больше терминалов
источник