public override UnifiedProgram GenerateWithoutNormalizing(string code) { File.WriteAllText("tmp.rdr", code, Encoding.UTF8); var ast = ProduireFile.Load("tmp.rdr"); return(ProduireProgramGeneratorHelper.CreateProgram(ast)); }
public static UnifiedProgram CreateProgram(ProduireFile rdr) { var program = UnifiedProgram.Create(UnifiedBlock.Create()); ParseClass(rdr.Global, program.Body); foreach (var construct in rdr.GetConstructs()) { program.Body.Add(CreateClassDefinition(construct)); } return(program); }
public bool Compile(ProduireFile rdr, string fullPath) { foreach (Procedure procedure in rdr.Global.Procedures) { if (procedure is FixedProcedure) { continue; } string name = procedure.UniqueName; if (name == "スタート") { name = "artecRobotMain"; } else { string text = ConvertToAscii(name); if (text.Length == 0) { text = "Func"; } name = "ARSR_" + text; int number = 1; while (funcNameList.ContainsValue(name)) { name = "ARSR_" + text + number; number++; } } funcNameList[procedure] = name; functionList.Add(procedure); } StringWriter writer = new StringWriter(); writer.Write(File.ReadAllText("head.txt")); WriteSettings(writer); Generate(rdr, writer); writer.Write(File.ReadAllText("foot.txt")); writer.Close(); File.WriteAllText(fullPath, writer.ToString()); return(true); }
public void Generate(ProduireFile rdr, StringWriter writer) { if (rdr == null) { throw new ArgumentNullException("rdr"); } //開始の手順の生成 FixedProcedure entry = rdr.Global.EntryCode; var statements = entry.Statements; if (statements.Count != 0) { Generate(statements, writer); } //手順と種類の生成 CodeElementCollection globalCodeList = rdr.Global.CodeList; if (globalCodeList.Count != 0) { string indent = globalCodeList.Indent; for (int i = 0; i < globalCodeList.Count; i++) { ICodeElement element = globalCodeList[i]; if (element is FixedProcedure && (element as Procedure).Kind == Procedure.ProcedureKinds.はじめ) { continue; } if (element.PhraseType == PhraseTypes.改行字句) { continue; } Generate(element, writer, indent); } } }
static void Main(string[] args) { if (args.Length < 1) { OutputUsage(); return; } string mode = args[0]; string rdrfile; string inofile = null; switch (mode) { case "/trans": case "/write": rdrfile = args[1]; if (args.Length > 2) { inofile = args[2]; } break; default: rdrfile = args[0]; inofile = null; break; } PluginManager pluginManager = new PluginManager(); var plugin = PluginManager.Load(typeof(Program).Assembly) as PNamespacePlugin; pluginManager.AddStandard(plugin); string rdrName = Path.GetFileNameWithoutExtension(rdrfile); string rdrDir = Path.GetDirectoryName(rdrfile); if (inofile == null) { string inoDir = Path.Combine(rdrDir, rdrName); Directory.CreateDirectory(inoDir); inofile = Path.Combine(inoDir, rdrName + ".ino"); } else { } string inoFN = Path.GetFileName(inofile); //共通設定の読み込み string settingConfig = "settings.json"; string json; if (File.Exists(settingConfig)) { json = File.ReadAllText(settingConfig); } else { json = ""; } Settings setting = JsonConvert.DeserializeObject <Settings>(json); //個別設定の読み込み string settingConfig2 = Path.Combine(rdrDir, rdrName + ".json"); if (File.Exists(settingConfig2)) { string json2 = File.ReadAllText(settingConfig2); Settings setting2 = JsonConvert.DeserializeObject <Settings>(json2); if (setting2.SensorPort != null) { setting.SensorPort = setting2.SensorPort; } if (setting2.ServomotorPort != null) { setting.ServomotorPort = setting2.ServomotorPort; } if (setting2.DCMotorPort != null) { setting.DCMotorPort = setting2.DCMotorPort; } } ScriptParser parser = new ScriptParser(false); ProduireFile rdr = parser.ParseFrom(rdrfile, pluginManager); var compiler = new StuduinoCodeGenerator(); compiler.Settings = setting; if (!compiler.Compile(rdr, inofile)) { Console.WriteLine("変換に失敗しました。"); return; } if (mode != "/trans") { //転送 string temp = Path.GetTempPath(); string build_dir = Path.Combine(temp, @"rdr_arduino_build"); string cache_dir = Path.Combine(temp, @"rdr_arduino_cache"); Directory.CreateDirectory(build_dir); Directory.CreateDirectory(cache_dir); string code = File.ReadAllText("board.bat"); code = code.Replace("{Arduino_dir}", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), @"Arduino\")); code = code.Replace("{lib_dir}", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"Arduino\libraries")); code = code.Replace("{ino_file}", inofile); code = code.Replace("{comport}", setting.ComPort); code = code.Replace("{build_dir}", build_dir); code = code.Replace("{cache_dir}", cache_dir); code = code.Replace("{inoFileName}", inoFN); File.WriteAllText("compile.bat", code, Encoding.Default); Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = false; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.OutputDataReceived += p_OutputDataReceived; p.ErrorDataReceived += P_ErrorDataReceived; p.StartInfo.FileName = "compile.bat"; p.Start(); p.BeginOutputReadLine(); p.BeginErrorReadLine(); p.WaitForExit(); Directory.Delete(build_dir, true); Directory.Delete(cache_dir, true); Console.WriteLine("完了しました。"); } else { Console.WriteLine("成功しました!"); } }