示例#1
0
        public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("var v_");
            sb.Append(funcDef.NameToken.Value);
            sb.Append(" = function(");
            Token[] args = funcDef.ArgNames;
            for (int i = 0; i < args.Length; ++i)
            {
                if (i > 0)
                {
                    sb.Append(", ");
                }
                sb.Append("v_");
                sb.Append(args[i].Value);
            }
            sb.Append(") {");
            sb.Append(this.NL);

            translator.TabDepth = 1;
            translator.TranslateExecutables(sb, funcDef.Code);
            translator.TabDepth = 0;

            sb.Append("};");
            sb.Append(this.NL);
            sb.Append(this.NL);

            return(sb.ToString());
        }
示例#2
0
        public override string GenerateCodeForGlobalsDefinitions(AbstractTranslator translator, IList <VariableDeclaration> globals)
        {
            List <string> lines = new List <string>()
            {
                "package org.crayonlang.interpreter;",
                "",
                "import java.util.HashMap;",
                "import org.crayonlang.interpreter.structs.Value;",
                "",
                "public final class VmGlobal {",
                "",
                "  private VmGlobal() {}",
                "",
            };

            foreach (VariableDeclaration varDecl in globals)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("  public static final ");
                sb.Append(this.TranslateType(varDecl.Type));
                sb.Append(' ');
                sb.Append(varDecl.VariableNameToken.Value);
                sb.Append(" = ");
                translator.TranslateExpression(sb, varDecl.Value);
                sb.Append(';');
                lines.Add(sb.ToString());
            }
            lines.Add("}");
            lines.Add("");
            return(string.Join(this.NL, lines));
        }
示例#3
0
        public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(this.TranslateType(funcDef.ReturnType));
            sb.Append(" v_");
            sb.Append(funcDef.NameToken.Value);
            sb.Append('(');
            for (int i = 0; i < funcDef.ArgNames.Length; ++i)
            {
                if (i > 0)
                {
                    sb.Append(", ");
                }
                sb.Append(this.TranslateType(funcDef.ArgTypes[i]));
                sb.Append(" v_");
                sb.Append(funcDef.ArgNames[i].Value);
            }
            sb.Append(")\n{\n");
            translator.TabDepth = 1;
            translator.TranslateExecutables(sb, funcDef.Code);
            translator.TabDepth = 0;
            sb.Append("}\n");

            return(sb.ToString());
        }
示例#4
0
        public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef)
        {
            StringBuilder output     = new StringBuilder();
            PType         returnType = funcDef.ReturnType;
            string        funcName   = funcDef.NameToken.Value;

            PType[]        argTypes = funcDef.ArgTypes;
            Pastel.Token[] argNames = funcDef.ArgNames;

            output.Append("public static ");
            output.Append(this.TranslateType(returnType));
            output.Append(" v_");
            output.Append(funcName);
            output.Append("(");
            for (int i = 0; i < argTypes.Length; ++i)
            {
                if (i > 0)
                {
                    output.Append(", ");
                }
                output.Append(this.TranslateType(argTypes[i]));
                output.Append(" v_");
                output.Append(argNames[i].Value);
            }
            output.Append(")");
            output.Append(this.NL);
            output.Append("{");
            output.Append(this.NL);
            translator.TabDepth = 1;
            translator.TranslateExecutables(output, funcDef.Code);
            translator.TabDepth = 0;
            output.Append("}");

            return(string.Join("", output));
        }
示例#5
0
        public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(translator.CurrentTab);
            sb.Append("public static ");
            sb.Append(this.TranslateType(funcDef.ReturnType));
            sb.Append(" v_");
            sb.Append(funcDef.NameToken.Value);
            sb.Append('(');
            Pastel.Token[] argNames = funcDef.ArgNames;
            PType[]        argTypes = funcDef.ArgTypes;
            for (int i = 0; i < argTypes.Length; ++i)
            {
                if (i > 0)
                {
                    sb.Append(", ");
                }
                sb.Append(this.TranslateType(argTypes[i]));
                sb.Append(" v_");
                sb.Append(argNames[i].Value);
            }
            sb.Append(") {");
            sb.Append(this.NL);
            translator.TabDepth++;
            translator.TranslateExecutables(sb, funcDef.Code);
            translator.TabDepth--;
            sb.Append(translator.CurrentTab);
            sb.Append('}');
            sb.Append(this.NL);

            return(sb.ToString());
        }
示例#6
0
        public override string GenerateCodeForGlobalsDefinitions(AbstractTranslator translator, IList <VariableDeclaration> globals)
        {
            StringBuilder sb = new StringBuilder();

            foreach (VariableDeclaration global in globals)
            {
                translator.TranslateVariableDeclaration(sb, global);
            }
            return(sb.ToString());
        }
