185 похожих чатов

Скажите. А как «интерполированные» строки обычно лексером видятся?

9 ответов

8 просмотров

я лексил раздельно дабл-квот, раздельно содержимое строки, раздельно скобки интерполяции, но для этого в лексере нужен контект в виде списка натов https://gist.github.com/kana-sama/f90ec78b342a014f606e86836b0a3128

Начало интерполированной строки, середина интерполированной строки, конец интерполированной строки

Хмм... а что такое "обычно" (это же зависит от возможностей, предоставляемых такой интерполяцией — начиная от "как обычные", через lexer modes (см. http://www.oilshell.org/blog/2017/12/17.html) / start conditions ( http://westes.github.io/flex/manual/Start-Conditions.html ) и до "рекурсивно вызывается [другой] интерпретатор")?

Зависит от умности лексера и от сложности интерполяции. Вот как сделано в парсере Котлина в Antlr, например (несколько состояний) https://github.com/antlr/grammars-v4/blob/master/kotlin/kotlin/KotlinLexer.g4#L174 Мы забирали строку в АСТ и разбирали позже.

Вот кстати совсем недавно попался пример того, как интерполированные строки делать не надо: http://phpsadness.com/sad/54

Dmitry Solomennikov
Зависит от умности лексера и от сложности интерпол...

То есть, вы полностью разбираете выражение прямо в первом парсере! А там встроенное (интерполированное ?) выражение может быть любым Котлиновским выражением, или их язык слегка лимитирован?

Konstantin Romanov
То есть, вы полностью разбираете выражение прямо в...

К сожалению, не скажу, как оно по факту в Котлине. Я лишь показал, что это один из вариантов разбора интерированных строк. Заносить все в одно дерево - облегчить работу typechecker у, но усложнить парсер и дерево. Сохранить "просто строки" и разобрать попозже - оставить пространство для маневра в архитектуре, локализовать обработку, но частично завязать стадии компиляции друг на друга. You decide. Есть еще вариант не использовать интерированные строки, но, боюсь, меня совсем тапками закидают :) Я дважды подумаю о семантике строк перед добавлением такой фичи в язык.

Andrei Kurosh
Вот кстати совсем недавно попался пример того, как...

Предлагаю вашему вниманию схему заработка на крипте. Все что нужно - быть программистом. Подробности в ЛС. Заработок до 1млн чистыми в месяц.

https://github.com/GaijinEntertainment/daScript/blob/master/src/parser/ds_parser.ypp - конкретно character_sequence : STRING_CHARACTER[char] { $$ = new string(); *$$ += $char; } | STRING_CHARACTER_ESC { $$ = new string(); *$$ += "\\\\"; } | character_sequence[elem] STRING_CHARACTER[char] { $$ = $elem; *$elem += $char; } | character_sequence[elem] STRING_CHARACTER_ESC { $$ = $elem; *$elem += "\\\\"; } ; string_constant : BEGIN_STRING character_sequence[seq] END_STRING { $$ = $seq; } ; string_builder_body : { $$ = new ExprStringBuilder(); $$->at = LineInfo(yyextra->g_FileAccessStack.back(), yylloc.first_column,yylloc.first_line,yylloc.last_column,yylloc.last_line); } | string_builder_body[sb] character_sequence[sconst] { bool err; auto esconst = unescapeString(*$sconst,&err); if ( err ) das_yyerror(scanner,"invalid escape sequence",tokAt(scanner,@sb), CompilationError::invalid_escape_sequence); auto sc = make_smart<ExprConstString>(tokAt(scanner,@sconst),esconst); delete $sconst; static_cast<ExprStringBuilder *>($sb)->elements.push_back(sc); $$ = $sb; } | string_builder_body[sb] BEGIN_STRING_EXPR expr[subexpr] END_STRING_EXPR { auto se = ExpressionPtr($subexpr); static_cast<ExprStringBuilder *>($sb)->elements.push_back(se); $$ = $sb; } ; string_builder : BEGIN_STRING[sfrm] string_builder_body[sb] END_STRING[sto] { auto strb = static_cast<ExprStringBuilder *>($sb); if ( strb->elements.size()==0 ) { $$ = new ExprConstString(tokRangeAt(scanner,@sfrm,@sto),""); delete $sb; } else if ( strb->elements.size()==1 && strb->elements[0]->rtti_isStringConstant() ) { auto sconst = static_pointer_cast<ExprConstString>(strb->elements[0]); $$ = new ExprConstString(tokRangeAt(scanner,@sfrm,@sto),sconst->text); delete $sb; } else { $$ = $sb; } } ;

Похожие вопросы

Обсуждают сегодня

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
Открыл свой двухкилобайтный экзешник в x32dbg, а тут какая-то хрень. Смущает кнопка "выполнить до пользовательского кода", а что ещё может быть в файле помимо него ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
11
Вопрос тем кто смотрит видео и слушает подкасты - как вы потом ищете нужную вам информацию? Вот статью я прочитал, потом могу искать нужную мне часть банальным поиском. Пропус...
Aleksandr Druzhinin
4
Мне были интересны дишные хаки и я нашёл любопытный способ на форуме через __traits, что-то вроде int delegate(int) fac = (int n) => n == 0 ? 1 : n * __traits(parent, {})(n - ...
Constantin F.
1
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
14
@FAssembler ты много с формами работал, как цикл обработки сообщений от окошек надо делать, чтобы IsDialogMessage не ломал ввод в эдиты и навигация по табам работала?
The Bird of Hermes
8
Карта сайта