【问题标题】:parsing algebraic expressions in GF(2)在 GF(2) 中解析代数表达式
【发布时间】:2016-04-10 06:02:31
【问题描述】:

我会写一个函数来解析GF(2)中2个代数表达式的乘法,即表达式中的任何变量只取2个可能的值0或1,所以a^2 = a,(0^2 = 0 , 1^2 = 1)

例如,如果我们在 GF(2) 中展开 (a+b)*(a+c),我们应该得到 ​​p>

(a + b)*(a + c) = a^2 + a*b + a*c + b*c = a + a*b + a*c + b*c.

但是,我不确定如何开始使用字符串解析 2 个代数表达式。任何建议/帮助表示赞赏。谢谢!

【问题讨论】:

  • 尽管您显然有一个特殊的目的,但您的示例中没有任何内容实际上使用了这些术语将通过 GF(2) 来理解的事实。据我了解,您的意思是在字段上解析表达式。
  • @Codor:你的理解是正确的!为了更好地理解,我更新了我的示例。感谢您的关注。

标签: parsing algebra


【解决方案1】:

我建议您看看 Alex Warth 的 OMeta 和/或 Lucas Rengli 的 PetitParser。两者都是编写解析器的优秀框架。第一个用于 JS,第二个用于 Smalltalk。

这里有一些初始代码行,展示了如何在 PetitParser 中编写解析器。每个片段都是您自己的PPCompositeParser 子类的方法。

constant
    ˆ$0 asParser / $1 asParser

variable
    ^#letter asParser

timesOp
    ^#blank asParser star , $* asParser, #blank asParser star

sumOp
    ^#blank asParser star, $* asParser, #blank asParser star

element
    ^self constant / self variable

term
   ^self element , (self timesOp , self element) star

等等

我并不是说这是微不足道的。我只是说这是我要开始的地方。另请注意,一旦您的语法到位,您可能希望对其进行子类化,以便生成更合适的产生式等。

【讨论】:

    【解决方案2】:

    为大型复杂语言编写解析器可能很困难。但是为代数表达式(GF(2) 或其他)编写解析器非常容易。 请参阅我关于如何轻松编写此类解析器的 SO 答案:Is there an alternative for flex/bison that is usable on 8-bit embedded systems?

    GF(2) 位是关于这种公式含义的语义解释。解析完全没有关系,这纯粹是关于语法。 当你想解释公式时,意义就起作用了。 在某些时候,您可能希望使用变量的值评估表达式。为此,您必须将公式捕获为数据结构(通常称为(抽象)语法树),然后遍历该树以计算所需的结果。该链接还讨论了如何做到这一点。

    如果您想象征性地操纵公式,那么您将处于完全不同的球赛中。解析仍然很容易,但公式操作并不容易,您需要使用旨在执行此类符号操作的工具;他们通常定义自己的解析机制(并使其易于使用)以确保可以操纵捕获的解析。当然,您必须定义符号操作的规则

    您可以在Symbolic Algebra with a program transformation system 看到如何编写非常接近您的需求的示例。 (这是我公司开发的工具)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2013-01-03
      相关资源
      最近更新 更多