починить двоеточие в строках
This commit is contained in:
parent
7ba9590286
commit
1209ca732a
|
|
@ -315,7 +315,8 @@ def parse_ast_line(line):
|
|||
}
|
||||
|
||||
elif line_type == "DIRECTIVE":
|
||||
parts = line.split(':')
|
||||
# Разбиваем максимум на 4 части: DIRECTIVE, имя, секция, остальное
|
||||
parts = line.split(':', 3)
|
||||
directive = parts[1] if len(parts) > 1 else ""
|
||||
|
||||
if directive in ('.текст', '.данные', '.бнд'):
|
||||
|
|
@ -326,7 +327,7 @@ def parse_ast_line(line):
|
|||
return "DIRECTIVE", {
|
||||
'directive': directive,
|
||||
'section': parts[2] if len(parts) > 2 else "",
|
||||
'string': parts[3] if len(parts) > 3 else ""
|
||||
'string': parts[3] if len(parts) > 3 else "" # ← вся оставшаяся строка
|
||||
}
|
||||
elif directive == '.константа':
|
||||
return "DIRECTIVE", {
|
||||
|
|
@ -358,7 +359,6 @@ def parse_ast_line(line):
|
|||
|
||||
return line_type, {}
|
||||
|
||||
|
||||
def get_stub_size(mnemonic, operands):
|
||||
if mnemonic in ("переход", "вызвать"):
|
||||
return 5
|
||||
|
|
|
|||
|
|
@ -19,4 +19,5 @@
|
|||
1;тест_адресации_р11;Проверка косвенной адресации через R11 (ASCII код первого символа аргумента)
|
||||
1;тест_адресации_р13;Проверка косвенной адресации через R13 (ASCII код первого символа аргумента)
|
||||
1;тест_адресации_р14;Проверка косвенной адресации через R14 (ASCII код первого символа аргумента)
|
||||
1;тест_адресации_р15;Проверка косвенной адресации через R15 (ASCII код первого символа аргумента)
|
||||
1;тест_адресации_р15;Проверка косвенной адресации через R15 (ASCII код первого символа аргумента)
|
||||
1;двоеточие_в_строке;Проверка обработки строк с двоеточием внутри
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 46.
|
90
тесты/двоеточие_в_строке/двоеточие_в_строке.py
Normal file
90
тесты/двоеточие_в_строке/двоеточие_в_строке.py
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
#!/usr/bin/env python3
|
||||
import subprocess
|
||||
import sys
|
||||
import os
|
||||
|
||||
# Пути относительно папки двоеточие_в_строке/
|
||||
PROJECT_ROOT = "../../" # корень kvs/
|
||||
SOURCE_REL = "тесты/двоеточие_в_строке/двоеточие_в_строке.квс"
|
||||
ELF_REL = "тесты/двоеточие_в_строке/двоеточие_в_строке.elf"
|
||||
|
||||
def clean():
|
||||
"""Удалить временные файлы после теста"""
|
||||
files = [
|
||||
"двоеточие_в_строке.elf",
|
||||
"двоеточие_в_строке.csv",
|
||||
"двоеточие_в_строке.аст",
|
||||
"двоеточие_в_строке.токены",
|
||||
"двоеточие_в_строке.константа",
|
||||
"двоеточие_в_строке_pass4.log"
|
||||
]
|
||||
for f in files:
|
||||
if os.path.exists(f):
|
||||
os.remove(f)
|
||||
|
||||
def main():
|
||||
print("DEBUG: Начало теста двоеточие_в_строке", file=sys.stderr)
|
||||
|
||||
# Переходим в корень проекта для сборки
|
||||
os.chdir(PROJECT_ROOT)
|
||||
print(f"DEBUG: Рабочая папка = {os.getcwd()}", file=sys.stderr)
|
||||
|
||||
# 1. Сборка (запускаем из корня)
|
||||
print("DEBUG: Сборка двоеточие_в_строке.квс", file=sys.stderr)
|
||||
build = subprocess.run(["python3", "квс_сборка.py", SOURCE_REL],
|
||||
capture_output=True, text=True)
|
||||
|
||||
if build.returncode != 0:
|
||||
print(f"❌ Ошибка сборки: {build.returncode}", file=sys.stderr)
|
||||
print(f"STDERR: {build.stderr}", file=sys.stderr)
|
||||
print(f"STDOUT: {build.stdout}", file=sys.stderr)
|
||||
clean()
|
||||
sys.exit(1)
|
||||
|
||||
print("DEBUG: Сборка успешна", file=sys.stderr)
|
||||
|
||||
# Возвращаемся в папку двоеточие_в_строке для запуска
|
||||
os.chdir("тесты/двоеточие_в_строке")
|
||||
|
||||
# 2. Проверка, что ELF создан
|
||||
if not os.path.exists("двоеточие_в_строке.elf"):
|
||||
print("❌ Файл двоеточие_в_строке.elf не создан", file=sys.stderr)
|
||||
clean()
|
||||
sys.exit(1)
|
||||
|
||||
print("DEBUG: ELF файл существует", file=sys.stderr)
|
||||
|
||||
# 3. Запуск и проверка
|
||||
print("DEBUG: Запуск ELF", file=sys.stderr)
|
||||
run = subprocess.run(["./двоеточие_в_строке.elf"], capture_output=True, text=True)
|
||||
|
||||
print(f"DEBUG: Код возврата = {run.returncode}", file=sys.stderr)
|
||||
print(f"DEBUG: stdout = {repr(run.stdout)}", file=sys.stderr)
|
||||
|
||||
# Проверка вывода — здесь ключевой момент: строка с двоеточием
|
||||
expected_output = "Приве : мир!\n"
|
||||
if run.stdout != expected_output:
|
||||
print(f"❌ Вывод не совпадает", file=sys.stderr)
|
||||
print(f" Ожидалось: {repr(expected_output)}", file=sys.stderr)
|
||||
print(f" Получено: {repr(run.stdout)}", file=sys.stderr)
|
||||
# Дополнительная диагностика
|
||||
if "Приве " in run.stdout and " мир!\n" not in run.stdout:
|
||||
print(f" 💡 Похоже, строка обрезана на пробеле или двоеточии", file=sys.stderr)
|
||||
elif "Приве" in run.stdout and "мир" not in run.stdout:
|
||||
print(f" 💡 Похоже, строка обрезана на двоеточии", file=sys.stderr)
|
||||
clean()
|
||||
sys.exit(1)
|
||||
|
||||
# Проверка кода возврата
|
||||
if run.returncode != 0:
|
||||
print(f"❌ Код возврата: ожидался 0, получен {run.returncode}", file=sys.stderr)
|
||||
clean()
|
||||
sys.exit(1)
|
||||
|
||||
# Успех
|
||||
print("✅ Тест пройден: строка с двоеточием обработана корректно", file=sys.stderr)
|
||||
clean()
|
||||
sys.exit(0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
18
тесты/двоеточие_в_строке/двоеточие_в_строке.квс
Normal file
18
тесты/двоеточие_в_строке/двоеточие_в_строке.квс
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
.текст
|
||||
.глобал _start
|
||||
|
||||
_start:
|
||||
; Системный вызов write(1, msg, len)
|
||||
переместить_имм раикс, 1 ; номер syscall write = 1
|
||||
переместить_имм рдиай, 1 ; stdout = 1
|
||||
переместить_имм рсиай, msg ; указатель на строку
|
||||
переместить_имм рдикс, 21 ; длина строки
|
||||
вызов_системы
|
||||
|
||||
; Системный вызов exit(0)
|
||||
переместить_имм раикс, 60 ; номер syscall exit = 60
|
||||
переместить_имм рдиай, 0 ; код возврата
|
||||
вызов_системы
|
||||
|
||||
.данные
|
||||
msg: .строка "Приве : мир!\n"
|
||||
|
|
@ -1 +1,18 @@
|
|||
вызвать и вернуться уже реализованы, но не тестировались
|
||||
.текст
|
||||
.глобал _start
|
||||
|
||||
_start:
|
||||
; Системный вызов write(1, msg, len)
|
||||
переместить_имм раикс, 1 ; номер syscall write = 1
|
||||
переместить_имм рдиай, 1 ; stdout = 1
|
||||
переместить_имм рсиай, msg ; указатель на строку
|
||||
переместить_имм рдикс, 21 ; длина строки
|
||||
вызов_системы
|
||||
|
||||
; Системный вызов: exit(0)
|
||||
переместить_имм раикс, 60 ; номер syscall exit = 60
|
||||
переместить_имм рдиай, 0 ; код возврата
|
||||
вызов_системы
|
||||
|
||||
.данные
|
||||
msg: .строка "Приве : мир!\n"
|
||||
Loading…
Reference in a new issue