【问题标题】:How to automatically parenthesize an arbitrary Julia expression如何自动为任意 Julia 表达式加上括号
【发布时间】:2018-04-07 05:45:50
【问题描述】:

给定一个语法有效但在其他方面任意的 Julia 表达式,例如

3 - 4 > 1 & 2 + 2 == 4 | 10 - 5 > 2

2 + 9 - 8 * 8 ^ 7 / 2 == 8 + 8 / 1 ^ 2

...有没有一种方便的方法来将表达式完全括起来,以符合 Julia 的标准解析方式?

一种远远不够的方法:

julia> parse("3 - 4 > 1 & 2+2 == 4 | 10 - 5 > 2")
:(3 - 4 > 1 & 2 + 2 == (4 | 10) - 5 > 2)

julia> parse("2 + 9 - 8 * 8 ^ 7 / 2 == 8 + 8 / 1 ^ 2")
:((2 + 9) - (8 * 8^7) / 2 == 8 + 8 / 1^2)

例如,对于最后一种情况,“全括号”是指:

:(((2 + 9) - ((8 * (8 ^ 7)) / 2)) == (8 + (8 / (1 ^ 2))))

还有别的吗?

【问题讨论】:

    标签: parsing syntax julia parentheses


    【解决方案1】:

    你需要一些代码来递归遍历引用的表达式。

    我在这里做了一个例子,它适用于像+, -这样的中缀操作,如果你使用像f(a)这样的函数调用会失败

    每个表达式都有 3 个字段,headtypargs,但只有 headargs 有用,因为 typ 大部分时间都是 Any。你可以看到这个使用

    expr = :(1+2*3)
    typeof(expr)
    fieldnames(expr)
    expr.head
    expr.args
    
    # full solution
    function bracketit(expr)
      if expr isa Symbol
        return string(expr)
      elseif expr isa Expr
        if expr.head == :call
          return string("(",bracketit(expr.args[2]),expr.args[1],bracketit(expr.args[3]),")")
        elseif expr.head == :comparison
          return string("(",bracketit.(expr.args)...,")")
        end
      else
        return(string(expr))
      end
    end
    
    exprA = :(3 - 4 > 1 & 2 + 2 == 4 | 10 - 5 > 2) 
    bracketit(exprA) #((3-4)>((1&2)+2)==((4|10)-5)>2)
    
    exprB = :(2 + 9 - 8 * 8 ^ 7 / 2 == 8 + 8 / 1 ^ 2) #(((2+9)-((8*(8^7))/2))==(8+(8/(1^2))))
    bracketit(exprB)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2021-09-20
      相关资源
      最近更新 更多