2016-06-30 1 views
0

Я пишу простой язык для описания последовательности вызовов функций.Как анализировать вызовы функций в цикле?

Я использую питон, но также принимаются только ответы на алгоритм.

Например у меня есть код:

for 2: 
{ 
    a 
    for 3: 
    { 
    b 
    c 
    } 
} 

Как я могу продолжить это в такой последовательности? (При п: {блок}, где п раз блок появился)

б с б с б с б с б с б гр

Я знаете, что существует лексеры и жетоны, но как я могу сделать это намного проще? Потому что язык не имеет больше конструкций и необходим только для описания таких последовательностей. Теперь токены будут очень diffucult для меня (но если вы размещаете код я буду очень рад :))

Благодаря

+0

Нет причин ожидать, что решение ad hoc с менее мощными инструментами будет * проще *, чем использование высокоуровневых инструментов, предназначенных для вашей задачи. – user2357112

+0

Но мне нужно интегрировать его в мой проект python, который работает с такими последовательностями. Как я могу сделать? Что мне нужно использовать? О каких инструментах говорят?)))) –

+0

Получите [pyparsing] (http://pyparsing.wikispaces.com/) или какой-нибудь другой генератор парсера и напишите себе парсер. – user2357112

ответ

0

Обратите внимание, что у меня нет никакого опыта работы с разбором и очень ограниченным опытом работы с регулярным выражением. Это было более сложной задачей для меня больше, чем для решения, но независимо от того, что это может быть полезно для вас.

Ваш синтаксис не так далеко от питона генератору, действительного генератора питона, который производит значения, которые будут выглядеть следующим образом:

def temp(): 
    for _ in range(2): 
     yield 'a' 
     for _ in range(3): 
     yield 'b' 
     yield 'c' 

Итак, есть только две замены вы должны сделать , то for n в for _ in range(n):

def sub_for(match): 
    return "_ in range({})".format(match.group(0)) 

def my_code_to_generator(code): 
    # match a number that is preceded by "for " and right before a ":" 
    code = re.sub("(?<=for)\d+(?=:)",sub_for,code)  
    ... 

И изменяющиеся произвольные буквы a в отчетность доходности yield 'a':

def sub_letter(match): 
    return "yield {!r}".format(match.group(0)) 

def my_code_to_generator(code): 
    code = re.sub("(?<=for)\d+(?=:)",sub_for,code) 
    #match a single character that has whitespace around it. 
    code = re.sub("(?<=\s)[A-Za-z](?=\s)", sub_letter, code) 
    .... 

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

import re 

def sub_for(match): 
    return "_ in range({})".format(match.group(0)) 

def sub_letter(match): 
    return "yield {!r}".format(match.group(0)) 

def my_code_to_generator(code): 
    code = re.sub("(?<=for)\d+(?=:)",sub_for,code) 
    code = re.sub("(?<=\s)[A-Za-z](?=\s)", sub_letter, code) 
    code = "def temp():\n " + code.replace("\n","\n ") 
    namespace = {} 
    exec(code,namespace) 
    return namespace["temp"]() 

text = """ 
for 2: 
{ 
    a 
    for 3: 
    { 
    b 
    c 
    } 
}""".replace("{","").replace("}","") #no curly braces in python! 

>>> list(my_code_to_generator(text)) 
['a', 'b', 'c', 'b', 'c', 'b', 'c', 'a', 'b', 'c', 'b', 'c', 'b', 'c'] 
>>> "".join(my_code_to_generator(text)) 
'abcbcbcabcbcbc' 

Да я понимаю, что это очень непрактичное и неуклюжее решение, я не ожидаю, что это будет окончательный ответ, но пока кто-то не станет лучше, он может позволить вам получить некоторые результаты. :)

+0

LoL! Спасибо, он открыл мне глаза. Я просто изменил синтаксис на код python и выводил утверждения. Это стало очень легко. Код, который я дал в вопросе, был из генератора, поэтому мне нужно изменить только несколько строк кода, чтобы генерировать код python, как вы это делали. Спасибо)))))) –

+0

Вау, я не ожидал, что этот ответ будет принят. Ну всегда рад помочь! –

+0

Это был гений. По завершении проекта я пришлю вам результаты, есть интересный проект. (Генератор музыки, основанный на генераторе ритмического алгоритма, который генерирует код, компилирует его в сборку виртуальной машины, что, в конечном счете, переводит его в волновые кадры) –