mirror of
https://github.com/tsoding/good_training_language.git
synced 2026-09-12 19:50:53 +05:00
Индексация срезов слева
This commit is contained in:
parent
4a2a20e0e2
commit
c75dc80c58
2
ПЛАН.txt
2
ПЛАН.txt
@ -59,7 +59,7 @@
|
||||
- [x] Интерпретация всех недостающих инструкций
|
||||
- [x] Кодогенерация всех недостающих инструкций
|
||||
- [x] сделать!(вызываемое.лок(), "Индексация срезов из сложных выражений");
|
||||
- [ ] сделать!(&имя.лок, "Индексация срезов в левой части присваивания");
|
||||
- [x] сделать!(&имя.лок, "Индексация срезов в левой части присваивания");
|
||||
- [ ] Доработать интринсики
|
||||
- [ ] «ввод»
|
||||
- [ ] «срез»
|
||||
|
||||
@ -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();
|
||||
}
|
||||
_ => {
|
||||
диагностика!(&имя.лок, "ОШИБКА", "Не возможно индексировать переменные тип «{тип}»", тип = тип.текст());
|
||||
|
||||
@ -174,6 +174,14 @@
|
||||
|
||||
про вернуть_строку(): строка то вернуть «E»;
|
||||
|
||||
про индексация_срезов_слева_и_справа() нч
|
||||
пер имя: строка := «alexey»;
|
||||
для индекс := 1..размер(имя) нч
|
||||
имя(индекс-1) := верхний_регистр_аскии(имя(индекс-1));
|
||||
кц
|
||||
печать(«Индексация срезов слева и справа: », имя, «\н»);
|
||||
кц
|
||||
|
||||
про главная() нч
|
||||
печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»);
|
||||
печать(«Печать логических: », 69 = 69, «, », 69 = 420, «\н»);
|
||||
@ -199,4 +207,5 @@
|
||||
сравнение_строк();
|
||||
проверить_логические_конвертации();
|
||||
печать(«Индексирование срезу из процедуры: », вернуть_строку()(0) как нат, «\н»);
|
||||
индексация_срезов_слева_и_справа();
|
||||
кц
|
||||
|
||||
Loading…
Reference in New Issue
Block a user