Тест сравнения структур

This commit is contained in:
rexim 2024-04-01 11:13:17 +07:00
parent 7ef3765c72
commit ef58f951b4
5 changed files with 62 additions and 4 deletions

View File

@ -66,6 +66,7 @@
- [ ] Что дальше?
- Низкий приоритет
- [ ] Небесполезные операции сравнения срезов.
- [ ] Аналоги операций выхода из циклов (continue, break)
- [ ] Провека, что все потоки исполнения возвращают значение.
- [ ] Выравнивание структур как в Си

View File

@ -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)?;

View File

@ -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(Тип::Лог)

View File

@ -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");

View File

@ -120,6 +120,40 @@
печать(«Индексация срезов внутри структуры: », человек.имя, «\н»);
кц
структ Какая_То_Структура нч
число: цел;
еще_число: цел;
кц
про печать_какой_то_структуры(структура: Какая_То_Структура) нч
печать(«(число: », структура.число, «, еще_число: », структура.еще_число, «)»);
кц
про сравнить_какиео_структуры(одна: Какая_То_Структура, вторая: Какая_То_Структура) нч
печать(« »);
печать_какой_то_структуры(одна);
печать(« = »);
печать_какой_то_структуры(вторая);
печать(« => »);
печать(одна = вторая, «\н»);
кц
про сравнение_структур() нч
пер одна: Какая_То_Структура;
одна.число := 69;
одна.еще_число := 420;
пер вторая: Какая_То_Структура;
вторая.число := 69;
вторая.еще_число := 420;
печать(«Сравнение структур:\н»);
сравнить_какиео_структуры(одна, вторая);
вторая.еще_число := 1337;
сравнить_какиео_структуры(одна, вторая);
кц
про главная() нч
печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»);
печать(«Печать логических: », 69 = 69, «, », 69 = 420, «\н»);
@ -141,4 +175,5 @@
тест_подбрить_строку_слева(« »);
тест_подбрить_строку_слева(«»);
индексация_срезов_внутри_структуры();
сравнение_структур();
кц