pavone@246: { pavone@247: _binary <- 0 pavone@247: _string <- 1 pavone@247: _int <- 2 pavone@247: _symbol <- 3 pavone@247: _call <- 4 pavone@247: _object <- 5 pavone@247: _sequence <- 6 pavone@247: _assignment <- 7 pavone@247: _lambda <- 8 pavone@246: pavone@246: #{ pavone@246: binary <- { _binary } pavone@246: stringlit <- { _string } pavone@246: intlit <- { _int } pavone@247: sym <- { _symbol } pavone@247: call <- { _call } pavone@247: obj <- { _object } pavone@247: sequence <- { _sequence } pavone@247: assignment <- { _assignment } pavone@247: lambda <- { _lambda } pavone@246: pavone@246: binaryOp:withArgs <- :opname :_left _right { pavone@246: #{ pavone@246: nodeType <- { _binary } pavone@246: left <- _left pavone@246: op <- opname pavone@246: right <- _right pavone@246: pavone@246: leftAssociative? <- { pavone@246: op != "|" pavone@246: } pavone@246: stringIndent <- :indent { pavone@246: (left stringIndent: indent) . " " . op . (right stringIndent: indent) pavone@246: } pavone@246: string <- { pavone@246: stringIndent: "" pavone@246: } pavone@252: fold:with <- :acc :fun { pavone@252: acc <- fun: acc self pavone@252: acc <- _left fold: acc with: fun pavone@252: _right fold: acc with: fun pavone@252: } pavone@246: } pavone@246: } pavone@246: pavone@246: stringLit <- :_val { pavone@246: #{ pavone@246: nodeType <- { _string } pavone@246: val <- _val pavone@246: stringIndent <- :indent { pavone@246: "\"" . val . "\"" pavone@246: } pavone@246: string <- { pavone@246: stringIndent: "" pavone@246: } pavone@252: fold:with <- :acc :fun { pavone@252: fun: acc self pavone@252: } pavone@246: } pavone@246: } pavone@246: pavone@246: intLit:withBits:andBase:signed? <- :_val :_bits :_base :_signed? { pavone@246: #{ pavone@246: nodeType <- { _int } pavone@246: val <- _val pavone@246: base <- _base pavone@246: bits <- _bits pavone@246: signed? <- _signed? pavone@246: stringIndent <- :indent { pavone@246: suffix <- "" pavone@246: if: bits != 32 || (not: signed?) { pavone@246: suffix <- (if: signed? {"i"} else: {"u"}) . bits pavone@246: } pavone@246: if: base = 16 { pavone@246: "0x" . (hex: val) . suffix pavone@246: } else: { pavone@246: if: base = 2 { pavone@246: str <- "0b" pavone@246: i <- bits - 1 pavone@246: printzero <- false pavone@246: while: { i >= 0 } do: { pavone@246: str <- str . (if: (lshift: 1 by: i) and val > 0 { pavone@246: printzero <- true pavone@246: "1" pavone@246: } else: { pavone@246: if: printzero {"0"} else: {""} pavone@246: }) pavone@246: i <- i - 1 pavone@246: } pavone@246: str . suffix pavone@246: } else: { pavone@246: (string: val) . suffix pavone@246: } pavone@246: } pavone@246: } pavone@246: string <- { pavone@246: stringIndent: "" pavone@246: } pavone@252: fold:with <- :acc :fun { pavone@252: fun: acc self pavone@252: } pavone@246: } pavone@246: } pavone@247: pavone@247: symbol <- :_name { pavone@247: #{ pavone@247: nodeType <- { _symbol } pavone@247: name <- _name pavone@247: stringIndent <- :indent { pavone@247: name pavone@247: } pavone@247: string <- { pavone@247: stringIndent: "" pavone@247: } pavone@252: fold:with <- :acc :fun { pavone@252: fun: acc self pavone@252: } pavone@247: } pavone@247: } pavone@247: pavone@247: funcall:withArgs:hasReceiver? <- :_tocall :_args :_receiver? { pavone@247: #{ pavone@252: nodeType <- { _call } pavone@247: tocall <- _tocall pavone@247: args <- _args pavone@247: hasReceiver? <- _receiver? pavone@247: stringIndent <- :indent { pavone@247: argparts <- [] pavone@247: if: (tocall nodeType) = _symbol { pavone@247: argparts <- (tocall name) splitOn: ":" pavone@247: } else: { pavone@247: argparts <- [tocall stringIndent: indent] pavone@247: } pavone@247: curarg <- args pavone@247: str <- "" pavone@247: if: hasReceiver? { pavone@247: str <- ((curarg value) stringIndent: indent) . " " pavone@247: curarg <- curarg tail pavone@247: } pavone@247: foreach: argparts :idx part { pavone@247: str <- str . part . ":" pavone@247: if: (not: (curarg empty?)) { pavone@247: str <- str . " " . ((curarg value) stringIndent: indent) pavone@247: curarg <- curarg tail pavone@247: } pavone@247: } pavone@247: while: { not: (curarg empty?) } do: { pavone@247: str <- str . " " . ((curarg value) stringIndent: indent) pavone@247: curarg <- curarg tail pavone@247: } pavone@247: str pavone@247: } pavone@247: string <- { pavone@247: stringIndent: "" pavone@247: } pavone@252: fold:with <- :acc :fun { pavone@252: acc <- fun: acc self pavone@252: _args fold: acc with: :acc el { pavone@252: fun: acc el pavone@252: } pavone@252: } pavone@247: } pavone@247: } pavone@247: pavone@247: object <- :_messages { pavone@247: #{ pavone@247: nodeType <- { _object } pavone@247: messages <- _messages pavone@247: stringIndent <- :indent { pavone@247: nextindent <- "\t" . indent pavone@247: (messages fold: "#{" with: :acc el { pavone@247: acc . "\n" . nextindent . (el stringIndent: nextindent) pavone@247: }) . "\n" . indent . "}" pavone@247: } pavone@247: string <- { pavone@247: stringIndent: "" pavone@247: } pavone@252: fold:with <- :acc :fun { pavone@252: acc <- fun: acc self pavone@252: messages fold: acc with: :acc el { pavone@252: fun: acc el pavone@252: } pavone@252: } pavone@247: } pavone@247: } pavone@247: pavone@247: seqLit:array? <- :_els :_array? { pavone@247: #{ pavone@247: nodeType <- { _sequence } pavone@247: els <- _els pavone@247: array? <- _array? pavone@247: stringIndent <- :indent { pavone@247: nextIndent <- "\t" . indent pavone@247: (els fold: (if: array? {"#["} else: {"["}) with: :acc el { pavone@247: acc . "\n" . nextIndent . (el stringIndent: nextIndent) pavone@247: }) . "\n" . indent . "]" pavone@247: } pavone@247: string <- { pavone@247: stringIndent: "" pavone@247: } pavone@252: fold:with <- :acc :fun { pavone@252: acc <- fun: acc self pavone@252: els fold: acc with: :acc el { pavone@252: fun: acc el pavone@252: } pavone@252: } pavone@247: } pavone@247: } pavone@247: pavone@247: assign:to <- :_expr :_sym { pavone@247: #{ pavone@247: nodeType <- { _assignment } pavone@247: assign <- _expr pavone@247: to <- _sym pavone@247: stringIndent <- :indent { pavone@247: (to stringIndent: indent) . " <- " . (assign stringIndent: indent) pavone@247: } pavone@247: string <- { pavone@247: stringIndent: "" pavone@247: } pavone@252: fold:with <- :acc :fun { pavone@252: acc <- fun: acc self pavone@252: acc <- fun: acc _sym pavone@252: fun: acc _expr pavone@252: } pavone@247: } pavone@247: } pavone@247: pavone@247: lambda:withArgs <- :_exprs :_args { pavone@247: #{ pavone@247: nodeType <- { _lambda } pavone@247: args <- _args pavone@247: expressions <- _exprs pavone@247: stringIndent <- :indent { pavone@247: argStr <- args join: " " pavone@247: if: (argStr length) > 0 { pavone@247: argStr <- argStr . " " pavone@247: } pavone@247: nextIndent <- "\t" . indent pavone@247: (expressions fold: argStr . "{" with: :acc el { pavone@247: acc . "\n" . nextIndent . (el stringIndent: nextIndent) pavone@247: }) . "\n" . indent . "}" pavone@247: } pavone@247: string <- { pavone@247: stringIndent: "" pavone@247: } pavone@252: fold:with <- :acc :fun { pavone@252: acc <- fun: acc self pavone@252: expressions fold: acc with: :acc el { pavone@252: fun: acc el pavone@252: } pavone@252: } pavone@247: } pavone@247: } pavone@246: } pavone@246: }