changeset 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
files code/lmc.tp code/test.lm
diffstat 2 files changed, 32 insertions(+), 3 deletions(-) [+]
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!"
 			}
 		}
 
--- a/code/test.lm	Fri Jul 25 09:13:09 2014 -0700
+++ b/code/test.lm	Fri Jul 25 09:32:12 2014 -0700
@@ -4,6 +4,6 @@
 	}
 	
 	main <- {
-		[1 2 3 4]
+		1 | [(2 + 32 * 8) 3 4]
 	}
 }