Как получить левые ассоциированные операторы с помощью комбинаторов scala?

Я пробовал

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

0 ответов

Другие вопросы по тегам