【问题标题】:Expression Evaluation using combinators in Haskell在 Haskell 中使用组合器进行表达式评估
【发布时间】:2021-10-24 15:18:26
【问题描述】:

我正在尝试在 Hakell 中创建表达式评估器:

data Parser i o
  = Success o [i]
  | Failure String [i]
  | Parser
      {parse :: [i] -> Parser i o}

data Operator = Add | Sub | Mul | Div | Pow

data Expr
  = Op Operator Expr Expr
  | Val Double

expr :: Parser Char Expr
expr = add_sub
  where
    add_sub =  calc Add '+' mul_div  <|>  calc Sub '-' mul_div  <|>  mul_div
    mul_div =  calc Mul '*' pow  <|>  calc Div '/' pow  <|>  pow
    pow     =  calc Pow '^' factor  <|>  factor
    factor  =  parens  <|>  val
    val     =  Val  <$>  parseDouble
    parens  =  parseChar '('  *>  expr  <*  parseChar ')'
    calc c o p =  Op c  <$>  (p  <*  parseChar o)  <*>  p

我的问题是,当我尝试使用具有相同优先级的两个运算符(例如 1+1-1)评估表达式时,解析器将失败。

我怎么能说add_sub 可以是另外两个add_subs 之间的操作而不创建无限循环?

【问题讨论】:

  • 你试过add_sub = calc Add '+' add_sub &lt;|&gt; calc Sub '-' add_sub &lt;|&gt; mul_div吗?同样,mul_div = calc Mul '*' mul_div &lt;|&gt; calc Div '/' mul_div &lt;|&gt; pow 等。
  • (我假设这里有一个像 parsec 这样的 LL 解析器组合器。如果它是更强大的东西,我可能会错在这里)calc 恰好使用了两次 p。同样p 我们得到类似(伪代码)addsub = muldiv + muldiv | .... 而不是 addsub = muldiv + addsub | ... 的东西。这不是唯一的问题:您的语法不是 LL,因为例如muldiv + .... | muldiv - ... | ... 不能在 LL 中处理,因为这两个选项都以相同的前缀开头——你可能应该重构你的语法。
  • @WillNess 我试过这个,它会创建一个无限循环
  • Parser的定义是什么?和Expr?
  • @chi 感谢这个解释,我在 calc 的定义中将第二个 p 更改为 expr 似乎已经解决了问题

标签: parsing haskell evaluation


【解决方案1】:

正如@chi 所解释的,问题在于calc 使用了两次p,这不允许像muldiv + .... | muldiv - ... | ... 这样的模式

我刚刚把calc的定义改成了:

calc c o p p2 = Op c <$> (p <* parseChar o) <*> p2

其中 p2 是当前优先级(mul_div 的定义中的mul_div

它工作得更好,但计算的顺序是倒退的: 2/3/4 被解析为 2/(3/4) 而不是 (2/3)/4

【讨论】:

  • 有几件事要测试,但其中之一是确保1-2+3 不被解析为1-(2+3)。这是许多语法的共同问题。您的解决方案可能并不完全正确。
  • 看来你的语法会有像add_sub ::= mul_div + exprmul_div ::= pow * expr这样的产生式。这看起来根本不正确。
  • 在运行了更多测试之后,这肯定是不正确的,但是我不确定我能做些什么来修复它,我是否必须重新考虑 eval 或者是否有一个简单的解决方案我失踪了?
猜你喜欢
  • 2010-12-06
  • 2011-01-27
  • 2013-10-16
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2010-12-31
  • 1970-01-01
相关资源
最近更新 更多