在python中使用自定义语法解析类实例方法

在python中使用自定义语法解析类实例方法,python,parsing,grammar,Python,Parsing,Grammar,所以我有一个问题要解决,我有两个基本类CMIX和C,其中CMIX包含C的实例列表:[C1,C2,….Cn],它将由自定义语法操作(字符串值运算符-“+”,“-”,“,”(“,”),但从某种意义上说,它可以在操作中嵌入额外的逻辑。例如,[C1+C2+…+Cn]组合将为每个C1、C2、….Cn调用C.foo(),然后添加这些结果。类似地,带有对象集的语法术语组合,例如:[C1”“”(“C1”+“C2”*(“C2”+“C2”)”)将调用C1.foo(),C2.foo(),然后根据正常的数学计算组合这些

所以我有一个问题要解决,我有两个基本类CMIXC,其中CMIX包含C的实例列表:[C1,C2,….Cn],它将由自定义语法操作(字符串值运算符-“+”,“-”,“,”(“,”),但从某种意义上说,它可以在操作中嵌入额外的逻辑。例如,[C1+C2+…+Cn]组合将为每个C1、C2、….Cn调用C.foo(),然后添加这些结果。类似地,带有对象集的语法术语组合,例如:[C1”“”(“C1”+“C2”*(“C2”+“C2”)”)将调用C1.foo(),C2.foo(),然后根据正常的数学计算组合这些结果。最初,我只想处理像*+()这样的基本数学运算,但希望能够在以后对自定义(非数学)术语进行扩展

类功能的基本代表性草图如下(这主要是概念性的;尤其是CMIX,因为我不确定解析语法逻辑的最佳方式)

例如,假设我们已经定义了全局语法运算符

+表示如果C.check_location()=“lost”,则返回-100*C.my_val(val),否则只返回C.m

语法是C1+C2,C1.location=“lost”,C2.location=“antarctica”,那么CMIX.my_val(20)的计算结果是:-100*C1.my_val(20)+C2.my_val(20)

在python中有没有一种简单的方法可以做到这一点?或者可能有一个轻量级的库,允许创建这样的计算规则。例如,我发现这直接应用于数据类型,而它应该应用于对象层,应用自定义逻辑,然后执行标准的数学语法操作顺序

任何尝试这样做的方向都是非常感谢的!
关于

Pyparsing使定义中缀符号解析器变得非常容易,并且可以在类中包装运算符和操作数以执行标准或自定义行为。请参阅此问题及其基于Pyparsing的解决方案:

虽然您可能正在寻找运算符重载,但并不清楚您在问什么。此“语法”在哪里来自,你为什么称它为语法?它似乎与语法分析或语法没有太多关系。听起来你可以只使用“语法”是一个函数。@user2357112一种语法,从某种意义上说,一个人有一个定义的操作集,每个操作集对同一项目类型执行相同的任务。这不是语法吗?语法是确定某些事物如何相互组合的一组规则。在这种情况下,该事物是一个类,结构化规则集是数学运算s位于另一层的顶部(一致)逻辑。函数只是语法的一部分。数学评估有它自己的语法。我想知道是否存在一个现有的解决方案,这样我就不会重新发明轮子。也许@pvg这是一个选项,我现在可能不得不使用它,但我更喜欢不一定局限于现有运算符的东西。你看过吗?
class CMIX():
   self.C_list = []  # List of instances of type C
   self.grammar = []
   def my_val(self, val):
      ## call every .foo(val=val) in self.C_list, and apply the grammar rules accordingly.

class C():
   def __init__(self, location):
      self.location= location
   def my_val(self, val):
      return val * 2 
   def check_location(self):
      if self.location == "antarctica":
         return "cold"
      elif self.location == "moon":
         return "bouncy"
      else:
         return "lost"