Size: a a a

Compiler Development

2020 December 01

PS

Pavel Samolysov in Compiler Development
hazer_hazer
Переслано от hazer_hazer
На самом деле это от реализации зависит. Можно разделить операторы и киворды. Но числа в юнионах на уровне токенов хранить не стоит.


Если у тебя на уровне парсинга важно знать, что токен это оператор, например, если у тебя есть оверрайд типа def +(), как в руби, то это может быть удобно. Но хз.

У меня определение оператор/киворд реализовано возможно не супер безопасно: у меня enum class TokenType: uint8_t, в котором токены сгруппированы и определяется по range от первого оператора до "не оператора"
В демопроекте mlir (toy называется) они пошли тем же путем https://github.com/llvm/llvm-project/blob/master/mlir/examples/toy/Ch1/include/toy/Lexer.h
источник

M

MrSmith in Compiler Development
+ это способ отделить стат анализ от генерации но так что бы генерацию можно было валидировать
источник

M

MrSmith in Compiler Development
Да такое я знаю
источник

M

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

IK

Ivan Kochurkin in Compiler Development
hazer_hazer
Ты имеешь в виду, почему структура
Token {
   TokenType type
   String val
}

Абстрактно

А не
Token {
   TokenType type
   Union {string, Operator, Keyword, monostate} Tag
}

?
Можно даже не string хранить, а спан стринга.
источник

h

hazer_hazer in Compiler Development
Ivan Kochurkin
Можно даже не string хранить, а спан стринга.
?
Если вы про возможность пустоту положить вместо стринги, сам думал как бы это на плюсах без поинтеров реализовать, так как строка пустая 8 байт занимает...
источник

K

Kir in Compiler Development
Ivan Kochurkin
Можно даже не string хранить, а спан стринга.
Я больше скажу: лучше хранить спан стринга и ссылку на исходный текст. Если тексты ожидаются здоровенные, то лучше его перекодировать в UTF32.
источник

K

Kir in Compiler Development
К которому доступ за O(1), а не O(N)
источник

h

hazer_hazer in Compiler Development
Kir
Я больше скажу: лучше хранить спан стринга и ссылку на исходный текст. Если тексты ожидаются здоровенные, то лучше его перекодировать в UTF32.
а что такое спан стринга?
источник

M

MrSmith in Compiler Development
hazer_hazer
а что такое спан стринга?
Начало конец
источник

h

hazer_hazer in Compiler Development
MrSmith
Начало конец
Аааа...
да. Такое я много раз видел.
Обычно правда хранят начало и длину
источник

TS

Timur Safin in Compiler Development
hazer_hazer
а что такое спан стринга?
думаю, имелоcь в виду string_view
источник

M

MrSmith in Compiler Development
Спан что то вроде область, ну или начало длинна. Лучше смотреть на что то типа красно зелёных деревьев
источник

M

MrSmith in Compiler Development
В rust analyser или в Rowan откуда они родом
источник

M

MrSmith in Compiler Development
Потому что рано или поздно захочется компилятор ещё и к ide прикрутить и т.д.
источник

M

MrSmith in Compiler Development
Ещё не плохо научить заранее pretty printing, bx reflex. Первое что бы дебагать проще, второе что бы потом actions имплементировать, второе ещё полезно для транспиляторов
источник

h

hazer_hazer in Compiler Development
Kir
Я больше скажу: лучше хранить спан стринга и ссылку на исходный текст. Если тексты ожидаются здоровенные, то лучше его перекодировать в UTF32.
Ну я бы самому себе не посоветовал на плюсах сразу поддержку UTF делать.
Мне кажется я бы надолго тогда с этим завис.
Но правда потом почти ВЕСЬ код переписывать придется..((
источник

h

hazer_hazer in Compiler Development
Kir
К которому доступ за O(1), а не O(N)
Ну. Наверное сгодится просто итератор begin() + оффсет токена?
источник

h

hazer_hazer in Compiler Development
Kir
К которому доступ за O(1), а не O(N)
За плюсы не шарите? просто substr или string(begin(), end()) — O(N)
Как можно сделать O(1)?
источник

IK

Ivan Kochurkin in Compiler Development
Kir
Я больше скажу: лучше хранить спан стринга и ссылку на исходный текст. Если тексты ожидаются здоровенные, то лучше его перекодировать в UTF32.
Ну можно и так, да. В некоторых языках есть встроенные типы, которые это все хранят (Span и Memory в C#)
источник