我想使用 Scala 的 fastparse 为算术表达式制作 AST。对我来说,算术表达式就像:
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?