diff modules/ast.tp @ 246:8c81afd6d2d3

Refactor some of the AST node object constructors into a separate AST module
author Michael Pavone <pavone@retrodev.com>
date Mon, 06 Jan 2014 19:41:35 -0800
parents
children b76f683d076e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/ast.tp	Mon Jan 06 19:41:35 2014 -0800
@@ -0,0 +1,84 @@
+{
+	_binary <- 0
+	_string <- 1
+	_int    <- 2
+
+	#{
+		binary <- { _binary }
+		stringlit <- { _string }
+		intlit <- { _int }
+
+
+		binaryOp:withArgs <- :opname :_left _right {
+			#{
+				nodeType <- { _binary }
+				left <- _left
+				op <- opname
+				right <- _right
+
+				leftAssociative? <- {
+					op != "|"
+				}
+				stringIndent <- :indent {
+					(left stringIndent: indent) . " " . op . (right stringIndent: indent)
+				}
+				string <- {
+					stringIndent: ""
+				}
+			}
+		}
+
+		stringLit <- :_val {
+			#{
+				nodeType <- { _string }
+				val <- _val
+				stringIndent <- :indent {
+					"\"" . val . "\""
+				}
+				string <- {
+					stringIndent: ""
+				}
+			}
+		}
+
+		intLit:withBits:andBase:signed? <- :_val :_bits :_base :_signed? {
+			#{
+				nodeType <- { _int }
+				val <- _val
+				base <- _base
+				bits <- _bits
+				signed? <- _signed?
+				stringIndent <- :indent {
+					suffix <- ""
+					if: bits != 32 || (not: signed?) {
+						suffix <- (if: signed? {"i"} else: {"u"}) . bits
+					}
+					if: base = 16 {
+						"0x" . (hex: val) . suffix
+					} else: {
+						if: base = 2 {
+							str <- "0b"
+							i <- bits - 1
+							printzero <- false
+							while: { i >= 0 } do: {
+								str <- str . (if: (lshift: 1 by: i) and val > 0 {
+									printzero <- true
+									"1"
+								} else: {
+									if: printzero {"0"} else: {""}
+								})
+								i <- i - 1
+							}
+							str . suffix
+						} else: {
+							(string: val) . suffix
+						}
+					}
+				}
+				string <- {
+					stringIndent: ""
+				}
+			}
+		}
+	}
+}