コード例 #1
0
        static public void Print(IntermediateRepresentation imr)
        {
            var res = Compile(imr);

            Debug.Log(res);
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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());
        }