Mercurial > repos > rhope
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[]]