1

私はもう試した

/* 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)

しかし、右連想 (左連想ではない)、たとえば 5+(3-2) であり、これは私が望むものではありません。

私が欲しいのは次のようなものです:

5+3-2

なるべき

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

(左連想)しかし、これは(適切な?)左再帰なしではほとんど不可能に思えます。私に何ができる?

(制約: 使用できませんrep, repsep, opt(割り当てを行っているため、文法は可能な限り BNF にする必要があります (つまり、 EBNF ではありません)))

4

0 に答える 0