diff parser_old.rhope @ 30:914ad38f9b59

Compiler now works for some simple programs
author Mike Pavone <pavone@retrodev.com>
date Mon, 28 Sep 2009 19:42:33 -0400
parents 8b2b3f4a2a58
children 3498713c3dc9
line wrap: on
line diff
--- a/parser_old.rhope	Sat Jun 27 01:50:33 2009 -0400
+++ b/parser_old.rhope	Mon Sep 28 19:42:33 2009 -0400
@@ -1,6 +1,4 @@
-Import extendlib.rhope
-
-
+Import nworker.rhope
 
 Blueprint Parser
 {
@@ -158,79 +156,74 @@
 	out <- [[[[Build["Worker Node"]]Name <<[name]]Params <<[params]]Assignments <<[New@List[]]]Blocks <<[New@List[]]
 }
 
-Add List Helper[inlist,worker,program,key,parse worker,refs:out,worker,refs]
+Add List Helper[inlist,worker,program,key,parse worker,refs:out list,out worker,out refs]
 {
-	Print[Type Of[inlist]]
-	Print["Add List Helper"]
 	,nextworker,nextrefs <- [[inlist]Index[key]]Add to Worker[worker, program, parse worker, refs]
 	{ nextlist <- [inlist]Set[key, ~] }
 	[inlist]Next[key]
 	{
-		Print["Next!"]
-		list,worker,refs <- Add List Helper[nextlist, nextworker, program, ~, parse worker, nextrefs]
+		out list,out worker,out refs <- Add List Helper[nextlist, nextworker, program, ~, parse worker, nextrefs]
 	}{
-		Print["Done!"]
-		list <- Val[nextlist]
-		worker <- Val[nextworker]
-		refs <- Val[nextrefs]
+		out list <- Val[nextlist]
+		out worker <- Val[nextworker]
+		out refs <- Val[nextrefs]
 	}
 }
 
-Add List to Worker[list,worker,program,parse worker,refs:list,worker,refs]
+Add List to Worker[list,worker,program,parse worker,refs:out list,out worker,out refs]
 {
-	Print["Add List to Worker"]
-	Print[Type Of[list]]
-	{
 	[list]First
 	{
-		list,worker,refs <- Add List Helper[list, worker, program, ~, parse worker, refs]
-		{ Print["Done!!"] }
+		out list,out worker,out refs <- Add List Helper[list, worker, program, ~, parse worker, refs]
 	}{
-		list <- list
-		worker <- worker
-		refs <- refs
-	}
+		out list <- list
+		out worker <- worker
+		out refs <- refs
 	}
 }
 
-_Add Blocks to Worker[blocks,worker,program,parse worker,key,refs:blocks,worker,refs]
+_Add Blocks to Worker[blocks,worker,program,parse worker,key,refs:out blocks,out worker,out refs]
 {
 	block, next worker, nextrefs <- Add List to Worker[[blocks]Index[key], worker, program, parse worker, refs]
 	next blocks <- [blocks]Set[key, block]
 	[blocks]Next[key]
 	{
-		blocks,worker,refs <- _Add Blocks to Worker[next blocks, next worker, program, parse worker, ~, nextrefs]
+		out blocks,out worker,out refs <- _Add Blocks to Worker[next blocks, next worker, program, parse worker, ~, nextrefs]
 	}{
-		blocks <- Val[next blocks]
-		worker <- Val[next worker]
-		refs <- Val[nextrefs]
+		out blocks <- Val[next blocks]
+		out worker <- Val[next worker]
+		out refs <- Val[nextrefs]
 	}
 }
 
-Add Blocks to Worker[blocks,worker,program,parse worker,refs:blocks,worker,refs]
+Add Blocks to Worker[blocks,worker,program,parse worker,refs:out blocks,out worker,out refs]
 {
+	Print["Add Blocks to Worker"]
+	{
 	[blocks]First
 	{
-		blocks, worker, refs <- _Add Blocks to Worker[blocks, worker, program, parse worker, ~, refs]
+		out blocks, out worker, out refs <- _Add Blocks to Worker[blocks, worker, program, parse worker, ~, refs]
 	}{
-		blocks <- blocks
-		worker <- worker
-		refs <- refs
+		out blocks <- blocks
+		out worker <- worker
+		out refs <- refs
+	}
 	}
 }
 
