用于生成python函数的小语言的语法(使用plyplus)

时间:2017-11-13 17:17:05

标签: python grammar yacc ply python-plyplus

我设计了一种玩具语言:

# 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>

我也觉得我需要在语法中使用所有经典数学函数并将它们组合起来的代数子语法,但我无法给出这个想法的正式定义。

0 个答案:

没有答案