如何获得左侧assoc命令运营商使用Scala组合子?(How to get left assoc

2019-10-17 22:17发布

我试过了

/* inside RegexParser class */
def exp : Parser[Exp] = 
  term~addop_chain ^^ {case l~ThenAdd(optype,r) => AritOp(l,optype,r)}

def addop_chain : Parser[Exp] = 
  ("+"|"-")~term~addop_chain ^^ {case sym~term~ThenAdd(optype,r) => ThenAdd(sym, AritOp(term,optype,r)) }  |
  ("+"|"-")~term ^^ {case sym~term => ThenAdd(sym, term)}

def term = /* right now, only int literal. code unrelevant */

/* Case classes for storing: */
case class ThenAdd(sym: String, r: Exp)
case class AritOp(l: Exp, sym: String, r: Exp)

其工作原理!但为右assoc命令(不左缔合),如5+(3-2),这不是我想要的。

我想是这样的:

5+3-2

应该成为

AritOp(AritOp(5,+,3), -, 2)

(左缔合)不过这种感觉几乎不可能没有(合适?)左递归。 我能做什么?

(constriant:我不能用rep, repsep, opt 。(我做的任务,所以语法应为BNF地(即不EBNF)))

文章来源: How to get left assoc operators with scala combinators?