-Add to Worker@Worker Node[node,worker,program,parse worker,refs:node,worker,refs]
+Add to Worker@Worker Node[node,worker,program,parse worker,refs:out node,out worker,out refs]
 {
 	[program]Find Worker[[node]Name >>]
 	{
 		after worker <- [worker]Add Worker Call[~] {}
 		{
+			//Print[[[[node]Name >>]Append[" has index "]]Append[~]]
 			assignment refs <- Fold[[["Assignment Save Reference"]Set Input[3, parse worker]]Set Input[4, ~], refs, [node]Assignments >>]
 			[node]Index <<[~]
 			{ 
 				params list, params worker, params refs <- Add List to Worker[[~]Params >>, after worker, program, parse worker, assignment refs]
-				block list, worker, refs <- Add Blocks to Worker[[~]Blocks >>, params worker, program, parse worker, params refs]
-				node <- [[~]Params <<[params list]]Blocks <<[block list]
+				block list, out worker, out refs <- Add Blocks to Worker[[~]Blocks >>, params worker, program, parse worker, params refs]
+				out node <- [[~]Params <<[params list]]Blocks <<[block list]
 			}
 		}
 	}{
@@ -240,37 +233,87 @@
 
 Add Multi Wire[worker,ref,junk,end index,input num:out]
 {
+	Print[
+		[[[[[[["Wire: "
+			]Append[ [ref]Index >> ]
+			]Append[","]
+			]Append[ [ref]Output Number >>]
+			]Append[" to "]
+			]Append[end index]
+			]Append[","]
+			]Append[input num]
+		]
 	out <- [worker]Add Wire[[ref]Index >>, [ref]Output Number >>, end index, input num]
+	{ Print["Wire added"] }
 }
 
 Add Param Wire[worker,param,input num,end index,blocks,parse worker,assignments:out]
 {
+	Print[[[["param type: "
+		]Append[Type Of[param]]
+		]Append[", dest index:"]
+		]Append[end index]]
+	{
 	param worker, start index, output num <- [param]Add Wires[worker, blocks, parse worker, assignments] {}
 	{
+		Print[
+		[[[[[[["Wire: "
+			]Append[start index ]
+			]Append[","]
+			]Append[output num]
+			]Append[" to "]
+			]Append[end index]
+			]Append[","]
+			]Append[input num]
+		] {
 		out <- [param worker]Add Wire[start index, output num, end index, input num]
+		{ Print["wire done, Add Param Wire"] }
+		}
 	}{}{
 		out <- Fold[[["Add Multi Wire"]Set Input[3, end index]]Set Input[4, input num], param worker, ~]
 	}
+	}
 }
 
 _Add Block Wire[worker,node,junk,blocks,parse worker,assignments:out]
 {
-	out <- [node]Add Wires[worker, blocks, parse worker, assignments]
+	Print[["_Add Block Wire "]Append[Type Of[node]]]
+	{
+		out <- [node]Add Wires[worker, blocks, parse worker, assignments]
+		{ Print[["_Add Block Wire done "]Append[Type Of[node]]] }
+	}
 }
 
 Add Block Wire[worker,block nodes,output num,parent index,existing blocks,parse worker,assignments:out]
 {
+	Print["Add Block Wire"]
+	{
 	blocks <- [existing blocks]Append[New@Output Reference[parent index, output num]]
 	out <- Fold[[[["_Add Block Wire"]Set Input[3, blocks]]Set Input[4, parse worker]]Set Input[5, assignments], worker, block nodes]
+	{ Print["done: Add Block Wire"] }
+	}
 }
 
-Assignments Add Wires[worker,assignment,output num,parse worker,start index:worker]
+Assignments Add Wires[worker,assignment,output num,parse worker,start index:out worker]
 {
+	Print[["Assignments Add Wires: "]Append[assignment]]
+	{
 	[[parse worker]Outputs >>]Find[assignment]
 	{
 		,output index <- [worker]Add Output[assignment, ~]
 		{
-			worker <- [~]Add Wire[start index, output num, output index, 0]
+			Print[
+				[[[[[[["Wire: "
+					]Append[ start index ]
+					]Append[","]
+					]Append[ output num]
+					]Append[" to "]
+					]Append[output index]
+					]Append[","]
+					]Append[ 0 ]
+				]
+			out worker <- [~]Add Wire[start index, output num, output index, 0]
+			{ Print["wire done, Assignments Add Wires 1"] }
 		}
 	}{
 		//Ugly hack alert!
@@ -279,13 +322,16 @@
 			parts <- [assignment]Split["::"]
 			,global index <- [worker]Add Global Set[[parts]Index[0], [parts]Index[1]]
 			{
-				worker <- [~]Add Wire[start index, output num, global index, 0]
+				out worker <- [~]Add Wire[start index, output num, global index, 0]
+				{ Print["wire done, Assignments Add Wires 2"] }
 			}
 		}{
-			worker <- worker
+			Print["Pipe assignment, do nothing"]
+			{ out worker <- worker }
 		}
 	}
 }
+}
 
 Has Block@Worker Node[junk:out,unused]
 {
@@ -319,14 +365,23 @@
 
 Add Wires@Worker Node[node,worker,blocks,parse worker,assignments:worker,index,num,unused]
 {
+	Print["Add Wires@Worker Node"]
+	{
 	worker,index,num <- Add Wires Worker or Field[node, worker, blocks, parse worker, assignments]
+	}
 }
 
 Add Wires Worker or Field[node,worker,blocks,parse worker,assignments:worker,index,num,unused]
 {
+	Print["Add Wires Worker or Field"]
+	{
 	Fold[[["Assignments Add Wires"]Set Input[3, parse worker]]Set Input[4, [node]Index >>], worker, [node]Assignments >>]
-	{ Fold[[[[["Add Block Wire"]Set Input[3, [node]Index >>]]Set Input[4, blocks]]Set Input[5, parse worker]]Set Input[6, assignments], ~, [node]Blocks >>]
-	{ params worker <- Fold[[[[["Add Param Wire"]Set Input[3, [node]Index >>]]Set Input[4, blocks]]Set Input[5, parse worker]]Set Input[6, assignments], ~, [node]Params >>] }}
+	{ 
+		Print["Assignments Add Wires done"]
+		Fold[[[[["Add Block Wire"]Set Input[3, [node]Index >>]]Set Input[4, blocks]]Set Input[5, parse worker]]Set Input[6, assignments], ~, [node]Blocks >>]
+		{ 
+			Print["Add Block Wire fold done"]
+			params worker <- Fold[[[[["Add Param Wire"]Set Input[3, [node]Index >>]]Set Input[4, blocks]]Set Input[5, parse worker]]Set Input[6, assignments], ~, [node]Params >>] }}
 	If[Has Block Params[[node]Params >>]]
 	{
 		worker <- Val[params worker]
@@ -340,6 +395,7 @@
 	}
 	index <- [node]Index >>
 	num <- 0
+	}
 }
 
 Blueprint Field Node
@@ -362,7 +418,7 @@
 	out <- [[[[[Build["Field Node"]]Name <<[name]]Assignments <<[New@List[]]]Blocks <<[New@List[]]]Set? <<[set]]Params <<[params]
 }
 
-Add to Worker@Field Node[node,worker,program,parse worker,refs:node,worker,refs,unused]
+Add to Worker@Field Node[node,worker,program,parse worker,refs:out node,out worker,out refs]
 {
 	If[[node]Set? >>]
 	{
@@ -370,21 +426,24 @@
 	}{
 		after worker,index <- [worker]Add Object Get[[node]Name >>]
 	}
-	index
+	Val[index]
 	{
 		assignment refs <- Fold[[["Assignment Save Reference"]Set Input[3, parse worker]]Set Input[4, ~], refs, [node]Assignments >>]
 		[node]Index <<[~]
 		{ 
 			params list, params worker, params refs <- Add List to Worker[[~]Params >>, after worker, program, parse worker, assignment refs]
-			block list, worker, refs <- Add Blocks to Worker[[~]Blocks >>, params worker, program, parse worker, params refs]
-			node <- [[~]Params <<[params list]]Blocks <<[block list]
+			block list, out worker, out refs <- Add Blocks to Worker[[~]Blocks >>, params worker, program, parse worker, params refs]
+			out node <- [[~]Params <<[params list]]Blocks <<[block list]
 		}
 	}
 }
 
 Add Wires@Field Node[node,worker,blocks,parse worker,assignments:worker,index,num]
 {
+	Print["Add Wires@Field Node"]
+	{
 	worker,index,num <- Add Wires Worker or Field[node, worker, blocks, parse worker, assignments]
+	}
 }
 
 Blueprint Named Pipe Node
@@ -416,12 +475,13 @@
 	out <- [[[Build["Named Pipe Node"]]Name <<[name]]Assignments <<[New@List[]]]Blocks <<[New@List[]]
 }
 
