rupython 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rupython/__main__.py +12 -0
- rupython/__/342/225/250/320/247/342/225/250/342/226/221/342/225/250/342/224/202/342/225/250/342/225/233/342/225/250/342/225/227/342/225/250/342/225/233/342/225/250/342/226/223/342/225/250/342/225/233/342/225/244/320/227/342/225/250/342/225/234/342/225/244/320/233/342/225/250/342/225/243_/342/225/250/342/225/221/342/225/250/342/225/233/342/225/250/342/224/244__.py +207 -0
- rupython//342/225/250/320/257/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/225/233/342/225/250/342/226/222/342/225/244/320/220/342/225/250/342/226/221/342/225/250/342/225/226/342/225/250/342/225/233/342/225/250/342/226/223/342/225/250/342/226/221/342/225/244/320/222/342/225/250/342/225/241/342/225/250/342/225/227/342/225/244/320/234.py +610 -0
- rupython-1.0.0.dist-info/LICENSE +1 -0
- rupython-1.0.0.dist-info/METADATA +6 -0
- rupython-1.0.0.dist-info/RECORD +8 -0
- rupython-1.0.0.dist-info/WHEEL +5 -0
- rupython-1.0.0.dist-info/top_level.txt +1 -0
rupython/__main__.py
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
from . import Преобразователь
|
2
|
+
import os as ОС
|
3
|
+
import sys as Система
|
4
|
+
|
5
|
+
Путь_к_файлу = ОС.path.realpath(Система.argv[1])
|
6
|
+
Название_файла = ОС.path.basename(Система.argv[1])
|
7
|
+
Исходник = None
|
8
|
+
Исходник = Преобразователь.Преобразовать_код(Путь_к_файлу)
|
9
|
+
if Исходник:
|
10
|
+
Преобразователь.Запустить_код(Название_файла, Исходник, Путь_к_файлу)
|
11
|
+
|
12
|
+
input()
|
@@ -0,0 +1,207 @@
|
|
1
|
+
from ctypes import c_char, pythonapi, py_object
|
2
|
+
import sys as Система
|
3
|
+
import os as ОС
|
4
|
+
|
5
|
+
from _io import BufferedReader, BufferedWriter, TextIOWrapper
|
6
|
+
|
7
|
+
Адреса_памяти_классов = {}
|
8
|
+
|
9
|
+
def Добавить_поле(класс, название, значение, функция = True):
|
10
|
+
def Получить_память(где):
|
11
|
+
if где in Адреса_памяти_классов: return Адреса_памяти_классов[где]
|
12
|
+
else:
|
13
|
+
адрес = memoryview((c_char * type(где).__sizeof__(где)).from_address(id(где))).cast('c').cast('P')
|
14
|
+
Адреса_памяти_классов[где] = адрес
|
15
|
+
return адрес
|
16
|
+
|
17
|
+
def Установить_поле(класс, поле, значение):
|
18
|
+
смещение_флагов = [*Получить_память(int)].index(int.__flags__)
|
19
|
+
флаги = класс.__flags__
|
20
|
+
память_класса = Получить_память(класс)
|
21
|
+
if Система.version_info[0:2] <= (3, 9): память_класса[смещение_флагов] |= 1 << 9
|
22
|
+
elif Система.version_info[0:2] >= (3, 10): память_класса[смещение_флагов] &= ~(1 << 8)
|
23
|
+
setattr(класс, поле, значение)
|
24
|
+
память_класса[смещение_флагов] = флаги
|
25
|
+
pythonapi.PyType_Modified(py_object(класс))
|
26
|
+
|
27
|
+
def Новая_функция(функция, **параметры):
|
28
|
+
код = функция.__code__
|
29
|
+
копия = type(функция)(
|
30
|
+
код.replace(co_consts = код.co_consts + tuple((ключ, значение) for ключ, значение in параметры.items())),
|
31
|
+
функция.__globals__,
|
32
|
+
name=функция.__name__,
|
33
|
+
closure=функция.__closure__
|
34
|
+
)
|
35
|
+
копия.__defaults__ = функция.__defaults__
|
36
|
+
копия.__kwdefaults__ = функция.__kwdefaults__
|
37
|
+
копия.__qualname__ = функция.__qualname__
|
38
|
+
return копия
|
39
|
+
|
40
|
+
Установить_поле(класс, название, Новая_функция(значение) if функция else значение)
|
41
|
+
|
42
|
+
Встроенные_поля = {
|
43
|
+
'str': {
|
44
|
+
'find': 'Найти',
|
45
|
+
'rfind': 'Найти_с_конца',
|
46
|
+
'index': 'Положение',
|
47
|
+
'rindex': 'Положение_с_конца',
|
48
|
+
'replace': 'Заменить',
|
49
|
+
'split': 'Разбить',
|
50
|
+
'isdigit': 'Из_цифр',
|
51
|
+
'isalpha': 'Из_букв',
|
52
|
+
'isalnum': 'Из_цифробукв',
|
53
|
+
'islower': 'Из_строчных',
|
54
|
+
'isupper': 'Из_заглавных',
|
55
|
+
'isspace': 'Из_пробелов',
|
56
|
+
'istitle': 'Слова_с_заглавных',
|
57
|
+
'upper': 'В_заглавные',
|
58
|
+
'lower': 'В_строчные',
|
59
|
+
'startswith': 'Начинается',
|
60
|
+
'endswith': 'Кончается',
|
61
|
+
'join': 'Сцепить',
|
62
|
+
'capitalize': 'Начать_с_заглавной',
|
63
|
+
'center': 'Отцентровать',
|
64
|
+
'count': 'Число_вхождений',
|
65
|
+
'expandtabs': 'Табуляции_в_пробелы',
|
66
|
+
'lstrip': 'Удалить_в_начале',
|
67
|
+
'rstrip': 'Удалить_в_конце',
|
68
|
+
'strip': 'Удалить_по_бокам',
|
69
|
+
'partition': 'Разбить',
|
70
|
+
'rpartition': 'Разбить_с_конца',
|
71
|
+
'swapcase': 'Обратить_регистр',
|
72
|
+
'title': 'Начать_слова_с_заглавных',
|
73
|
+
'zfill': 'Дополнить_нулями',
|
74
|
+
'ljust': 'Дополнить_справа',
|
75
|
+
'rjust': 'Дополнить_слева',
|
76
|
+
'format': 'Формат'
|
77
|
+
},
|
78
|
+
'list': {
|
79
|
+
'append': 'Добавить',
|
80
|
+
'clear': 'Очистить',
|
81
|
+
'copy': 'Копия',
|
82
|
+
'count': 'Число_вхождений',
|
83
|
+
'extend': 'Дополнить',
|
84
|
+
'index': 'Положение',
|
85
|
+
'insert': 'Вставить',
|
86
|
+
'pop': 'Вытащить',
|
87
|
+
'remove': 'Удалить',
|
88
|
+
'reverse': 'Обратить',
|
89
|
+
'sort': ( 'Упорядочить', { 'key': 'ключ', 'reverse': 'обратно' } )
|
90
|
+
},
|
91
|
+
'dict': {
|
92
|
+
'clear': 'Очистить',
|
93
|
+
'copy': 'Копия',
|
94
|
+
'fromkeys': 'Из_ключей',
|
95
|
+
'get': 'Получить',
|
96
|
+
'items': 'Элементы',
|
97
|
+
'keys': 'Ключи',
|
98
|
+
'values': 'Значения',
|
99
|
+
'pop': 'Вытащить',
|
100
|
+
'popitem': 'Вытащить_последнее',
|
101
|
+
'setdefault': 'Получить_или_добавить',
|
102
|
+
'update': 'Обновить',
|
103
|
+
'values': 'Значения'
|
104
|
+
},
|
105
|
+
'tuple': {
|
106
|
+
'index': 'Положение',
|
107
|
+
'count': 'Число_вхождений'
|
108
|
+
},
|
109
|
+
('set', 'frozenset'): {
|
110
|
+
'isdisjoint': 'Не_пересекаются',
|
111
|
+
'issubset': 'Подмножество',
|
112
|
+
'issuperset': 'Надмножество',
|
113
|
+
'union': 'Объединение',
|
114
|
+
'intersection': 'Пересечение',
|
115
|
+
'difference': 'Разница',
|
116
|
+
'symmetric_difference': 'СимметрРазница',
|
117
|
+
'copy': 'Копия'
|
118
|
+
},
|
119
|
+
'set': {
|
120
|
+
'update': 'Дополнить',
|
121
|
+
'intersection_update': 'Пересечь',
|
122
|
+
'difference_update': 'Вычесть',
|
123
|
+
'symmetric_difference_update': 'СимметрВычесть',
|
124
|
+
'add': 'Добавить',
|
125
|
+
'remove': 'Удалить',
|
126
|
+
'discard': 'Убрать',
|
127
|
+
'pop': 'Вытащить',
|
128
|
+
'clear': 'Очистить'
|
129
|
+
},
|
130
|
+
'int': {
|
131
|
+
'.numerator': 'числитель',
|
132
|
+
'.denominator': 'знаменатель'
|
133
|
+
},
|
134
|
+
('int', 'float', 'complex'): {
|
135
|
+
'.real': 'действ_часть',
|
136
|
+
'.imag': 'мнимая_часть',
|
137
|
+
'conjugate': 'Cопряжённое'
|
138
|
+
},
|
139
|
+
('BufferedReader', 'BufferedWriter', 'TextIOWrapper'): {
|
140
|
+
'read': 'Читать',
|
141
|
+
'readline': 'Читать_строку',
|
142
|
+
'write': 'Писать',
|
143
|
+
'tell': 'Позиция',
|
144
|
+
'seek': 'Задать_позицию',
|
145
|
+
'truncate': 'Изменить_размер',
|
146
|
+
'detach': 'Отделить',
|
147
|
+
'close': 'Закрыть',
|
148
|
+
'.closed': 'закрыт'
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
for классы, таблица in Встроенные_поля.items():
|
153
|
+
if type(классы) != tuple: классы = [классы]
|
154
|
+
for класс in классы:
|
155
|
+
for название, замена in таблица.items():
|
156
|
+
if type(замена) == tuple:
|
157
|
+
замещающая_функция = 'def __' + класс + '_' + название + '__(*ПА, **ИА):\n'
|
158
|
+
for н, з in замена[1].items():
|
159
|
+
замещающая_функция += ' if "' + з + '" in ИА: ИА["' + н + '"] = ИА.pop("' + з + '")\n'
|
160
|
+
замещающая_функция += ' ' + класс + '.' + название + '(*ПА, **ИА)'
|
161
|
+
exec(замещающая_функция)
|
162
|
+
exec("Добавить_поле(" + класс + ", '" + замена[0] + "', __" + класс + "_" + название + "__)")
|
163
|
+
exec('del __' + класс + '_' + название + '__')
|
164
|
+
else:
|
165
|
+
if название[0] == '.':
|
166
|
+
eval("Добавить_поле(" + класс + ", '" + замена + "', " + класс + название + ", False)")
|
167
|
+
else:
|
168
|
+
eval("Добавить_поле(" + класс + ", '" + замена + "', lambda *ПА, **ИА: " + класс + "." + название + "(*ПА, **ИА))")
|
169
|
+
|
170
|
+
Система.path.insert(0, ОС.path.dirname(__file__) + '/Модули')
|
171
|
+
|
172
|
+
Обёртка__Вещ_в_стр = lambda здесь: Вещ_в_стр(здесь).replace('.', ',').replace('inf', 'Бскн')
|
173
|
+
Вещ_в_стр = float.__str__
|
174
|
+
Добавить_поле(float, '__str__', Обёртка__Вещ_в_стр)
|
175
|
+
|
176
|
+
Обёртка__Логич_в_стр = lambda здесь: Логич_в_стр(здесь).replace('True', 'Да').replace('False', 'Нет')
|
177
|
+
Логич_в_стр = bool.__str__
|
178
|
+
Добавить_поле(bool, '__str__', Обёртка__Логич_в_стр)
|
179
|
+
|
180
|
+
Обёртка__Неопр_в_стр = lambda здесь: Неопр_в_стр(здесь).replace('None', 'Неопр')
|
181
|
+
Неопр_в_стр = type(None).__str__
|
182
|
+
Добавить_поле(type(None), '__str__', Обёртка__Неопр_в_стр)
|
183
|
+
|
184
|
+
def Проверить_существование(код, местн, общ):
|
185
|
+
try: eval(код, местн, общ)
|
186
|
+
except Exception as ошибка:
|
187
|
+
if type(ошибка) in (NameError, KeyError, AttributeError):
|
188
|
+
print(ошибка)
|
189
|
+
return False
|
190
|
+
else: raise ошибка
|
191
|
+
return True
|
192
|
+
|
193
|
+
def Заменить_ключи_в_словаре(словарь, замены):
|
194
|
+
новый = {}
|
195
|
+
for н, з in словарь.items():
|
196
|
+
новый.setdefault(замены[н] if н in замены.keys() else н, з)
|
197
|
+
return новый
|
198
|
+
|
199
|
+
def Свёртка(функция, перечислимое, нач_знач):
|
200
|
+
рез = нач_знач
|
201
|
+
for эл in перечислимое: рез = функция(рез, эл)
|
202
|
+
return рез
|
203
|
+
|
204
|
+
__builtins__.update(
|
205
|
+
__Проверить_существование__ = Проверить_существование,
|
206
|
+
Свёртка = Свёртка
|
207
|
+
)
|
@@ -0,0 +1,610 @@
|
|
1
|
+
import tokenize as Разборщик_слов
|
2
|
+
import runpy as Запуск_кода
|
3
|
+
import traceback as Разборщик_исключений
|
4
|
+
import os as ОС
|
5
|
+
import sys as Система
|
6
|
+
import importlib as Импортование
|
7
|
+
|
8
|
+
Служебные_слова = {
|
9
|
+
'Да': 'True',
|
10
|
+
'Нет': 'False',
|
11
|
+
'Неопр': 'None',
|
12
|
+
'и': 'and',
|
13
|
+
'или': 'or',
|
14
|
+
'не': 'not',
|
15
|
+
'это': 'is',
|
16
|
+
'Функция': 'def',
|
17
|
+
'Класс': 'class',
|
18
|
+
'Общее': 'global',
|
19
|
+
'Неместное': 'nonlocal',
|
20
|
+
'Из': 'from',
|
21
|
+
'Подключить': 'import',
|
22
|
+
'подключить': 'import',
|
23
|
+
'как': 'as',
|
24
|
+
'Возврат': 'return',
|
25
|
+
'Вернуть': 'return',
|
26
|
+
'Пропустить': 'pass',
|
27
|
+
'Бросить': 'raise',
|
28
|
+
'Продолжить': 'continue',
|
29
|
+
'Если': 'if',
|
30
|
+
'АЕсли': 'elif',
|
31
|
+
'Иначе': 'else',
|
32
|
+
'если': 'if',
|
33
|
+
'иначе': 'else',
|
34
|
+
'Для': 'for',
|
35
|
+
'из': 'in',
|
36
|
+
'для': 'for',
|
37
|
+
'в': 'in',
|
38
|
+
'Пока': 'while',
|
39
|
+
'Прервать': 'break',
|
40
|
+
'Проба': 'try',
|
41
|
+
'Исключение': 'except',
|
42
|
+
'ВКонце': 'finally',
|
43
|
+
'Проверить': 'assert',
|
44
|
+
'Выполнить': 'exec',
|
45
|
+
'фун': 'lambda',
|
46
|
+
'Выдать': 'yield',
|
47
|
+
'ВКонтексте': 'with',
|
48
|
+
'Удалить': 'del',
|
49
|
+
'Выбрать': 'match',
|
50
|
+
'При': 'case'
|
51
|
+
}
|
52
|
+
|
53
|
+
Встроенные_функции = {
|
54
|
+
'АбсЗнач': ( 'abs', None, False ),
|
55
|
+
'Все': ( 'all', None, False ),
|
56
|
+
'Любое': ( 'any', None, False ),
|
57
|
+
'В7битовСимв': ( 'ascii', None, False ),
|
58
|
+
'Двоич': ( 'bin', None, False ),
|
59
|
+
'Логич': ( 'bool', None, False ),
|
60
|
+
'Останов': ( 'breakpoint', None, False ),
|
61
|
+
'БайтМассив': ( 'bytearray', { 'источник': 'source', 'кодование': 'encoding', 'при_ошибках': 'errors' }, True ),
|
62
|
+
'Байты': ( 'bytes', { 'источник': 'source', 'кодование': 'encoding', 'при_ошибках': 'errors' }, True ),
|
63
|
+
'Вызываемое': ( 'callable', None, False ),
|
64
|
+
'Код_в_знак': ( 'chr', None, False ),
|
65
|
+
'Метод_класса': ( 'classmethod', None, False ),
|
66
|
+
'Собрать_код': ( 'compile', { 'исходник': 'source', 'название_файла': 'filename', 'режим': 'mode', 'флаги': 'flags', 'dont_inherit': 'не_наследовать', 'optimize': 'оптимизация' }, False ),
|
67
|
+
'Компл': ( 'complex', { 'действ_часть': 'real', 'мнимая_часть': 'imag' }, True ),
|
68
|
+
'Удалить_поле': ( 'delattr', None, False ),
|
69
|
+
'Словарь': ( 'dict', None, True ),
|
70
|
+
'Содержимое': ( 'dir', None, False ),
|
71
|
+
'ДелОст': ( 'divmod', None, False ),
|
72
|
+
'Перечислить': ( 'enumerate', { 'перебираемое': 'iterable', 'начало': 'start' }, False ),
|
73
|
+
'Вычислить': ( 'eval', None, False ),
|
74
|
+
'Выполнить': ( 'exec', None, False ),
|
75
|
+
'Фильтр': ( 'filter', None, False ),
|
76
|
+
'Вещ': ( 'float', None, True ),
|
77
|
+
'Формат': ( 'format', None, False ),
|
78
|
+
'НеизмМнож': ( 'frozenset', None, True ),
|
79
|
+
'Получить_поле': ( 'getattr', None, False ),
|
80
|
+
'Общие_сущности': ( 'globals', None, False ),
|
81
|
+
'Имеет_поле': ( 'hasattr', None, False ),
|
82
|
+
'Хэш': ( 'hash', None, False ),
|
83
|
+
'Справка': ( 'help', None, False ),
|
84
|
+
'Шестн': ( 'hex', None, False ),
|
85
|
+
'Идент': ( 'id', None, False ),
|
86
|
+
'Принять': ( 'input', None, False ),
|
87
|
+
'Цел': ( 'int', { 'основание': 'base' }, True ),
|
88
|
+
'Экземпляр': ( 'isinstance', None, False ),
|
89
|
+
'Подкласс': ( 'issubclass', None, False ),
|
90
|
+
'Перебиратель': ( 'iter', None, False ),
|
91
|
+
'Длина': ( 'len', None, False ),
|
92
|
+
'Размер': ( 'len', None, False ),
|
93
|
+
'Список': ( 'list', None, True ),
|
94
|
+
'Местные_сущности': ( 'locals', None, False ),
|
95
|
+
'Отобразить': ( 'map', None, False ),
|
96
|
+
'Макс': ( 'max', { 'ф_сравнения': 'key', 'если_пусто': 'default' }, False ),
|
97
|
+
'Память': ( 'memoryview', { 'объект': 'object' }, True ),
|
98
|
+
'Мин': ( 'min', { 'ф_сравнения': 'key', 'если_пусто': 'default' }, False ),
|
99
|
+
'Следующий': ( 'next', None, False ),
|
100
|
+
'Объект': ( 'object', None, True ),
|
101
|
+
'Восьм': ( 'oct', None, False ),
|
102
|
+
'Открыть': ( 'open', { 'название': 'name', 'режим': 'mode', 'буферизация': 'buffering', 'кодование': 'encoding', 'при_ошибках': 'errors', 'новая_строка': 'newline', 'закрыть_описатель': 'closefd', 'открыватель': 'opener' }, False ),
|
103
|
+
'Знак_в_код': ( 'ord', None, False ),
|
104
|
+
'Степень': ( 'pow', None, False ),
|
105
|
+
'Вывести': ( 'print', { 'разделитель': 'sep', 'в_конце': 'end', 'файл': 'file', 'немедленно': 'flush' }, False ),
|
106
|
+
'Свойство': ( 'property', { 'ф_получения': 'fget', 'ф_установки': 'fset', 'ф_удаления': 'fdel', 'документация': 'doc' }, False ),
|
107
|
+
'Ряд': ( 'range', None, True ),
|
108
|
+
'Представление': ( 'repr', None, False ),
|
109
|
+
'Обратить': ( 'reversed', None, False ),
|
110
|
+
'Округлить': ( 'round', { 'число': 'number', 'разрядов': 'ndigits' }, False ),
|
111
|
+
'Множ': ( 'set', None, True ),
|
112
|
+
'Установить_поле': ( 'setattr', None, False ),
|
113
|
+
'Срез': ( 'slice', None, False ),
|
114
|
+
'Упорядочить': ( 'sorted', { 'ф_сравнения': 'key', 'наоборот': 'reverse' }, False ),
|
115
|
+
'Статический_метод': ( 'staticmethod', None, False ),
|
116
|
+
'Строка': ( 'str', { 'кодование': 'encoding', 'при_ошибках': 'errors' }, False ),
|
117
|
+
'Сумма': ( 'sum', { 'начало': 'start' }, False ),
|
118
|
+
'Надкласс': ( 'super', None, False ),
|
119
|
+
'Кортеж': ( 'tuple', None, True ),
|
120
|
+
'Тип': ( 'type', None, True ),
|
121
|
+
'Поля': ( 'vars', None, False ),
|
122
|
+
'Упаковать': ( 'zip', None, False ),
|
123
|
+
'__Подключить__': ( '__import__' , { 'название': 'name', 'общие_сущности': 'globals', 'местные_сущности': 'locals', 'по_списку': 'fromlist', 'уровень': 'level' }, False )
|
124
|
+
}
|
125
|
+
|
126
|
+
Специальные_названия = {
|
127
|
+
'__Название__': '__name__',
|
128
|
+
'__Документация__': '__doc__',
|
129
|
+
'__Пакет__': '__package__',
|
130
|
+
'__Загрузчик__': '__loader__',
|
131
|
+
'__Спецификация__': '__spec__',
|
132
|
+
'__Встроенное__': '__builtins__',
|
133
|
+
'__Файл__': '__file__',
|
134
|
+
'__Кэш__': '__cached__',
|
135
|
+
'__Поля__': '__dict__',
|
136
|
+
'__Класс__': '__class__',
|
137
|
+
'__Модуль__': '__module__',
|
138
|
+
'__Надклассы__': '__bases__',
|
139
|
+
'__Подклассы__': '__subclasses__',
|
140
|
+
'__Порядок_разрешения_методов__': '__mro__',
|
141
|
+
'__Параметры_типа__': '__type_params__',
|
142
|
+
'__Значение__': '__value__',
|
143
|
+
'__По_умолчанию__': '__defaults__',
|
144
|
+
'__Именованные_по_умолчанию': '__kwdefaults__',
|
145
|
+
'__Полное_имя__': '__qualname__',
|
146
|
+
'__Замыкание__': '__closure__',
|
147
|
+
'__Код__': '__code__',
|
148
|
+
'__Флаги__': '__flags__',
|
149
|
+
'__Отладка__': '__debug__',
|
150
|
+
'__Создание__': '__new__',
|
151
|
+
'__Подготовка__': '__init__',
|
152
|
+
'__Уничтожение__': '__del__',
|
153
|
+
'__Представление__': '__repr__',
|
154
|
+
'__Строка__': '__str__',
|
155
|
+
'__Байты__': '__bytes__',
|
156
|
+
'__Формат__': '__format__',
|
157
|
+
'__МЧ__': '__lt__',
|
158
|
+
'__МР__': '__le__',
|
159
|
+
'__РВ__': '__eq__',
|
160
|
+
'__НР__': '__ne__',
|
161
|
+
'__БЧ__': '__gt__',
|
162
|
+
'__БР__': '__ge__',
|
163
|
+
'__Хэш__': '__hash__',
|
164
|
+
'__Несуществующее_поле__': '__getattr__',
|
165
|
+
'__Получить_поле__': '__getattribute__',
|
166
|
+
'__Установка_поля__': '__setattr__',
|
167
|
+
'__Удаление_поля__': '__delattr__',
|
168
|
+
'__Содержимое__': '__dir__',
|
169
|
+
'__Получение__': '__get__',
|
170
|
+
'__Установка__': '__set__',
|
171
|
+
'__Удаление__': '__delete__',
|
172
|
+
'__Вызов__': '__call__',
|
173
|
+
'__Длина__': '__len__',
|
174
|
+
'__Подсказка_длины__': '__length_hint__',
|
175
|
+
'__Получение_значения__': '__getitem__',
|
176
|
+
'__Установка_значения__': '__setitem__',
|
177
|
+
'__Удаление_значения__': '__delitem__',
|
178
|
+
'__Пропущенное_значение__': '__missing__',
|
179
|
+
'__Перебиратель__': '__iter__',
|
180
|
+
'__Следующий__': '__next__',
|
181
|
+
'__Обращение__': '__reversed__',
|
182
|
+
'__Содержит__': '__contains__',
|
183
|
+
'__Сцепление__': '__concat__',
|
184
|
+
'__Сложение__': '__add__',
|
185
|
+
'__Вычитание__': '__sub__',
|
186
|
+
'__Умножение__': '__mul__',
|
187
|
+
'__МатрУмн__': '__matmul__',
|
188
|
+
'__Деление__': '__truediv__',
|
189
|
+
'__ЦелДел__': '__floordiv__',
|
190
|
+
'__Остаток__': '__mod__',
|
191
|
+
'__ЧастОст__': '__divmod__',
|
192
|
+
'__Степень__': '__pow__',
|
193
|
+
'__ЛСдвиг__': '__lshift__',
|
194
|
+
'__ПСдвиг__': '__rshift__',
|
195
|
+
'__И__': '__and__',
|
196
|
+
'__ИИли__': '__xor__',
|
197
|
+
'__Или__': '__or__',
|
198
|
+
'__АрифмОтр__': '__neg__',
|
199
|
+
'__ОдПлюс__': '__pos__',
|
200
|
+
'__АбсЗнач__': '__abs__',
|
201
|
+
'__ПобитИнв__': '__invert__',
|
202
|
+
'__Прав_Сложение__': '__radd__',
|
203
|
+
'__Прав_Вычитание__': '__rsub__',
|
204
|
+
'__Прав_Умножение__': '__rmul__',
|
205
|
+
'__Прав_МатрУмн__': '__rmatmul__',
|
206
|
+
'__Прав_Деление__': '__rtruediv__',
|
207
|
+
'__Прав_ЦелДел__': '__rfloordiv__',
|
208
|
+
'__Прав_Остаток__': '__rmod__',
|
209
|
+
'__Прав_ЧастОст__': '__rdivmod__',
|
210
|
+
'__Прав_Степень__': '__rpow__',
|
211
|
+
'__Прав_ЛСдвиг__': '__rlshift__',
|
212
|
+
'__Прав_ПСдвиг__': '__rrshift__',
|
213
|
+
'__Прав_И__': '__rand__',
|
214
|
+
'__Прав_ИИли__': '__rxor__',
|
215
|
+
'__Прав_Или__': '__ror__',
|
216
|
+
'__Присв_Сложение__': '__iadd__',
|
217
|
+
'__Присв_Вычитание__': '__isub__',
|
218
|
+
'__Присв_Умножение__': '__imul__',
|
219
|
+
'__Присв_МатрУмн__': '__imatmul__',
|
220
|
+
'__Присв_Деление__': '__itruediv__',
|
221
|
+
'__Присв_ЦелДел__': '__ifloordiv__',
|
222
|
+
'__Присв_Остаток__': '__imod__',
|
223
|
+
'__Присв_Степень__': '__ipow__',
|
224
|
+
'__Присв_ЛСдвиг__': '__ilshift__',
|
225
|
+
'__Присв_ПСдвиг__': '__irshift__',
|
226
|
+
'__Присв_И__': '__iand__',
|
227
|
+
'__Присв_ИИли__': '__ixor__',
|
228
|
+
'__Присв_Или__': '__ior__',
|
229
|
+
'__Компл__': '__complex__',
|
230
|
+
'__Цел__': '__int__',
|
231
|
+
'__Вещ__': '__float__',
|
232
|
+
'__Индекс__': '__index__',
|
233
|
+
'__Округлить__': '__round__',
|
234
|
+
'__ЦелЧасть__': '__trunc__',
|
235
|
+
'__МеньшЦел__': '__floor__',
|
236
|
+
'__БольшЦел__': '__ceil__',
|
237
|
+
'__Вход__': '__enter__',
|
238
|
+
'__Выход__': '__exit__',
|
239
|
+
'__Сопоставление_аргументов__': '__match_args__',
|
240
|
+
'__Буфер__': '__buffer__',
|
241
|
+
'__Освобождение_буфера__': '__release_buffer__',
|
242
|
+
'__Слоты__': '__slots__',
|
243
|
+
'__Подготовка_подкласса__': '__init_subclass__',
|
244
|
+
'__Получение_значения_из_класса__': '__class_getitem__',
|
245
|
+
'__Основные_классы__': '__mro_entries__',
|
246
|
+
'__Проверка_экземпляра__': '__instancecheck__',
|
247
|
+
'__Проверка_подкласса__': '__subclasscheck__',
|
248
|
+
'__Экспортуемое__': '__all__'
|
249
|
+
}
|
250
|
+
|
251
|
+
Исключения = {
|
252
|
+
'БазовоеИсключение': 'BaseException',
|
253
|
+
'СистемнаяОстановка': 'SystemExit',
|
254
|
+
'ПрерываниеКлавиатурой': 'KeyboardInterrupt',
|
255
|
+
'ОстановкаГенератора': 'GeneratorExit',
|
256
|
+
'ОбщееИсключение': 'Exception',
|
257
|
+
'ОстановкаИтерации': 'StopIteration',
|
258
|
+
'АрифметическаяОшибка': 'ArithmeticError',
|
259
|
+
'ОшибкаПлавающейЗапятой': 'FloatingPointError',
|
260
|
+
'ОшибкаПереполнение': 'OverflowError',
|
261
|
+
'ОшибкаДелениеНаНоль': 'ZeroDivisionError',
|
262
|
+
'ОшибкаПроверки': 'AssertionError',
|
263
|
+
'ОшибкаАтрибута': 'AttributeError',
|
264
|
+
'ОшибкаБуфера': 'BufferError',
|
265
|
+
'ОшибкаКонцаФайла': 'EOFError',
|
266
|
+
'ОшибкаИмпорта': 'ImportError',
|
267
|
+
'ОшибкаПоиска': 'LookupError',
|
268
|
+
'ОшибкаИндекса': 'IndexError',
|
269
|
+
'ОшибкаКлюча': 'KeyError',
|
270
|
+
'ОшибкаНедостаточноПамяти': 'MemoryError',
|
271
|
+
'ОшибкаМодульНеНайден': 'ModuleNotFoundError',
|
272
|
+
'ОшибкаНазвания': 'NameError',
|
273
|
+
'ОшибкаМестнойПеременной': 'UnboundLocalError',
|
274
|
+
'ОшибкаСистемы': 'OSError',
|
275
|
+
'ОшибкаБлокВводаВывода': 'BlockingIOError',
|
276
|
+
'ОшибкаДочернегоПроцесса': 'ChildProcessError',
|
277
|
+
'ОшибкаПодключения': 'ConnectionError',
|
278
|
+
'ОшибкаНеработающийКанал': 'BrokenPipeError',
|
279
|
+
'ОшибкаСоединениеОтменено': 'ConnectionAbortedError',
|
280
|
+
'ОшибкаСоединениеОтклонено': 'ConnectionRefusedError',
|
281
|
+
'ОшибкаСоединениеСброшено': 'ConnectionResetError',
|
282
|
+
'ОшибкаФайлСуществует': 'FileExistsError',
|
283
|
+
'ОшибкаФайлНеНайден': 'FileNotFoundError',
|
284
|
+
'ОшибкаПрервано': 'InterruptedError',
|
285
|
+
'ОшибкаПапкаВместоФайла': 'IsADirectoryError',
|
286
|
+
'ОшибкаФайлВместоПапки': 'NotADirectoryError',
|
287
|
+
'ОшибкаПравДоступа': 'PermissionError',
|
288
|
+
'ОшибкаПроцессНеНайден': 'ProcessLookupError',
|
289
|
+
'ОшибкаВремяВышло': 'TimeoutError',
|
290
|
+
'ОшибкаОбращения': 'ReferenceError',
|
291
|
+
'ОшибкаВыполнения': 'RuntimeError',
|
292
|
+
'ОшибкаМетодНеПереопределён': 'NotImplementedError',
|
293
|
+
'СинтаксическаяОшибка': 'SyntaxError',
|
294
|
+
'ОшибкаОтступов': 'IndentationError',
|
295
|
+
'ОшибкаТабуляции': 'TabError',
|
296
|
+
'СистемнаяОшибка': 'SystemError',
|
297
|
+
'ОшибкаТипа': 'TypeError',
|
298
|
+
'ОшибкаЗначения': 'ValueError',
|
299
|
+
'ОшибкаКодованияСимволов': 'UnicodeError',
|
300
|
+
'ОшибкаЗакодСимволов': 'UnicodeEncodeError',
|
301
|
+
'ОшибкаРаскодСимволов': 'UnicodeDecodeError',
|
302
|
+
'ОшибкаПереводаКодСимв': 'UnicodeTranslateError',
|
303
|
+
'ОбщееПредупреждение': 'Warning',
|
304
|
+
'ПредупрУстаревание': 'DeprecationWarning',
|
305
|
+
'ПредупрОжидаетсяУстаревание': 'PendingDeprecationWarning',
|
306
|
+
'ПредупрОРесурсах': 'ResourceWarning',
|
307
|
+
'ПредупрОВыполнении': 'RuntimeWarning',
|
308
|
+
'ПредупрОСинтаксисе': 'SyntaxWarning',
|
309
|
+
'ПредупрОКодованииСимволов': 'UnicodeWarning',
|
310
|
+
'ПредупрОБайтах': 'BytesWarning'
|
311
|
+
}
|
312
|
+
|
313
|
+
Ошибка_чтения_кода = False
|
314
|
+
|
315
|
+
def Прочитать_слова(чтение_строки):
|
316
|
+
global Ошибка_чтения_кода
|
317
|
+
try:
|
318
|
+
for тип, название, _,_, строка in Разборщик_слов.generate_tokens(чтение_строки):
|
319
|
+
if тип == 5: название = название.replace(' ' * 4, '\t')
|
320
|
+
отступов = 0; сч = 0
|
321
|
+
while (сч < len(строка) and строка[сч] == '\t'): отступов += 1; сч += 1
|
322
|
+
yield тип, название, отступов
|
323
|
+
except Exception as ошибка:
|
324
|
+
print("Ошибка чтения кода:\n" + str(ошибка))
|
325
|
+
Ошибка_чтения_кода = True
|
326
|
+
|
327
|
+
def Выполнить_основные_замены(слова, соответствия):
|
328
|
+
for номер, слово in enumerate(слова):
|
329
|
+
if слово[0] == 1 and слово[1] in соответствия:
|
330
|
+
слова[номер] = (1, соответствия[слово[1]], слово[2])
|
331
|
+
|
332
|
+
def Заменить_встроенные_функции(слова, соответствия):
|
333
|
+
for номер, слово in enumerate(слова):
|
334
|
+
if слово[0] == 1 and слово[1] in соответствия:
|
335
|
+
соответствие = соответствия[слово[1]]
|
336
|
+
if (номер == 0 or слова[номер - 1][1] != '.') and \
|
337
|
+
( \
|
338
|
+
(номер + 1 < len(слова) and слова[номер + 1][1] == '(') or \
|
339
|
+
(номер == 0 or слова[номер - 1][1] == '@') or \
|
340
|
+
соответствие[2] \
|
341
|
+
):
|
342
|
+
слова[номер] = (1, соответствие[0], слово[2])
|
343
|
+
if соответствие[1] and not соответствие[2] and \
|
344
|
+
номер + 1 < len(слова) and слова[номер + 1][1] == '(':
|
345
|
+
сч = номер + 2
|
346
|
+
скобки = [0, 0, 0]
|
347
|
+
while сч < len(слова):
|
348
|
+
if слова[сч][1] in ['(', '[', '{']: скобки[['(', '[', '{'].index(слова[сч][1])] += 1
|
349
|
+
elif слова[сч][1] in [')', ']', '}']: скобки[[')', ']', '}'].index(слова[сч][1])] -= 1
|
350
|
+
elif sum(скобки) == 0:
|
351
|
+
if слова[сч][1] == ')': break
|
352
|
+
if слова[сч][0] == 1 and слова[сч][1] in соответствие[1] and \
|
353
|
+
сч + 1 < len(слова) and слова[сч + 1][1] == '=':
|
354
|
+
слова[сч] = (1, соответствие[1][слова[сч][1]], слова[сч][2])
|
355
|
+
сч += 1
|
356
|
+
|
357
|
+
def Посчитать_номер_строки(слова, позиция):
|
358
|
+
переводов = 0
|
359
|
+
for сч in range(позиция):
|
360
|
+
if слова[сч][1] == '\n': переводов += 1
|
361
|
+
return переводов + 1
|
362
|
+
|
363
|
+
def Найти_знак_с_учётом_скобок(знак, начало, слова):
|
364
|
+
сч = начало
|
365
|
+
скобки = [0, 0, 0]
|
366
|
+
while сч < len(слова):
|
367
|
+
if слова[сч][1] in ['(', '[', '{']: скобки[['(', '[', '{'].index(слова[сч][1])] += 1
|
368
|
+
elif слова[сч][1] in [')', ']', '}']: скобки[[')', ']', '}'].index(слова[сч][1])] -= 1
|
369
|
+
elif слова[сч][1] == знак and sum(скобки) == 0: break
|
370
|
+
сч += 1
|
371
|
+
return сч
|
372
|
+
|
373
|
+
def Найти_нач_след_блока(поз, слова):
|
374
|
+
нач_поз = слова[поз][2]
|
375
|
+
while поз < len(слова) and слова[поз][1] != '\n':
|
376
|
+
поз += 1
|
377
|
+
поз += 1
|
378
|
+
while поз < len(слова):
|
379
|
+
if слова[поз][1] != '\n' and слова[поз][2] <= нач_поз:
|
380
|
+
break
|
381
|
+
поз += 1
|
382
|
+
while True:
|
383
|
+
if (слова[поз][0] == 6 or слова[поз][1] == '\n') and поз > 0 and слова[поз - 1][1] == '\n':
|
384
|
+
поз -= 1
|
385
|
+
else:
|
386
|
+
break
|
387
|
+
return поз
|
388
|
+
|
389
|
+
def Извлечь_строку_по_номеру_слова(слова, позиция_слова):
|
390
|
+
строка = []
|
391
|
+
поз = позиция_слова
|
392
|
+
while поз > 0 and слова[поз][1] != '\n': поз -= 1
|
393
|
+
if слова[поз][1] == '\n': поз += 1
|
394
|
+
while поз < len(слова) and слова[поз][1] != '\n':
|
395
|
+
строка.append(слова[поз][1])
|
396
|
+
поз += 1
|
397
|
+
return строка
|
398
|
+
|
399
|
+
Временные_файлы = []
|
400
|
+
|
401
|
+
def Обработать_импорт(импорт, путь_к_текущему_файлу):
|
402
|
+
for название in импорт['перечень']:
|
403
|
+
if импорт['источник'] or название not in Система.modules:
|
404
|
+
источник = импорт['источник'] if импорт['источник'] else ''
|
405
|
+
подъёмов = 0
|
406
|
+
if len(источник) > 0:
|
407
|
+
while источник[подъёмов] == '.': подъёмов += 1
|
408
|
+
источник = источник[подъёмов:]
|
409
|
+
if подъёмов == 1: подъёмов = 0
|
410
|
+
разделитель = '\\' if Система.platform.startswith('win32') else '/'
|
411
|
+
путь = путь_к_текущему_файлу.split(разделитель)
|
412
|
+
путь = путь[:len(путь) - подъёмов - 1]
|
413
|
+
путь = разделитель.join(путь) + \
|
414
|
+
(разделитель + источник.replace('.', разделитель) if len(источник) > 0 else '') + \
|
415
|
+
разделитель + название
|
416
|
+
if ОС.path.isfile(путь + '.крп') and not ОС.path.isfile(путь + '.py'):
|
417
|
+
if путь not in Временные_файлы:
|
418
|
+
код = Преобразовать_код(путь + '.крп')
|
419
|
+
файл = open(путь + '.py', mode='w', encoding='utf-8')
|
420
|
+
файл.write(код)
|
421
|
+
файл.close()
|
422
|
+
Временные_файлы.append(путь)
|
423
|
+
|
424
|
+
Циклы_со_счётчиком = []
|
425
|
+
|
426
|
+
def Преобразовать_код(путь_к_файлу):
|
427
|
+
слова = list(Прочитать_слова(open(путь_к_файлу, encoding='utf-8').readline))
|
428
|
+
|
429
|
+
# обрабатываем импорты
|
430
|
+
импорты = []
|
431
|
+
строки_импорта = []
|
432
|
+
for поз in [i for i, x in enumerate(слова) if x[1] == 'Подключить' or x[1] == 'подключить']:
|
433
|
+
строки_импорта.append(Извлечь_строку_по_номеру_слова(слова, поз))
|
434
|
+
for строка in строки_импорта:
|
435
|
+
импорт = { 'источник': None, 'перечень': None }
|
436
|
+
сч = 0
|
437
|
+
if строка[0] == 'Из':
|
438
|
+
импорт['источник'] = ''
|
439
|
+
сч = 1
|
440
|
+
while сч < len(строка) and строка[сч] != 'подключить':
|
441
|
+
импорт['источник'] += строка[сч]; сч += 1
|
442
|
+
if сч < len(строка):
|
443
|
+
сч += 1
|
444
|
+
импорт['перечень'] = []; название = ''
|
445
|
+
while сч < len(строка):
|
446
|
+
if строка[сч] == ',':
|
447
|
+
if название != '': импорт['перечень'].append(название); название = ''
|
448
|
+
elif строка[сч] == 'как': сч += 1
|
449
|
+
else: название += строка[сч]
|
450
|
+
сч += 1
|
451
|
+
if название != '': импорт['перечень'].append(название)
|
452
|
+
импорты.append(импорт)
|
453
|
+
for импорт in импорты: Обработать_импорт(импорт, путь_к_файлу)
|
454
|
+
|
455
|
+
Выполнить_основные_замены(слова, Служебные_слова)
|
456
|
+
Выполнить_основные_замены(слова, Специальные_названия)
|
457
|
+
Выполнить_основные_замены(слова, Исключения)
|
458
|
+
Заменить_встроенные_функции(слова, Встроенные_функции)
|
459
|
+
|
460
|
+
# Обрабатываем цикл со счётчиком
|
461
|
+
сдвиг = 0
|
462
|
+
for поз in [i for i, x in enumerate(слова) if x[1] == 'Цикл']:
|
463
|
+
поз += len(Циклы_со_счётчиком) * 4
|
464
|
+
отступов = слова[поз][2]
|
465
|
+
нач_след_блока = Найти_нач_след_блока(поз, слова)
|
466
|
+
Циклы_со_счётчиком.append((Посчитать_номер_строки(слова, поз), Посчитать_номер_строки(слова, нач_след_блока)))
|
467
|
+
двт_1 = Найти_знак_с_учётом_скобок(':', поз + 1, слова)
|
468
|
+
двт_2 = Найти_знак_с_учётом_скобок(':', двт_1 + 1, слова)
|
469
|
+
двт_3 = Найти_знак_с_учётом_скобок(':', двт_2 + 1, слова)
|
470
|
+
код_объявл_сч = слова[поз + 1 : двт_1]
|
471
|
+
код_усл_ост = слова[двт_1 + 1 : двт_2]
|
472
|
+
код_изм_сч = слова[двт_2 + 1 : двт_3]
|
473
|
+
код_итерации = слова[двт_3 + 1 : нач_след_блока]
|
474
|
+
однострочно = len(слова) > двт_3 + 1 and слова[двт_3 + 1][1] != '\n'
|
475
|
+
слова = слова[:поз] + код_объявл_сч + \
|
476
|
+
[(4, '\n', отступов), (1, 'while', отступов), (54, '(', отступов)] + \
|
477
|
+
код_усл_ост + \
|
478
|
+
[(54, ')', отступов), (54, ':', отступов)] + \
|
479
|
+
([(4, '\n', отступов)] if однострочно else []) + \
|
480
|
+
[(5, '\t' * (отступов + 1), отступов + 1)] + \
|
481
|
+
код_итерации + \
|
482
|
+
([(4, '\n', отступов + 1)] if not однострочно else []) + \
|
483
|
+
код_изм_сч + \
|
484
|
+
([(4, '\n', отступов + 1)] if однострочно else []) + \
|
485
|
+
[(6, '', отступов + 1)] + \
|
486
|
+
слова[нач_след_блока:]
|
487
|
+
|
488
|
+
# Обрабатываем цикл с послеусловием
|
489
|
+
сдвиг = 0
|
490
|
+
for поз in [i for i, x in enumerate(слова) if x[1] == 'Повторять']:
|
491
|
+
отступов = слова[поз + сдвиг][2]
|
492
|
+
слова[поз + сдвиг] = (1, 'while', отступов)
|
493
|
+
слова.insert(поз + сдвиг + 1, (54, '(', отступов))
|
494
|
+
слова.insert(поз + сдвиг + 2, (1, 'True', отступов))
|
495
|
+
слова.insert(поз + сдвиг + 3, (54, ')', отступов))
|
496
|
+
сдвиг += 3
|
497
|
+
|
498
|
+
сдвиг = 0
|
499
|
+
for поз in [i for i, x in enumerate(слова) if x[1] == 'До']:
|
500
|
+
отступов = слова[поз + сдвиг][2] + 1
|
501
|
+
if (поз > 0 and слова[поз + сдвиг - 1][0] == 6):
|
502
|
+
del слова[поз + сдвиг - 1]
|
503
|
+
сдвиг -= 1
|
504
|
+
if (поз > 0 and слова[поз + сдвиг - 1][0] == 5):
|
505
|
+
слова[поз + сдвиг - 1] = (5, слова[поз + сдвиг - 1][1] + '\t', отступов)
|
506
|
+
слова[поз + сдвиг] = (1, 'if', отступов)
|
507
|
+
сч = Найти_знак_с_учётом_скобок('\n', поз + сдвиг + 1, слова)
|
508
|
+
слова.insert(сч, (54, ':', отступов))
|
509
|
+
слова.insert(сч + 1, (1, 'break', отступов))
|
510
|
+
слова.insert(сч + 2, (6, '', отступов - 1))
|
511
|
+
сдвиг += 3
|
512
|
+
|
513
|
+
# Обрабатываем проверки существования
|
514
|
+
сдвиг = 0
|
515
|
+
for поз in [i for i, x in enumerate(слова) if x[1] == '$']:
|
516
|
+
отступов = слова[поз + сдвиг][2] + 1
|
517
|
+
нач = поз + сдвиг
|
518
|
+
кон = нач + 1
|
519
|
+
откр_ск = [0, 0, 0]
|
520
|
+
while кон < len(слова):
|
521
|
+
if слова[кон][1] == '?' and sum(откр_ск) == 0:
|
522
|
+
break
|
523
|
+
elif (слова[кон][1] == '('): откр_ск[0] += 1
|
524
|
+
elif (слова[кон][1] == '['): откр_ск[1] += 1
|
525
|
+
elif (слова[кон][1] == '{'): откр_ск[2] += 1
|
526
|
+
elif (слова[кон][1] == ')'): откр_ск[0] -= 1
|
527
|
+
elif (слова[кон][1] == ']'): откр_ск[1] -= 1
|
528
|
+
elif (слова[кон][1] == '}'): откр_ск[2] -= 1
|
529
|
+
кон += 1
|
530
|
+
if кон < len(слова):
|
531
|
+
слова[нач] = (1, '__Проверить_существование__', отступов)
|
532
|
+
слова.insert(нач + 1, (54, '(', отступов))
|
533
|
+
слова.insert(нач + 2, (54, "'", отступов))
|
534
|
+
сдвиг += 2
|
535
|
+
тек_сдв = 0
|
536
|
+
for сч in range(нач + 3, кон + 2):
|
537
|
+
if сч < len(слова):
|
538
|
+
if слова[сч + тек_сдв][1] in ('\\', "'"):
|
539
|
+
слова.insert(сч + тек_сдв, (54, '\\', отступов))
|
540
|
+
тек_сдв += 1
|
541
|
+
elif слова[сч + тек_сдв][0] == 3:
|
542
|
+
заэкр_сл = слова[сч + тек_сдв][1].replace('\\', '\\\\').replace("'", "\\'")
|
543
|
+
слова[сч + тек_сдв] = (3, заэкр_сл, отступов)
|
544
|
+
сдвиг += тек_сдв
|
545
|
+
if кон + 2 + тек_сдв < len(слова):
|
546
|
+
слова[кон + 2 + тек_сдв] = (54, "'", отступов)
|
547
|
+
for сч, сл in enumerate([',', 'globals', '(', ')', ',', 'locals', '(', ')']):
|
548
|
+
слова.insert(кон + 2 + тек_сдв + 1 + сч, (54 if len(сл) == 0 else 1, сл, отступов))
|
549
|
+
слова.insert(кон + 2 + тек_сдв + 9, (54, ')', отступов))
|
550
|
+
сдвиг += 10
|
551
|
+
else: break
|
552
|
+
|
553
|
+
# Запускаем разборщик
|
554
|
+
global Ошибка_чтения_кода
|
555
|
+
исходник = None
|
556
|
+
try:
|
557
|
+
исходник = Разборщик_слов.untokenize(map(lambda с: (с[0], с[1]), слова))
|
558
|
+
except Exception as ошибка:
|
559
|
+
print("Ошибка чтения кода:\n" + str(ошибка))
|
560
|
+
Ошибка_чтения_кода = True
|
561
|
+
|
562
|
+
исходник = 'import ' + __name__.split('.')[0] + '.__Заголовочный_код__\n\n' + исходник
|
563
|
+
|
564
|
+
return None if Ошибка_чтения_кода else исходник
|
565
|
+
|
566
|
+
def Вывести_текст_исключения(исключение, заголовок, путь_к_файлу):
|
567
|
+
сч = 1
|
568
|
+
while True:
|
569
|
+
try:
|
570
|
+
искл = Разборщик_исключений.TracebackException(
|
571
|
+
exc_type=type(исключение),
|
572
|
+
exc_traceback=исключение.__traceback__,
|
573
|
+
exc_value=исключение
|
574
|
+
).stack[-сч]
|
575
|
+
except: break
|
576
|
+
if искл.name == '<module>': break
|
577
|
+
сч += 1
|
578
|
+
if искл.name == '<module>':
|
579
|
+
номер_строки = искл.lineno - 2
|
580
|
+
else:
|
581
|
+
try: номер_строки = исключение.lineno - 2
|
582
|
+
except: номер_строки = 0
|
583
|
+
|
584
|
+
выч_стр = 0
|
585
|
+
for ц in Циклы_со_счётчиком:
|
586
|
+
if номер_строки > ц[1] + 1: выч_стр += 2;
|
587
|
+
elif номер_строки > ц[0]: выч_стр += 1; break
|
588
|
+
else: break
|
589
|
+
номер_строки -= выч_стр
|
590
|
+
название_исключения = type(исключение).__name__
|
591
|
+
if название_исключения in Исключения.values():
|
592
|
+
название_исключения = next(к for к, з in Исключения.items() if з == название_исключения)
|
593
|
+
print('\n(!) Исключение "' + название_исключения + '" ' + заголовок)
|
594
|
+
print(' в файле "' + путь_к_файлу + '"' + ('.\n' if номер_строки == 0 else ''))
|
595
|
+
if номер_строки > 0:
|
596
|
+
print(' на строке № ' + str(номер_строки) + '.\n');
|
597
|
+
try: print(' ' + исключение.msg)
|
598
|
+
except: print(' ' + str(исключение))
|
599
|
+
|
600
|
+
def Запустить_код(название, исходник, путь_к_файлу):
|
601
|
+
код = None
|
602
|
+
try: код = compile(исходник, название, 'exec')
|
603
|
+
except Exception as исключение:
|
604
|
+
Вывести_текст_исключения(исключение, 'при разборе кода', путь_к_файлу)
|
605
|
+
if код:
|
606
|
+
try: Запуск_кода._run_module_code(код, mod_name="__Главный__", script_name=путь_к_файлу)
|
607
|
+
except Exception as исключение:
|
608
|
+
Вывести_текст_исключения(исключение, 'при выполнении кода', путь_к_файлу)
|
609
|
+
for файл in Временные_файлы:
|
610
|
+
ОС.remove(файл + '.py')
|
@@ -0,0 +1 @@
|
|
1
|
+
Русским людям от русских людей.
|
@@ -0,0 +1,8 @@
|
|
1
|
+
rupython/__main__.py,sha256=BxtsIK8PJuOOGVDKxqoscwJjjWWhZts7adicFuwUL6k,540
|
2
|
+
rupython/__Заголовочный_код__.py,sha256=gShPgIcypiTojfl7yi-bNQGhXn7-lxM3KS_0py3-mXI,9921
|
3
|
+
rupython/Преобразователь.py,sha256=iIflCiWx65mSTjPTaZU1o-kNwOeITC-xhGnkkg5FqSE,33633
|
4
|
+
rupython-1.0.0.dist-info/LICENSE,sha256=iWzdt1wyTlK8qNSu7TzK8pjjIcCvLvWHycp7ACRcWEc,59
|
5
|
+
rupython-1.0.0.dist-info/METADATA,sha256=d3-dgvnaQETtp-PVgaX3c9lBIg1nnq1X96lJ0VpYhIM,152
|
6
|
+
rupython-1.0.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
7
|
+
rupython-1.0.0.dist-info/top_level.txt,sha256=GtXaS8JTsBm5hpQxxtQlrxK6rExvSAK_Cp44FrY4210,9
|
8
|
+
rupython-1.0.0.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
rupython
|