【问题标题】:parsing class instance methods with custom grammar in python在python中使用自定义语法解析类实例方法
【发布时间】:2017-06-04 01:42:57
【问题描述】:

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

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

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"

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

+ 表示如果 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。我的_val(20)

在 python 中是否有现有的简单方法可以做到这一点?或者也许是一个轻量级库,允许创建此类评估规则。例如,我发现了https://github.com/pydata/numexpr,但这直接适用于数据类型,而它应该适用于对象层,应用自定义逻辑,然后执行标准的数学语法操作顺序。

非常感谢任何尝试这样做的方向! 问候

【问题讨论】:

  • 虽然您可能正在寻找的是运算符重载,但您并不清楚您在问什么。
  • 这个“语法”从何而来,为什么称它为语法?它似乎与解析或语法没有太大关系。听起来你可以让“语法”成为一个函数。
  • @user2357112 一种语法,它定义了一组操作,每个操作对相同的项目类型执行相同的任务。这难道不是语法吗?一组规则,确定某些事物如何相互组合。在这种情况下,事物是一个类,结构化规则集是在另一层(一致)逻辑之上的数学运算。函数只是语法的一部分。数学评估有自己的语法。我想知道是否有现有的解决方案,所以我不会重新发明轮子。也许fdik.org/pyPEG
  • @pvg 这是一个选项,我现在可能不得不使用它,但我更喜欢不一定限于现有运营商的东西
  • 你看过ply吗?

标签: python parsing grammar


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 2020-10-24
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多