示例#7
0
        public AbstractPlatform(
            PlatformId platform,
            LanguageId language,
            AbstractTranslator translator,
            AbstractSystemFunctionTranslator systemFunctionTranslator)
        {
            this.PlatformId = platform;
            this.LanguageId = language;

            this.Translator = translator;
            this.SystemFunctionTranslator            = systemFunctionTranslator;
            this.Translator.Platform                 = this;
            this.SystemFunctionTranslator.Platform   = this;
            this.SystemFunctionTranslator.Translator = translator;
        }
示例#8
0
        public override string GenerateCodeForGlobalsDefinitions(AbstractTranslator translator, IList <VariableDeclaration> globals)
        {
            StringBuilder output = new StringBuilder();

            output.Append("    public static class Globals");
            output.Append(this.NL);
            output.Append("    {");
            output.Append(this.NL);
            translator.TabDepth = 0;
            foreach (VariableDeclaration vd in globals)
            {
                output.Append("        public static ");
                translator.TranslateVariableDeclaration(output, vd);
            }
            output.Append("    }");
            return(output.ToString());
        }
 public void TranslateInvocation(
     StringBuilder sb,
     AbstractTranslator translator,
     string functionName,
     Expression[] args,
     Pastel.Token throwToken)
 {
     try
     {
         sb.Append(LibraryExporter.Get(this.library, translator.Platform).TranslateNativeInvocation(throwToken, translator, functionName, args));
     }
     catch (System.Reflection.TargetInvocationException tie)
     {
         System.Console.WriteLine("Library translation generated an error:");
         System.Console.WriteLine(tie.InnerException.Message);
         System.Console.WriteLine(tie.InnerException.StackTrace);
         System.Environment.Exit(1);
     }
 }
示例#10
0
        public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef)
        {
            PythonTranslator pyTranslator = (PythonTranslator)translator;

            pyTranslator.CurrentFunctionDefinition = funcDef;
            StringBuilder sb = new StringBuilder();

            sb.Append(translator.CurrentTab);
            sb.Append("def v_");
            sb.Append(funcDef.NameToken.Value);
            sb.Append('(');
            int argCount = funcDef.ArgNames.Length;

            for (int i = 0; i < argCount; ++i)
            {
                if (i > 0)
                {
                    sb.Append(", ");
                }
                sb.Append("v_");
                sb.Append(funcDef.ArgNames[i].Value);
            }
            sb.Append("):");
            sb.Append(this.NL);
            translator.TabDepth++;
            translator.TranslateExecutables(sb, funcDef.Code);
            translator.TabDepth--;
            sb.Append(this.NL);

            foreach (PythonFakeSwitchStatement switchStatement in pyTranslator.SwitchStatements)
            {
                sb.Append(translator.CurrentTab);
                sb.Append(switchStatement.GenerateGlobalDictionaryLookup());
                sb.Append(this.NL);
            }
            pyTranslator.SwitchStatements.Clear();
            pyTranslator.CurrentFunctionDefinition = null;

            return(sb.ToString());
        }
示例#11
0
 public override string GenerateCodeForGlobalsDefinitions(AbstractTranslator translator, IList <VariableDeclaration> globals)
 {
     throw new NotImplementedException();
 }
示例#12
0
 public override string GenerateCodeForGlobalsDefinitions(AbstractTranslator translator, IList <VariableDeclaration> globals)
 {
     return(this.ParentPlatform.GenerateCodeForGlobalsDefinitions(translator, globals));
 }
示例#13
0
 public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef)
 {
     return(this.ParentPlatform.GenerateCodeForFunction(this.Translator, funcDef));
 }
示例#14
0
 public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef)
 {
     throw new NotImplementedException();
 }
