Честно говоря и парсеру и человеку тут всё ясно - если квадратная скобка идёт в начале (под)выражения, то это создание массива, а если продолжает существующее, то взятие среза/индексация.
Честно говоря и парсеру и человеку тут всё ясно - если квадратная скобка идёт в начале (под)выражения, то это создание массива, а если продолжает существующее, то взятие среза/индексация.
Вот, кстати, будет ли это срез или индексация определяется сильно после, да. Хотя, можно и не разделять эти вещи и понимать срез как индексацию диапазоном.
Вот, кстати, будет ли это срез или индексация определяется сильно после, да. Хотя, можно и не разделять эти вещи и понимать срез как индексацию диапазоном.
You have 75 shift/reduce conflicts and 3 reduce/reduce conflicts.
Я правильно понимаю что для интерпретации на регистровой ВМ мне нужно использовать те же методы что и для обычного компилятора, с единственным исключением что операнды могут быть какими-то сложными структурами?
Я посмотрел как это реализовано в lua - там значение это тегированое объединение из нескольких базовых типов данных (таблица для сложных структур). В nim тоже самое - сумма базовых типов данных (и AST для сложных структур данных).
И сам код это просто последовательность uint64 из которой потом получают номера регистров и код операции.
И соответственно компиляция в код для ВМ использует все те же подходы (в т.ч. нужна аллокация регистров)
Ну, тут два варианта. Можно сделать ВМ с бесконечным количеством регистров (в Lua почти так и сделали) -- распределять их не нужно, но тогда не получится отмапить на реальные регистры. Либо да, как у "взрослых" компиляторов с распределением и спиллингом.
Хотя есть и компромиссные варианты когда вершина стека/аккумулятор хранится в регистре, а остальное -- как обычно. Может, и более хитрые схемы встречаются.
В таком случае наверное имеет смысл написать простой вариант с бесконечными регистрами и затем добавить распределение и т.д., так как я в дальнейшем хочу перейти от интерпретации, так что с этим все равно нужно будет разобраться.
В таком случае наверное имеет смысл написать простой вариант с бесконечными регистрами и затем добавить распределение и т.д., так как я в дальнейшем хочу перейти от интерпретации, так что с этим все равно нужно будет разобраться.
По этой причине, кстати, в D отказались от угловых скобочек для обрамления статических параметров в пользу круглых и квадратных, которые всегда парные и не являются самостоятельными инфиксными операторами.
Господа, такой может глупый вопрос: если я пишу компилятор на каком-то языке, могу я в теории использовать свойства этого языка в своём компиляторе? Ну типа там пишешь на расте и добавляешь к себе в язык его borrow checker?
Господа, такой может глупый вопрос: если я пишу компилятор на каком-то языке, могу я в теории использовать свойства этого языка в своём компиляторе? Ну типа там пишешь на расте и добавляешь к себе в язык его borrow checker?