解析GF中的代数表达式(2)

时间:2016-01-06 07:57:49

标签: parsing algebra

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

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

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

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

2 个答案:

答案 0 :(得分:0)

我建议看看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

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

答案 1 :(得分:0)

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

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

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

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