From ef58f951b44c4ad92badec64ec7dc6c400a9a628 Mon Sep 17 00:00:00 2001 From: rexim Date: Mon, 1 Apr 2024 11:13:17 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=D1=81=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ПЛАН.txt | 1 + исходники/интерпретатор.rs | 18 ++++++++++++++++-- исходники/компилятор.rs | 2 ++ исходники/фазм.rs | 10 ++++++++-- тесты/тест.хуя | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 4 deletions(-) diff --git a/ПЛАН.txt b/ПЛАН.txt index dc3e954..d3bf3c0 100644 --- a/ПЛАН.txt +++ b/ПЛАН.txt @@ -66,6 +66,7 @@ - [ ] Что дальше? - Низкий приоритет + - [ ] Небесполезные операции сравнения срезов. - [ ] Аналоги операций выхода из циклов (continue, break) - [ ] Провека, что все потоки исполнения возвращают значение. - [ ] Выравнивание структур как в Си diff --git a/исходники/интерпретатор.rs b/исходники/интерпретатор.rs index 2b75b08..f2e3c03 100644 --- a/исходники/интерпретатор.rs +++ b/исходники/интерпретатор.rs @@ -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)?; diff --git a/исходники/компилятор.rs b/исходники/компилятор.rs index 36f3590..d9fb49a 100644 --- a/исходники/компилятор.rs +++ b/исходники/компилятор.rs @@ -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(Тип::Лог) diff --git a/исходники/фазм.rs b/исходники/фазм.rs index 55fc542..d27f3ec 100644 --- a/исходники/фазм.rs +++ b/исходники/фазм.rs @@ -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"); diff --git a/тесты/тест.хуя b/тесты/тест.хуя index 21dfe4c..bb08b68 100644 --- a/тесты/тест.хуя +++ b/тесты/тест.хуя @@ -120,6 +120,40 @@ печать(«Индексация срезов внутри структуры: », человек.имя, «\н»); кц +структ Какая_То_Структура нч + число: цел; + еще_число: цел; +кц + +про печать_какой_то_структуры(структура: Какая_То_Структура) нч + печать(«(число: », структура.число, «, еще_число: », структура.еще_число, «)»); +кц + +про сравнить_какие_то_структуры(одна: Какая_То_Структура, вторая: Какая_То_Структура) нч + печать(« »); + печать_какой_то_структуры(одна); + печать(« = »); + печать_какой_то_структуры(вторая); + печать(« => »); + печать(одна = вторая, «\н»); +кц + +про сравнение_структур() нч + пер одна: Какая_То_Структура; + одна.число := 69; + одна.еще_число := 420; + + пер вторая: Какая_То_Структура; + вторая.число := 69; + вторая.еще_число := 420; + + печать(«Сравнение структур:\н»); + сравнить_какие_то_структуры(одна, вторая); + + вторая.еще_число := 1337; + сравнить_какие_то_структуры(одна, вторая); +кц + про главная() нч печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»); печать(«Печать логических: », 69 = 69, «, », 69 = 420, «\н»); @@ -141,4 +175,5 @@ тест_подбрить_строку_слева(« »); тест_подбрить_строку_слева(«»); индексация_срезов_внутри_структуры(); + сравнение_структур(); кц