diff code/lmc.tp @ 2:71e8d638da5c

Add operator support to lmc
author Michael Pavone <pavone@retrodev.com>
date Fri, 25 Jul 2014 09:32:12 -0700
parents 68d1447bfdbe
children a9a2ad99adfb
line wrap: on
line diff
--- a/code/lmc.tp	Fri Jul 25 09:13:09 2014 -0700
+++ b/code/lmc.tp	Fri Jul 25 09:32:12 2014 -0700
@@ -1,11 +1,15 @@
 {
+	error <- :msg {
+		(file stderr) write: "Error - " . msg . "\n"
+	}
+
 	_exprHandlers <- dict hash
 	
 	compileExpr <- :expr {
 		_exprHandlers ifget: (expr nodeType) :handler {
 			handler: expr
 		} else: {
-			print: "Unhandled node type " . (expr nodeType) . "\n"
+			error: "Unhandled node type " . (expr nodeType)
 		}
 	}
 	
@@ -29,6 +33,31 @@
 			count <- count - 1
 		}
 	}
+	
+	_opNames <- dict hash
+	_opNames set: "+" "ADD"
+	_opNames set: "-" "SUB"
+	_opNames set: "*" "MUL"
+	_opNames set: "/" "DIV"
+	_opNames set: "|" "CONS"
+	_opNames set: "=" "CEQ"
+	_opNames set: ">" "CGT"
+	_opNames set: ">=" "CGTE"
+	
+	_exprHandlers set: (ast binary) :expr {
+		if: (expr op) = "|" {
+			compileExpr: (expr left)
+			compileExpr: (expr right)
+		} else: {
+			compileExpr: (expr right)
+			compileExpr: (expr left)
+		}
+		_opNames ifget: (expr op) :inst {
+			print: "  " . inst . "\n"
+		} else: {
+			error: "operator " . (expr op) . " is not supported"
+		}
+	}
 	#{
 		compile <- :code {
 			res <- parser top: code
@@ -53,7 +82,7 @@
 					}
 				}
 			} else: {
-				print: "Parse failed!\n"
+				error: "Parse failed!"
 			}
 		}