diff --git a/ПЛАН.txt b/ПЛАН.txt index 267298f..ef3c6db 100644 --- a/ПЛАН.txt +++ b/ПЛАН.txt @@ -59,7 +59,7 @@ - [x] Интерпретация всех недостающих инструкций - [x] Кодогенерация всех недостающих инструкций - [x] сделать!(вызываемое.лок(), "Индексация срезов из сложных выражений"); -- [ ] сделать!(&имя.лок, "Индексация срезов в левой части присваивания"); +- [x] сделать!(&имя.лок, "Индексация срезов в левой части присваивания"); - [ ] Доработать интринсики - [ ] «ввод» - [ ] «срез» diff --git a/исходники/компилятор.rs b/исходники/компилятор.rs index 2041f63..d7082c2 100644 --- a/исходники/компилятор.rs +++ b/исходники/компилятор.rs @@ -1498,9 +1498,17 @@ fn скомпилировать_левое_выражение(пп: &mut ПП, индексировать_массив(&*тип_элемента, пп, имена, текущая_процедура, локальные_имена, индекс, временный_размер)?; тип = *тип_элемента.clone(); } - Тип::Срез{..} => { - сделать!(&имя.лок, "Индексация срезов в левой части присваивания"); - return Err(()); + Тип::Срез{тип_элемента} => { + if аргументы.выражения.len() != 1 { + диагностика!(&имя.лок, "ОШИБКА", "Некорректная размерность среза. Ожидался 1 индекс, но повстречалось {ранк}", ранк = аргументы.выражения.len()); + return Err(()); + }; + let индекс = &аргументы.выражения[0]; + пп.код.push(Инструкция{ вид: ВидИнструкции::Натуральное(СРЕЗ_АДРЕС_СМЕЩЕНИЕ), лок: имя.лок.clone()}); + пп.код.push(Инструкция{ вид: ВидИнструкции::НатСложение, лок: имя.лок.clone()}); + пп.код.push(Инструкция{ вид: ВидИнструкции::Прочитать64, лок: имя.лок.clone()}); + индексировать_массив(&*тип_элемента, пп, имена, текущая_процедура, локальные_имена, индекс, временный_размер)?; + тип = *тип_элемента.clone(); } _ => { диагностика!(&имя.лок, "ОШИБКА", "Не возможно индексировать переменные тип «{тип}»", тип = тип.текст()); diff --git a/тесты/тест.хуя b/тесты/тест.хуя index a76a1e8..8330bf7 100644 --- a/тесты/тест.хуя +++ b/тесты/тест.хуя @@ -174,6 +174,14 @@ про вернуть_строку(): строка то вернуть «E»; +про индексация_срезов_слева_и_справа() нч + пер имя: строка := «alexey»; + для индекс := 1..размер(имя) нч + имя(индекс-1) := верхний_регистр_аскии(имя(индекс-1)); + кц + печать(«Индексация срезов слева и справа: », имя, «\н»); +кц + про главная() нч печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»); печать(«Печать логических: », 69 = 69, «, », 69 = 420, «\н»); @@ -199,4 +207,5 @@ сравнение_строк(); проверить_логические_конвертации(); печать(«Индексирование срезу из процедуры: », вернуть_строку()(0) как нат, «\н»); + индексация_срезов_слева_и_справа(); кц