-Add to Worker@Named Pipe Node[node,worker,program,parse worker,refs:node,worker,refs]
+Add to Worker@Named Pipe Node[node,worker,program,parse worker,refs:out node,out worker,out refs]
 {
 	[[parse worker]Inputs >>]Find[[node]Name >>]
 	{
 		after add <- [worker]Add Input[[node]Name >>, ~] {}
 		{
+			Print[["Added input, node:"]Append[~]]
 			assign refs <- Fold[[["Assignment Save Reference"]Set Input[3, parse worker]]Set Input[4, ~], refs, [node]Assignments >>]
 			index node <- [node]Index <<[~]
 		}
@@ -431,12 +491,14 @@
 		//TODO: Handle assignments from a named pipe that isn't an input
 		assign refs <- refs
 	}
-	block list, worker, refs <- Add Blocks to Worker[[node]Blocks >>, after add, program, parse worker, assign refs]
-	node <- [index node]Blocks <<[block list]
+	block list, out worker, out refs <- Add Blocks to Worker[[node]Blocks >>, after add, program, parse worker, assign refs]
+	out node <- [index node]Blocks <<[block list]
 }
 
-Add Wires@Named Pipe Node[node,worker,blocks,parse worker,assignments:worker,index,num,unused]
+Add Wires@Named Pipe Node[node,worker,blocks,parse worker,assignments:worker,index,num,reflist]
 {
+	Print["Add Wires@Named Pipe Node"]
+	{
 	reflist <- [assignments]Index[[node]Name >>]
 	{ 
 		//TODO: Fix support for a named pipe with a block
@@ -470,7 +532,8 @@
 			}
 		}
 	}
