Создание AST для арифметического выражения в Scala - PullRequest
2 голосов
/ 23 октября 2019

Я хотел бы сделать 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 с моим ожидаемым результатом?

...