Оптимизация формата хранения на основе вложенных списков для определения областей фигурных скобок.Python

Программы на Python
Anonymous
Оптимизация формата хранения на основе вложенных списков для определения областей фигурных скобок.

Сообщение Anonymous »

Я создал свой собственный язык программирования на Python, и на данный момент он использует систему, которая при обнаружении { создает перед ним список, примерно так: >

Код: Выделить всё

tokens = ['IF', 'a', '>', 'b', '{', ['PRINT', '(', '"', 'hello', '"', ')'], '}']
Я написал программу, использующую этот стиль списка:

Код: Выделить всё

def process_scopes(tokenized_output: list, condition: bool, position: int):
index = position
if condition == False:
for token in tokenized_output:
index += 1

if tokenized_output[index] == "}":
print(token)
break
else:
for token in tokenized_output:
index += 1
if isinstance(token, list):
index = process_scopes(token, condition, index)
else:
print(token)
position = index
return position
Он принимает аргумент условия, который является результатом работы программы, которая оценивает условия, заданные для оператора if (это не имеет значения). Но дело в том, что требуется три аргумента, каждый из которых имеет решающее значение для работы остальной части программы. вот описание каждого аргумента и того, что они делают:
  • Код: Выделить всё

    tokenized_output
    , это список, содержащий информацию об областях, он должен выглядеть примерно так:

Код: Выделить всё

tokens = ['IF', 'a', '>', 'b', '{', ['PRINT', '(', '"', 'hello', '"', ')'], '}']
  • Код: Выделить всё

    condition
    — это логическое значение, которое оценивает, являются ли условия оператора if истинными или нет. Если true, оно выполняет содержимое вложенного списка внутри {}, в данном случае должен выполнить:

Код: Выделить всё

['PRINT', '(', '"', 'hello', '"', ')']
  • Код: Выделить всё

    position
    , это целочисленное значение, которое указывает индекс списка tokenized_output, в котором оно находится, а также причина, по которой мне нужно новое предложение о том, как хранить эти области, как при вызове этой функции, переменная, передаваемая в аргумент позиции, является позицией другого списка, который аналогичен этому списку областей, но в нем нет вложенных списков, и он будет выглядеть примерно так:

Код: Выделить всё

['IF', 'a', '>', 'b', '{', 'PRINT', '(', '"', 'hello', '"', ')', '}']
Это означает, что если я не передам позицию индекса, который находится в основном списке (первый список, не вложенный ни в какие другие списки), и если позиция этого индекса не находится перед появление любых вложенных списков (в этом случае 'IF', 'a', '>', 'b', '{' будут находиться до появления первого вложенного списка), индекс будет все перепутано.
Поэтому мне нужна помощь в том, как «обновить» таким способом, который я использую для определения областей, и вместо этого запросить способ, который работает даже когда индекс, взятый из «невложенного списка», переносится в другой список (список, в котором определены области действия), он все равно будет давать тот же результат.Вот еще один пример аргумента условия:
(^ — указатель позиции)
если условие имеет значение False:
отсюда:

Код: Выделить всё

tokens = ['IF', 'a', '>', 'b', '{', ['PRINT', '(', '"', 'hello', '"', ')'], '}']
^
сюда:

Код: Выделить всё

tokens = ['IF', 'a', '>', 'b', '{', ['PRINT', '(', '"', 'hello', '"', ')'], '}']
^
пропуск ['PRINT', '(', '"', 'hello', '"', ')']
если условие истинно:
отсюда:

Код: Выделить всё

tokens = ['IF', 'a', '>', 'b', '{', ['PRINT', '(', '"', 'hello', '"', ')'], '}']
^
выполните все это:

Код: Выделить всё

tokens = ['IF', 'a', '>', 'b', '{', ['PRINT', '(', '"', 'hello', '"', ')'], '}']
^      ^    ^      ^      ^    ^
сюда:

Код: Выделить всё

tokens = ['IF', 'a', '>', 'b', '{', ['PRINT', '(', '"', 'hello', '"', ')'], '}']
^
Это означает, что вам нужно вернуть значение позиции после завершения.
Поэтому я попробовал код, указанный ранее:

Код: Выделить всё

def process_scopes(tokenized_output: list, condition: bool, position: int):
index = position
if condition == False:
for token in tokenized_output:
index += 1

if tokenized_output[index] == "}":
print(token)
break
else:
for token in tokenized_output:
index += 1
if isinstance(token, list):
index = process_scopes(token, condition, index)
else:
print(token)
position = index
return position
И проблема в том, что иногда он возвращает индекс, значительно превышающий длину списка, а иногда просто выходит из всей программы, не выполняя код, который появляется после вызова функции.
Поэтому мне нужно либо решение, либо другой способ обработки фигурных скобок и областей видимости в моей программе.

Подробнее здесь: https://stackoverflow.com/questions/788 ... ets-scopes

Вернуться в «Python»