コード例 #1
0
ファイル: CmdLnArgs.cs プロジェクト: quwahara/Nana
        public static Token GetCmdLnArgs(string[] args)
        {
            if (args == null)
                throw new ArgumentNullException("args");

            List<Token> opts = new List<Token>();
            List<Token> srcs = new List<Token>();

            Action<string> Pick = delegate(string arg)
            {
                if (arg == null) return;
                arg = arg.Trim();
                if (arg == "") return;

                Token t;
                if (Regex.IsMatch(arg, OptHead))
                {
                    if ((t = PickOpt(arg)) == null)
                    {
                        throw new Exception(string.Format("Not supported option: {0}", arg));
                    }
                    opts.Add(t);
                }
                else
                {
                    srcs.Add(PickSrc(arg));
                }
            };

            foreach (string arg in args)
            {
                Pick(arg);
            }

            Token srct = new Token("", "Sources");
            srct.Follows = srcs.ToArray();

            Token optt = new Token("", "CompileOptions");
            optt.Follows = opts.ToArray();

            if (0 == optt.Select("out").Length && srcs.Count > 0)
            {
                string v = srcs[0].Value;
                string dir = System.IO.Path.GetDirectoryName(v);
                string fn = System.IO.Path.GetFileNameWithoutExtension(v) + ".exe";
                optt.FlwsAdd(NewOpt("out", System.IO.Path.Combine(dir, fn)));
            }

            Token ret = new Token("", "Arguments");
            ret.Follows = new Token[] { optt, srct };

            return ret;
        }
コード例 #2
0
ファイル: SemanticAnalyzer.cs プロジェクト: quwahara/Nana
        public static Token CreateFunToken(string func, string name, string returnType)
        {
            Debug.Assert(false == string.IsNullOrEmpty(func));

            Token f;

            f = new Token(func, "Fun");

            if (string.IsNullOrEmpty(name) == false)
            { f.FlwsAdd(name, "Name"); }

            f.FlwsAdd("(", "Prm").FlwsAdd(")");

            if (string.IsNullOrEmpty(returnType) == false)
            {
                f.FlwsAdd(":", "TypSpc");
                f.FlwsTail.FlwsAdd(returnType, "Id");
            }

            f.FlwsAdd("..", "Block");
            f.FlwsTail.Follows = new Token[0];

            return f;
        }
コード例 #3
0
ファイル: Ctrl.cs プロジェクト: quwahara/Nana
        public static void Prepare(Token root)
        {
            if (false == root.Contains("Syntax"))
            { root.FlwsAdd(new Token("", "Syntax")); }

            if (false == root.Contains("Code"))
            { root.FlwsAdd(new Token("", "Code")); }
        }
コード例 #4
0
ファイル: SemanticAnalyzer.cs プロジェクト: quwahara/Nana
 public static Token CreateClassToken(string name, string basename)
 {
     Token  root  = new Token("class", "Typ");
     root.FlwsAdd(name, "Name");
     if (null != basename)
     {
         Token bs = new Token("->", "BaseTypeDef");
         bs.FlwsAdd(basename, "Id");
         root.FlwsAdd(bs);
     }
     root.FlwsAdd("...", "Block")
         .FlwsAdd(",,,");
     return root;
 }