From c75dc80c583710173b3b81558748c02fc29d1b95 Mon Sep 17 00:00:00 2001 From: rexim Date: Mon, 1 Apr 2024 20:52:37 +0700 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=81=D1=80=D0=B5=D0=B7=D0=BE=D0=B2=20?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ПЛАН.txt | 2 +- исходники/компилятор.rs | 14 +++++++++++--- тесты/тест.хуя | 9 +++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) 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) как нат, «\н»); + индексация_срезов_слева_и_справа(); кц