-	index <- my index
+	}
+	index <- Val[my index]
 	
 	worker <- Fold[[[[["Add Block Wire"]Set Input[3, my index]]Set Input[4, blocks]]Set Input[5, parse worker]]Set Input[6, assignments], wires worker, [node]Blocks >>]
 }
@@ -527,31 +590,40 @@
 	out <- [[[Build["Literal Node"]]Value <<[value]]Assignments <<[New@List[]]]Blocks <<[New@List[]]
 }
 
-Add to Worker@Literal Node[node,worker,unused,parse worker,refs:out node,out worker,refs,unused]
+Add to Worker@Literal Node[node,worker,unused,parse worker,refs:out node,out worker,out refs]
 {
 	out worker <- [worker]Add Constant[[node]Value >>] {}
 	{
-		refs <- Fold[[["Assignment Save Reference"]Set Input[3, parse worker]]Set Input[4, ~], refs, [node]Assignments >>]
+		out refs <- Fold[[["Assignment Save Reference"]Set Input[3, parse worker]]Set Input[4, ~], refs, [node]Assignments >>]
 		out node <- [node]Index <<[~]
 	}
 }
 
 Add Wires@Literal Node[node,worker,blocks,parse worker,assignments:worker,index,num,unused]
 {
+	Print["Add Wires@Literal Node"]
+	{
 	worker,index,num <- Add Wires Literal or Global[node, worker, blocks, parse worker, assignments]
+	}
 }
 
 Add Wires Literal or Global[node,worker,blocks,parse worker,junk:worker,index,num,unused]
 {
+	Print["Add Wires Literal or Global"]
+	{
 	assignments worker <- Fold[[["Assignments Add Wires"]Set Input[3, parse worker]]Set Input[4, [node]Index >>], worker, [node]Assignments >>]
+	{ Print["Done fold Assignments Add Wires"] }
 	[blocks]Peek
 	{
+		Print["Add wire"]
 		worker <- [assignments worker]Add Wire[[~]Index >>, [~]Output Number>>, [node]Index >>, [0]-[1]]
+		{ Print["Add wire done"] }
 	}{
 		worker <- Val[assignments worker]
 	}
 	index <- [node]Index >>
 	num <- 0
+	}
 }
 
 Blueprint Block Node
