Структура данных для хранения программной последовательности - Python - PullRequest
2 голосов
/ 22 ноября 2011

Я пишу программное обеспечение для получения последовательности команд от пользователя со стандартным потоком управления (т. Е. Пользователь может вкладывать свои нужные команды):

   cmd1
   cmd2
   cmd3
   loop.1:
    cmd1
    cmd2
    cmd3
      loop.2
        cmd1
        cmd2
      endloop.2
    cmd4
    cmd5
   endloop.1

Вам не известно о структуре данных, которая поддерживает порядок во вложенных структурах? В принципе, какая структура данных используется для хранения входной программы на любом языке? Вы знаете эквивалент в Python? Я пытаюсь использовать OrderedDict(), но должен быть более настроенный.

Ответы [ 3 ]

1 голос
/ 22 ноября 2011

Использовать (косвенно) вложенный список.Я предполагаю, что у вас есть класс

class Command(object):
    def execute(self):
        # whatever

для базовых команд.Сделать подкласс для циклов:

class Loop(Command):
    def __init__(self, condition, cmds):
        self.body = cmds                  # list of Commands
        self.condition = condition

    def execute(self):
        while self.condition.execute():
            for x in self.body:
                x.execute()
0 голосов
/ 22 ноября 2011

Это называется Абстрактное синтаксическое дерево (или AST для краткости).

То есть ... дерево, поэтому его можно смоделировать как список списков, но вы можетехотите использовать что-то с немного большей структурой (зависит от того, насколько «типизированным» вы хотите, чтобы ваш AST был).

Я бы пошел с наличием объекта для каждого узла, каждый из которых имеет «Операцию» и нольили более листьев (т.е. подвыражения или подвыражения).

Для более жестко типизированной структуры число листьев будет ограничено (т.е. использовать кортеж) для всего, кроме общих «блоков», «тела», которые являются просто списком операторов, то есть функцией или если/ while / для тел ..

0 голосов
/ 22 ноября 2011

Вы можете использовать двоичное дерево.Если вы не хотите реализовывать его в python, вы можете подделать обход по порядку такого дерева и сохранить его в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...