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: ""
+				}
+			}
+		}
 	}
 }