2013-07-31 2 views
4

Я пытаюсь реализовать интерпретатор для brainfuck, и на данный момент я просто использую серию утверждений if/elif.Лучший способ реализовать интерпретатор в Python

if(i == ">"): 
    ... 
elif(i == "<"): 
    ... 
elif(i == "+"): 
    ... 
elif(i == "-"): 
    ... 

Однако, это кажется очень неуклюжим и непитоничным для меня. Есть ли лучший (более чистый/более быстрый/более эстетичный) способ реализовать это?

+0

Исследование парсеры и лексеры ... –

+2

Неправильный подход. Ищите: Lexers, Tokenizers, Parsers – Nadh

+2

Словарь, который переводит токены на действия, для одного ... – StoryTeller

ответ

6

У меня есть быстрая реализация интерпретатора Brainfuck для Python в GitHub repo. В двух словах, однако, вы можете сохранить словарь, где ключи являются символами Brainfuck, а значения являются объектами функции (или метода), а затем отправляются на это. Что-то вроде этого:

instructions = { 
    '+': increment, 
    '-': decrement, 
    # Other functions 
} 

def run(tape): 
    ch = next_token(tape) 
    if ch in instructions: 
    instructions[ch]() 

(не фактическая реализация, только быстрый рисунок.)

+2

+1. Как правило, почти любая цепочка из более чем нескольких строк 'if foo == 'a':' 'elif foo == 'b':' лучше написана таким образом, используя dict для отправки в функции. Однако вы можете использовать 'instruction.get (ch, default_func)' вместо явной проверки 'in'. (Конечно, 'default_func' - это NOP, обработчик ошибок или что-то другое зависит от того, что вы пишете.) – abarnert

+0

woahhhhhhhh вы говорите мне, что' инструкции [ch]() 'работает так? – Stephan

+1

@Stephan: Если 'commands' - это dict, значения которого вызываются, тогда' команды [ch] 'являются вызываемыми, поэтому' commands [ch]() 'является выражением вызова. (Функции, связанные методы и другие вызовы являются первоклассными значениями в Python, факт, который стоит изучать рано и регулярно использовать!) – abarnert

 Смежные вопросы

  • Нет связанных вопросов^_^