私はもう試した
/* 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 ではありません)))