如何解析循环中的函数调用?
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 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'
是的,我意识到这是一个非常不切实际且笨拙的解决方案,我不希望这是最终答案,但在有人发布更好的答案之前,它可能会让您得到一些结果。 :)
我正在编写一种简单的语言来描述函数调用序列。
我使用的是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 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'
是的,我意识到这是一个非常不切实际且笨拙的解决方案,我不希望这是最终答案,但在有人发布更好的答案之前,它可能会让您得到一些结果。 :)