如何在循环中解析函数调用?

时间:2016-06-30 00:01:26

标签: python translate

我正在编写一种简单的语言来描述函数调用的序列。

我正在使用python,但也只接受算法答案。

例如我有一个代码:

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

我怎样才能按照这样的顺序进行? (对于n:{block},其中n是出现的时间块)

一 b C b C b C 一个 b C b C b ç

我知道存在词法分析器和令牌,但我怎样才能更简单?因为语言没有任何更多的结构,只需要描述这样的序列。令牌对我来说非常困难(但是如果你发布代码我将非常高兴:))

由于

1 个答案:

答案 0 :(得分:0)

请注意,我没有任何解析经验和使用正则表达式的经验非常有限。对于我自己来说,这不仅仅是一个解决方案,而是对你有用。

你的语法与python生成器相差不远,python生成器是一个生成你想要的值的有效python生成器:

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语句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'

是的我意识到这是一个非常不切实际和笨重的解决方案,我不认为这是最终的答案,但是在有人发布更好的答案之前,它可能会让你得到一些结果。 :)