gpt4 book ai didi

pretty-print - 使用尽可能少的括号的 pretty-print 表达式?

转载 作者:行者123 更新时间:2023-12-03 22:36:59 27 4
gpt4 key购买 nike

我的问题:在没有多余括号的情况下漂亮地打印表达式的最干净的方法是什么?

我有以下 lambda 表达式的表示:

Term ::= Fun(String x, Term t)
| App(Term t1, Term t2)
| Var(String x)

按照惯例 App是左结合的,即 a b c被解释为 (a b) c和函数体尽可能向右拉伸(stretch),即 λ x. x y被解释为 λ x. (x y) .

我有一个很好的解析器,但现在 我想要一台 pretty-print .这是我目前拥有的(伪scala):
term match {
case Fun(v, t) => "(λ %s.%s)".format(v, prettyPrint(t))
case App(s, t) => "(%s %s)".format(prettyPrint(s), prettyPrint(t))
case Var(v) => v
}

上面的打印机总是放 ( )围绕表达式(原子变量除外)。因此对于 Fun(x, App(Fun(y, x), y))它产生
(λ x.((λ y.x) y))

我想拥有
λ x.(λ y.x) y

最佳答案

在这里,我将使用一个简单的语法来处理中缀表达式,其关联性和优先级由以下语法定义,其运算符按优先级升序排列

E -> E + T | E - T | T     left associative
T -> T * F | T / F | F left associative
F -> G ^ F | G right associative
G -> - G | ( E ) | NUM

给定一个抽象语法树 (AST),我们将 AST 转换为仅具有必要括号的字符串,如下面的伪代码中所述。当我们递归地下降树以确定何时需要括号时,我们检查相对优先级和关联性。请注意,所有在表达式周围加上括号的决定都必须在父节点中做出。
toParenString(AST) {
if (AST.type == NUM) // simple atomic type (no operator)
return toString(AST)
else if (AST.TYPE == UNARY_MINUS) // prefix unary operator
if (AST.arg.type != NUM AND
precedence(AST.op) > precedence(AST.arg.op))
return "-(" + toParenString(AST.arg) + ")"
else
return "-" + toParenString(AST.arg)
else { // binary operation
var useLeftParen =
AST.leftarg.type != NUM AND
(precedence(AST.op) > precedence(AST.leftarg.op) OR
(precedence(AST.op) == precedence(AST.leftarg.op) AND
isRightAssociative(AST.op)))

var useRightParen =
AST.rightarg.type != NUM AND
(precedence(AST.op) > precedence(AST.rightarg.op) OR
(precedence(AST.op) == precedence(AST.rightarg.op) AND
isLeftAssociative(AST.op)))

var leftString;
if (useLeftParen) {
leftString = "(" + toParenString(AST.leftarg) + ")"
else
leftString = toParenString(AST.leftarg)

var rightString;
if (useRightParen) {
rightString = "(" + toParenString(AST.rightarg) + ")"
else
rightString = toParenString(AST.rightarg)

return leftString + AST.op + rightString;
}
}

关于pretty-print - 使用尽可能少的括号的 pretty-print 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6277747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com