Я хотел бы сделать AST для арифметического выражения, используя fastparse из Scala. Для меня арифметическое выражение выглядит так:
var_name := value; // value can be an integer, or a whole expression
На данный момент у меня есть следующие парсеры:
def word[_:P] = P((CharIn("a-z") | CharIn("A-Z") | "_").rep(1).!)
def digits[_ : P] = P(CharIn("0-9").rep.!)
def div_mul[_: P] = P( digits~ space.? ~ (("*" | "/").! ~ space.? ~/ digits).rep ).map(eval)
def add_sub[_: P] = P( div_mul ~ space.? ~ (("+" | "-").! ~ space.? ~/ div_mul).rep ).map(eval)
def expr[_: P]= P( " ".rep ~ add_sub ~ " ".rep ~ End )
def var_assig[_:P] = P(word ~ " " ~ ":=" ~ " " ~ (value | expr) ~ ";")
Я хочу создать AST для арифметического выражения (например, 2 + 3 * 2)).
Ожидаемый результат: Assignment[2,plus[mult,[3,2]]] // symbol[left, right]
Мои вопросы:
Что должно быть похоже на Tree
класс / объект, если оннеобходимо, потому что я хочу оценить этот результат? Этот класс я буду использовать для анализа остатка (если время).
Что должно быть похоже на функцию eval
, которая принимает на вход строку или Seq [String] ивернуть AST с моим ожидаемым результатом?