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()); }
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)); }
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()); }
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)); }
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()); }
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()); }
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; }
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); } }
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()); }
public override string GenerateCodeForGlobalsDefinitions(AbstractTranslator translator, IList <VariableDeclaration> globals) { throw new NotImplementedException(); }
public override string GenerateCodeForGlobalsDefinitions(AbstractTranslator translator, IList <VariableDeclaration> globals) { return(this.ParentPlatform.GenerateCodeForGlobalsDefinitions(translator, globals)); }
public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef) { return(this.ParentPlatform.GenerateCodeForFunction(this.Translator, funcDef)); }
public override string GenerateCodeForFunction(AbstractTranslator translator, FunctionDefinition funcDef) { throw new NotImplementedException(); }
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); }