Mercurial > repos > tabletprog
diff modules/ast.tp @ 247:b76f683d076e
Finish moving ast object definitions to a separate ast module
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 08 Jan 2014 19:27:19 -0800 |
parents | 8c81afd6d2d3 |
children | 004946743678 |
line wrap: on
line diff
--- a/modules/ast.tp Mon Jan 06 19:41:35 2014 -0800 +++ b/modules/ast.tp Wed Jan 08 19:27:19 2014 -0800 @@ -1,13 +1,24 @@ { - _binary <- 0 - _string <- 1 - _int <- 2 + _binary <- 0 + _string <- 1 + _int <- 2 + _symbol <- 3 + _call <- 4 + _object <- 5 + _sequence <- 6 + _assignment <- 7 + _lambda <- 8 #{ binary <- { _binary } stringlit <- { _string } intlit <- { _int } - + sym <- { _symbol } + call <- { _call } + obj <- { _object } + sequence <- { _sequence } + assignment <- { _assignment } + lambda <- { _lambda } binaryOp:withArgs <- :opname :_left _right { #{ @@ -80,5 +91,123 @@ } } } + + symbol <- :_name { + #{ + nodeType <- { _symbol } + name <- _name + stringIndent <- :indent { + name + } + string <- { + stringIndent: "" + } + } + } + + funcall:withArgs:hasReceiver? <- :_tocall :_args :_receiver? { + #{ + tocall <- _tocall + args <- _args + hasReceiver? <- _receiver? + stringIndent <- :indent { + argparts <- [] + if: (tocall nodeType) = _symbol { + argparts <- (tocall name) splitOn: ":" + } else: { + argparts <- [tocall stringIndent: indent] + } + curarg <- args + str <- "" + if: hasReceiver? { + str <- ((curarg value) stringIndent: indent) . " " + curarg <- curarg tail + } + foreach: argparts :idx part { + str <- str . part . ":" + if: (not: (curarg empty?)) { + str <- str . " " . ((curarg value) stringIndent: indent) + curarg <- curarg tail + } + } + while: { not: (curarg empty?) } do: { + str <- str . " " . ((curarg value) stringIndent: indent) + curarg <- curarg tail + } + str + } + string <- { + stringIndent: "" + } + } + } + + object <- :_messages { + #{ + nodeType <- { _object } + messages <- _messages + stringIndent <- :indent { + nextindent <- "\t" . indent + (messages fold: "#{" with: :acc el { + acc . "\n" . nextindent . (el stringIndent: nextindent) + }) . "\n" . indent . "}" + } + string <- { + stringIndent: "" + } + } + } + + seqLit:array? <- :_els :_array? { + #{ + nodeType <- { _sequence } + els <- _els + array? <- _array? + stringIndent <- :indent { + nextIndent <- "\t" . indent + (els fold: (if: array? {"#["} else: {"["}) with: :acc el { + acc . "\n" . nextIndent . (el stringIndent: nextIndent) + }) . "\n" . indent . "]" + } + string <- { + stringIndent: "" + } + } + } + + assign:to <- :_expr :_sym { + #{ + nodeType <- { _assignment } + assign <- _expr + to <- _sym + stringIndent <- :indent { + (to stringIndent: indent) . " <- " . (assign stringIndent: indent) + } + string <- { + stringIndent: "" + } + } + } + + lambda:withArgs <- :_exprs :_args { + #{ + nodeType <- { _lambda } + args <- _args + expressions <- _exprs + stringIndent <- :indent { + argStr <- args join: " " + if: (argStr length) > 0 { + argStr <- argStr . " " + } + nextIndent <- "\t" . indent + (expressions fold: argStr . "{" with: :acc el { + acc . "\n" . nextIndent . (el stringIndent: nextIndent) + }) . "\n" . indent . "}" + } + string <- { + stringIndent: "" + } + } + } } }