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
7ef3765c72
commit
ef58f951b4
1
ПЛАН.txt
1
ПЛАН.txt
@ -66,6 +66,7 @@
|
||||
- [ ] Что дальше?
|
||||
|
||||
- Низкий приоритет
|
||||
- [ ] Небесполезные операции сравнения срезов.
|
||||
- [ ] Аналоги операций выхода из циклов (continue, break)
|
||||
- [ ] Провека, что все потоки исполнения возвращают значение.
|
||||
- [ ] Выравнивание структур как в Си
|
||||
|
||||
@ -383,8 +383,22 @@ impl<'ы> Машина<'ы> {
|
||||
self.индекс_инструкции += 1;
|
||||
}
|
||||
ВидИнструкции::ПамятьРавно => {
|
||||
сделать!(&инструкция.лок, "Интерпретация инструкции «{вид:?}»", вид = инструкция.вид);
|
||||
return Err(());
|
||||
let размер = self.вытолкнуть_значение_нат()?;
|
||||
let цель = self.вытолкнуть_значение_нат()?;
|
||||
let источник = self.вытолкнуть_значение_нат()?;
|
||||
let mut равна = true;
|
||||
for индекс in 0..размер {
|
||||
if self.память[цель + индекс] != self.память[источник + индекс] {
|
||||
равна = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if равна {
|
||||
self.протолкнуть_значение_нат(1)?;
|
||||
} else {
|
||||
self.протолкнуть_значение_нат(0)?;
|
||||
}
|
||||
self.индекс_инструкции += 1;
|
||||
}
|
||||
ВидИнструкции::НатМеньше => {
|
||||
self.проверить_арность_аргументов(2)?;
|
||||
|
||||
@ -809,6 +809,7 @@ fn скомпилировать_выражение(пп: &mut ПП, имена:
|
||||
if левый_тип.примитивный() {
|
||||
пп.код.push(Инструкция{ вид: ВидИнструкции::НатРавно, лок: ключ.лок.clone() });
|
||||
} else {
|
||||
пп.код.push(Инструкция{ вид: ВидИнструкции::Натуральное(левый_тип.размер(&имена.структуры)), лок: ключ.лок.clone() });
|
||||
пп.код.push(Инструкция{ вид: ВидИнструкции::ПамятьРавно, лок: ключ.лок.clone() });
|
||||
}
|
||||
пп.код.push(Инструкция{ вид: ВидИнструкции::ЛогОтрицание, лок: ключ.лок.clone() });
|
||||
@ -821,6 +822,7 @@ fn скомпилировать_выражение(пп: &mut ПП, имена:
|
||||
if левый_тип.примитивный() {
|
||||
пп.код.push(Инструкция{ вид: ВидИнструкции::НатРавно, лок: ключ.лок.clone() });
|
||||
} else {
|
||||
пп.код.push(Инструкция{ вид: ВидИнструкции::Натуральное(левый_тип.размер(&имена.структуры)), лок: ключ.лок.clone() });
|
||||
пп.код.push(Инструкция{ вид: ВидИнструкции::ПамятьРавно, лок: ключ.лок.clone() });
|
||||
}
|
||||
Ok(Тип::Лог)
|
||||
|
||||
@ -145,8 +145,14 @@ fn сгенерировать_инструкции(файл: &mut impl Write, п
|
||||
let _ = writeln!(файл, " rep movsb");
|
||||
}
|
||||
ВидИнструкции::ПамятьРавно => {
|
||||
сделать!(&инструкция.лок, "Кодогенерация инструкции «{вид:?}»", вид = инструкция.вид);
|
||||
return Err(());
|
||||
let _ = writeln!(файл, " xor rax, rax");
|
||||
let _ = writeln!(файл, " cld");
|
||||
let _ = writeln!(файл, " pop rcx");
|
||||
let _ = writeln!(файл, " pop rdi");
|
||||
let _ = writeln!(файл, " pop rsi");
|
||||
let _ = writeln!(файл, " rep cmpsb");
|
||||
let _ = writeln!(файл, " setz al");
|
||||
let _ = writeln!(файл, " push rax");
|
||||
}
|
||||
ВидИнструкции::НатСложение => {
|
||||
let _ = writeln!(файл, " pop rbx");
|
||||
|
||||
@ -120,6 +120,40 @@
|
||||
печать(«Индексация срезов внутри структуры: », человек.имя, «\н»);
|
||||
кц
|
||||
|
||||
структ Какая_То_Структура нч
|
||||
число: цел;
|
||||
еще_число: цел;
|
||||
кц
|
||||
|
||||
про печать_какой_то_структуры(структура: Какая_То_Структура) нч
|
||||
печать(«(число: », структура.число, «, еще_число: », структура.еще_число, «)»);
|
||||
кц
|
||||
|
||||
про сравнить_какие_то_структуры(одна: Какая_То_Структура, вторая: Какая_То_Структура) нч
|
||||
печать(« »);
|
||||
печать_какой_то_структуры(одна);
|
||||
печать(« = »);
|
||||
печать_какой_то_структуры(вторая);
|
||||
печать(« => »);
|
||||
печать(одна = вторая, «\н»);
|
||||
кц
|
||||
|
||||
про сравнение_структур() нч
|
||||
пер одна: Какая_То_Структура;
|
||||
одна.число := 69;
|
||||
одна.еще_число := 420;
|
||||
|
||||
пер вторая: Какая_То_Структура;
|
||||
вторая.число := 69;
|
||||
вторая.еще_число := 420;
|
||||
|
||||
печать(«Сравнение структур:\н»);
|
||||
сравнить_какие_то_структуры(одна, вторая);
|
||||
|
||||
вторая.еще_число := 1337;
|
||||
сравнить_какие_то_структуры(одна, вторая);
|
||||
кц
|
||||
|
||||
про главная() нч
|
||||
печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»);
|
||||
печать(«Печать логических: », 69 = 69, «, », 69 = 420, «\н»);
|
||||
@ -141,4 +175,5 @@
|
||||
тест_подбрить_строку_слева(« »);
|
||||
тест_подбрить_строку_слева(«»);
|
||||
индексация_срезов_внутри_структуры();
|
||||
сравнение_структур();
|
||||
кц
|
||||
|
||||
Loading…
Reference in New Issue
Block a user