Индексация срезов слева

This commit is contained in:
rexim 2024-04-01 20:52:37 +07:00
parent 4a2a20e0e2
commit c75dc80c58
3 changed files with 21 additions and 4 deletions

View File

@ -59,7 +59,7 @@
- [x] Интерпретация всех недостающих инструкций
- [x] Кодогенерация всех недостающих инструкций
- [x] сделать!(вызываемое.лок(), "Индексация срезов из сложных выражений");
- [ ] сделать!(&имя.лок, "Индексация срезов в левой части присваивания");
- [x] сделать!(&имя.лок, "Индексация срезов в левой части присваивания");
- [ ] Доработать интринсики
- [ ] «ввод»
- [ ] «срез»

View File

@ -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();
}
_ => {
диагностика!(&имя.лок, "ОШИБКА", "Не возможно индексировать переменные тип «{тип}»", тип = тип.текст());

View File

@ -174,6 +174,14 @@
про вернуть_строку(): строка то вернуть «E»;
про индексация_срезов_слева_и_справа() нч
пер имя: строка := «alexey»;
для индекс := 1..размер(имя) нч
имя(индекс-1) := верхний_регистр_аскии(имя(индекс-1));
кц
печать(«Индексация срезов слева и справа: », имя, «\н»);
кц
про главная() нч
печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»);
печать(«Печать логических: », 69 = 69, «, », 69 = 420, «\н»);
@ -199,4 +207,5 @@
сравнение_строк();
проверить_логическиеонвертации();
печать(«Индексирование срезу из процедуры: », вернуть_строку()(0) как нат, «\н»);
индексация_срезов_слева_и_справа();
кц