static public void Print(IntermediateRepresentation imr) { var res = Compile(imr); Debug.Log(res); }
public static string Compile(IntermediateRepresentation imr) { StringBuilder result = new StringBuilder(); result.Append("export default function generated() {\n"); foreach (var guid in imr.order) { var node = imr.table[guid]; // ignore ConstantB and EndB if (node.OperatorType == "ConstantB") { continue; } if (node.OperatorType == "DomInputB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"const {node.Return} = extractValueB(document.querySelector('#{node.CodeText}'));"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "DomInputE") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"const {node.Return} = extractValueE(document.querySelector('#{node.CodeText}'));"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "DomOutputB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"insertDomB( {node.Arguments[0]} , '{node.CodeText}' );"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "DomOutputE") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"insertDomE( {node.Arguments[0]} , '{node.CodeText}' );"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "DomEnableB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"liftB(a => {{document.querySelector('#{node.CodeText}').disabled = !a}}, {node.Arguments[0]})"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "DebugB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"insertDomB( {node.Arguments[0]} , '{node.CodeText}' );"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "SnapshotE") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"const {node.Return} = snapshotE( {node.Arguments[0]} , {node.Arguments[1]} );"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "FilterE") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"const {node.Return} = filterE( {node.Arguments[0]} , {node.CodeText} );"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"const {node.Return} = "); stringBuilder.Append($"{ConvertOperatorName(node.OperatorType)}"); stringBuilder.Append("("); stringBuilder.Append($"{node.CodeText}, "); var delimiter = ""; foreach (var argument in node.Arguments) { stringBuilder.Append(delimiter); stringBuilder.Append($"{argument}"); delimiter = ", "; } stringBuilder.Append(");"); stringBuilder.Append("\n"); result.Append(stringBuilder); } } result.Append("}\n"); return(result.ToString()); }
public static string Compile(IntermediateRepresentation imr) { StringBuilder result = new StringBuilder(); foreach (var e in imr.refEvents) { var refName = IntermediateRepresentation.ToRefName(e.Item1); string loop() => e.Item2 == EventType.Event ? "StreamLoop" : "CellLoop"; result.AppendLine($"final var {refName} = new {loop()}<Integer>();"); } result.AppendLine(); foreach (var guid in imr.order) { var node = imr.table[guid]; // ignore ConstantB and EndB if (node.OperatorType == "ConstantB" || node.OperatorType == "EndB") { continue; } if (node.OperatorType == "DomInputB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"final Cell<String> {node.Return};"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "DomOutputB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"insertDomB( {node.Arguments[0]} , '{node.CodeText}' );"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "DomEnableB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"liftB(a => {{document.querySelector('#{node.CodeText}').disabled = !a}}, {node.Arguments[0]})"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "DebugB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"insertDomB( {node.Arguments[0]} , '{node.CodeText}' );"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "InputB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"//InputB [{node.Return}]"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "LabelB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"final var {node.CodeText} = new SLabel({node.Arguments[0]});"); stringBuilder.Append("\n"); result.Append(stringBuilder); } else if (node.OperatorType == "FieldB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine($"final var {node.CodeText} = new STextField(\"\", 30);"); stringBuilder.AppendLine($"final var {node.Return} = {node.CodeText}.text;"); result.Append(stringBuilder); } else if (node.OperatorType == "DisableableFieldB") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine($"final var {node.CodeText} = new STextField(\"\", 30, {node.Arguments[0]});"); stringBuilder.AppendLine($"final var {node.Return} = {node.CodeText}.text;"); result.Append(stringBuilder); } else if (node.OperatorType == "ButtonE") { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine($"//ButtonE {node.Return} = {node.CodeText} "); result.Append(stringBuilder); } else { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"final var {node.Return} = {node.Arguments[0]}."); stringBuilder.Append($"{ConvertOperatorName(node.OperatorType)}"); stringBuilder.Append("("); var delimiter = ","; for (var i = 1; i < node.Arguments.Count; ++i) { var argument = node.Arguments[i]; stringBuilder.Append($"{argument}"); stringBuilder.Append(delimiter); } stringBuilder.Append($"{node.CodeText.Replace("=>", "->")}"); stringBuilder.Append(");"); stringBuilder.Append("\n"); result.Append(stringBuilder); } } result.AppendLine(); foreach (var e in imr.refEvents) { var refName = IntermediateRepresentation.ToRefName(e.Item1); result.AppendLine($"{refName}.loop({e.Item1});"); } return(result.ToString()); }