Оптимизация формата хранения на основе вложенных списков для определения областей фигурных скобок.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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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