Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 5
0
        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("成功しました!");
            }
        }