具有优先级感知的美化打印

主要观点:

  • 关于解析和美化打印进行讨论后,可能将相关内容集成到[Scrapscript]中。
  • 有一些数学表达式需要以中缀形式打印,如Add(Const(1), Mul(Const(2), Const(3)))
  • 实现了一个pretty函数用于美化打印表达式,目前存在一些问题,如括号使用过多等。
  • 通过定义操作符的优先级PREC和处理结合性,改进了pretty函数,使其能更准确地打印表达式,且避免了一些不必要的括号。

关键信息:

  • 定义了ExprConstBinary等类来表示表达式结构。
  • OPS字典用于存储操作符及其对应的符号。
  • pretty函数通过匹配表达式类型进行不同的处理,递归调用自身处理子表达式。
  • PREC字典存储操作符的优先级、结合性等信息,用于决定是否添加括号。

重要细节:

  • 对于加法和乘法,递归调用pretty时传递当前操作符的优先级减一。
  • 对于左结合的减法和除法,递归调用pretty时对右子表达式保持相同的优先级。
  • 对于右结合的指数运算,递归调用pretty时对右子表达式的优先级减一。
  • River 为其 OCaml 中的简单类型 lambda 演算编译器写了一篇后续文章。
  • 提到避免了如第二个 StackOverflow 答案中提到的“作弊”行为,即二进制操作符处理函数不再尝试自行添加括号。
阅读 4
0 条评论