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

How to parse function calls in loop?

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

我使用的是python,但也只接受算法答案。

例如我有一个代码:

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

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

一个 b C b C b C 一种 b C b C b c

我知道存在词法分析器和标记,但我怎样才能更简单呢?因为语言没有更多的结构,只需要描述这样的序列。代币现在对我来说非常困难(但如果你 post 一个代码我会很高兴 :) )

谢谢

请注意,我没有任何解析经验,对正则表达式的经验也非常有限。这对我来说是一个挑战,而不是一个解决方案,但无论如何它可能对你有用。

您的语法与 python 生成器相去不远,生成您想要的值的有效 python 生成器如下所示:

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

所以你只需要做两个替换,for nfor _ 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'

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