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; }
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; }
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")); } }
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; }