示例#15
0
        public Dictionary <string, FileOutput> ExportProjectImpl(
            IList <VariableDeclaration> globals,
            IList <StructDefinition> structDefinitions,
            IList <FunctionDefinition> functionDefinitions,
            IList <LibraryForExport> libraries,
            ResourceDatabase resourceDatabase,
            Options options,
            ILibraryNativeInvocationTranslatorProvider libraryNativeInvocationTranslatorProviderForPlatform,
            AbstractTranslator translatorOverride)
        {
            Dictionary <string, FileOutput> output       = new Dictionary <string, FileOutput>();
            Dictionary <string, string>     replacements = this.GenerateReplacementDictionary(options, resourceDatabase);

            List <string> coreVmCode = new List <string>();

            coreVmCode.Add(this.GenerateCodeForGlobalsDefinitions(translatorOverride, globals));

            foreach (FunctionDefinition funcDef in functionDefinitions)
            {
                coreVmCode.Add(this.GenerateCodeForFunction(translatorOverride, funcDef));
            }

            string coreVm = string.Join("\r\n", coreVmCode);

            output["vm.js"] = new FileOutput()
            {
                Type        = FileOutputType.Text,
                TextContent = coreVm,
            };

            List <LibraryForExport> librariesWithCode = new List <LibraryForExport>();

            foreach (LibraryForExport library in libraries)
            {
                if (library.ManifestFunction != null)
                {
                    List <string> libraryLines = new List <string>();

                    translatorOverride.CurrentLibraryFunctionTranslator =
                        libraryNativeInvocationTranslatorProviderForPlatform.GetTranslator(library.Name);

                    library.ManifestFunction.NameToken = Pastel.Token.CreateDummyToken("lib_" + library.Name.ToLower() + "_manifest");
                    libraryLines.Add(this.GenerateCodeForFunction(translatorOverride, library.ManifestFunction));
                    foreach (FunctionDefinition fnDef in library.Functions)
                    {
                        libraryLines.Add(this.GenerateCodeForFunction(translatorOverride, fnDef));
                    }
                    libraryLines.Add("C$common$scrapeLibFuncNames('" + library.Name.ToLower() + "');");
                    libraryLines.Add("");

                    // add helper functions after the scrape.

                    foreach (ExportEntity embedCode in library.ExportEntities["EMBED_CODE"])
                    {
                        libraryLines.Add(embedCode.StringValue);
                    }

                    output["libs/lib_" + library.Name.ToLower() + ".js"] = new FileOutput()
                    {
                        Type        = FileOutputType.Text,
                        TextContent = string.Join("\n", libraryLines),
                    };
                    librariesWithCode.Add(library);
                }
            }

            Dictionary <string, string> htmlReplacements = new Dictionary <string, string>(replacements);

            replacements["JS_LIB_INCLUSIONS"] = this.GenerateJsLibInclusionHtml(output.Keys);
            this.CopyResourceAsText(output, "index.html", "Resources/GameHostHtml.txt", replacements);

            this.CopyResourceAsText(output, "common.js", "Resources/Common.txt", replacements);

            TODO.JavaScriptDeGamification();
            output["lib_supplemental.js"] = new FileOutput()
            {
                Type        = FileOutputType.Text,
                TextContent = string.Join("\n\n", new string[] {
                    this.LoadTextResource("Resources/ImageResource.txt", replacements),
                    this.LoadTextResource("Resources/Game.txt", replacements),
                    this.LoadTextResource("Resources/Drawing.txt", replacements),
                    this.LoadTextResource("Resources/Gamepad.txt", replacements),
                    this.LoadTextResource("Resources/Input.txt", replacements),
                    this.LoadTextResource("Resources/Sound.txt", replacements),
                }),
            };

            StringBuilder resourcesJs = new StringBuilder();

            foreach (FileOutput textResource in resourceDatabase.TextResources)
            {
                resourcesJs.Append("C$common$addTextRes(");
                resourcesJs.Append(Util.ConvertStringValueToCode(textResource.CanonicalFileName));
                resourcesJs.Append(", ");
                resourcesJs.Append(Util.ConvertStringValueToCode(textResource.TextContent));
                resourcesJs.Append(");\n");
            }

            foreach (FileOutput fontResource in resourceDatabase.FontResources)
            {
                resourcesJs.Append("C$common$addBinaryRes(");
                resourcesJs.Append(Util.ConvertStringValueToCode(fontResource.CanonicalFileName));
                resourcesJs.Append(", '");
                resourcesJs.Append(Util.ConvertByteArrayToBase64(fontResource.GetFinalBinaryContent()));
                resourcesJs.Append("');\n");
            }

            FileOutput imageSheetManifest = resourceDatabase.ImageSheetManifestFile;

            resourcesJs.Append("C$common$addTextRes('image_sheets.txt', ");
            resourcesJs.Append(imageSheetManifest == null ? "''" : Util.ConvertStringValueToCode(imageSheetManifest.TextContent));
            resourcesJs.Append(");\n");

            resourcesJs.Append("C$common$resourceManifest = ");
            resourcesJs.Append(Util.ConvertStringValueToCode(resourceDatabase.ResourceManifestFile.TextContent));
            resourcesJs.Append(";\n");

            string filePrefix = options.GetStringOrNull(ExportOptionKey.JS_FILE_PREFIX);

            if (filePrefix != null)
            {
                resourcesJs.Append("C$common$jsFilePrefix = ");
                resourcesJs.Append(Util.ConvertStringValueToCode(filePrefix));
                resourcesJs.Append(";\n");
            }

            output["resources.js"] = new FileOutput()
            {
                Type        = FileOutputType.Text,
                TextContent = resourcesJs.ToString(),
            };

            output["bytecode.js"] = new FileOutput()
            {
                Type        = FileOutputType.Text,
                TextContent = "C$bytecode = " + Util.ConvertStringValueToCode(resourceDatabase.ByteCodeFile.TextContent) + ";",
            };

            foreach (string imageResourceFile in resourceDatabase.ImageSheetFiles.Keys)
            {
                FileOutput file = resourceDatabase.ImageSheetFiles[imageResourceFile];
                output["resources/images/" + imageResourceFile] = file;
            }

            foreach (FileOutput audioResourceFile in resourceDatabase.AudioResources)
            {
                output["resources/audio/" + audioResourceFile.CanonicalFileName] = audioResourceFile;
            }

            // TODO: minify JavaScript across all of output dictionary

            return(output);
        }