我正在编写一种简单的语言来描述函数调用的序列。
我正在使用python,但也只接受算法答案。
例如我有一个代码:
for 2:
{
a
for 3:
{
b
c
}
}
我怎样才能按照这样的顺序进行? (对于n:{block},其中n是出现的时间块)
一 b C b C b C 一个 b C b C b ç
我知道存在词法分析器和令牌,但我怎样才能更简单?因为语言没有任何更多的结构,只需要描述这样的序列。令牌对我来说非常困难(但是如果你发布代码我将非常高兴:))
由于
答案 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'
是的我意识到这是一个非常不切实际和笨重的解决方案,我不认为这是最终的答案,但是在有人发布更好的答案之前,它可能会让你得到一些结果。 :)