@@ -1115,13 +1187,34 @@
 	}
 }
 
+Register Workers Compile[prog, worker, name:out]
+{
+	Print[["Registering "]Append[name]]
+	out <- [prog]Register Worker[name, "cdecl", [[worker]Inputs >>]Length, [[worker]Outputs >>]Length]
+}
+
+Add Workers Compile[prog, worker, name:out]
+{
+	Print[["Add Workers Compile: "]Append[name]]
+	{
+	trees, nworker, refs <- Add List to Worker[[worker]Trees >>, [NWorker["cdecl"]]Uses[[worker]Uses Stores >>], prog, worker, New@Dictionary[]]
+	final nworker <- Fold[[["Add Wires Helper"]Set Input[3, worker]]Set Input[4, refs], nworker, trees]
+	out <- [prog]Bind Worker[name, final nworker]
+	}
+}
+
 Add Wires Helper[worker,node,unused,parse worker,assignments:out]
 {
+	Print["Add Wires Helper"]
+	{
 	out <- [node]Add Wires[worker, New@List[], parse worker, assignments]
+	{ Print["Add Wires Helper Done"] }
+	}
 }
 
 Add Contents[parse worker,name,program:out,key]
 {
+	Print[["Add Contents: "]Append[name]]
 	worker <- [[program]Find Worker[name]]Uses[[parse worker]Uses Stores >>]
 	trees, contents worker, refs <- Add List to Worker[[parse worker]Trees >>, worker, program, parse worker, New@Dictionary[]]
 	Fold[[["Add Wires Helper"]Set Input[3, parse worker]]Set Input[4, refs], contents worker, trees]
@@ -1165,6 +1258,12 @@
 	{ Print["done"] }
 }
 
+Tree to Program Native[parse tree:out]
+{
+	registered <- Fold["Register Workers Compile", [NProgram[]]Register Builtins, [parse tree]Workers >>]
+	out <- Fold["Add Workers Compile", registered, [parse tree]Workers >>]
+}
+
 Needs Imports[needs import,not imported?,name:out]
 {
 	If[not imported?]
@@ -1331,16 +1430,22 @@
 
 Main[args]
 {
-	[args]Index[1]
+	Print["start"]
+	fname <- [args]Index[1]
 	{
 		file <- <String@File[~]
 		,text <- [file]Get FString[[file]Length]
 		params <- New@Parser[]
+		Print[["Parsing "]Append[fname]]
 		Null[text, params, New@Parse Program[], 0]
 		{
+			Print["Parsing imports"]
 			tree <- Process Imports[~, params]
-			Init Used Stores[tree, New@Dictionary[]]
-			{ [Tree to Program[tree]]Run[[args]Tail[1]] }
+			{ Print["Compiling"] }
+			compiled <- [Tree to Program Native[tree]]Compile Program[C Program[]]
+			outfile <- <String@File[ [fname]Append[".c"] ]
+			[outfile]Put String[ [compiled]Text ]
+			{ Print[["Wrote output to "]Append[ [fname]Append[".c"] ]] }
 		}
 	}{
 		REPL[New@Parser[]]