我设计了一种玩具语言:
# comments
n = 2 #an integer
k = 3.14 # a float
f(x): # a function
return (x-k)^n
g(z): #another function
return max(z-2.9, 0.1) # max should be understood
h(x,y: # another function ; note that function can call functions
return x*g(y)
pointable x # a formal variable
pointable y # another formal variable
gives h (x @ 3.2, y @ 1.9) @ 6.1 # an instruction, the meaning will be clear later
gives f (x @ 1.2) @ 3.1 #another instruction
give # the final instruction
此语言的目的如下:解析之前的代码应该创建以下列表:
[[1, (f), (1.2), 3.1], [2, (f, h), (3.2, 1.9), 6.1]]
元素数量与give
指令数量相同。
我不知道如何为这种语言设计语法。我知道它必须是EBNF形式,因为我想使用plyplus
,因为我已经用简单的代数表达式解析玩弄了它,但是从简单的代数表达直接评估和我想要的东西有一个很大的转变做。 (即使我知道它正式相同。)
(当你拥有上面代码的抽象语法树btw时,如何处理函数?)
有关信息,最后,从[[1, (f), (1.2), 3.1], [2, (f, h), (3.2, 1.9), 6.1]]
我想生成以下python函数:
def F(X1,X2):
# code defining f and g "as" defined above
# ...
# code using f and g
S1 = exp(-3.1)*f(X1/1.2)
S2 = exp(-6.1)*g(X1/3.2,X2/1.9)
res = S1 + S2
return res
我希望产品是
ast = language_grammar.parse(code_above) #tree
F = tree.generatefunction()
我得到了plyplus
形式的python语法,并试图减少它(我仍然希望用我的语言设置条件和循环)并且适应,但没有成功,因为这不是我的区域。 / p>
我也觉得我需要在语法中使用所有经典数学函数并将它们组合起来的代数子语法,但我无法给出这个想法的正式定义。