private void LoadTokenReplacements(CompilerPlugin plugin) { if (!Ctx.Memory.Contains("tokens")) { return; } var array = Ctx.Memory.Get <object>("tokens") as LArray; var records = array.Value; var replacements = new List <string[]>(); foreach (var record in records) { var list = record as LArray; if (list != null) { var columns = list.Value; var alias = columns[0] as LString; var replacement = columns[1] as LString; if (alias != null && replacement != null) { replacements.Add(new string[2] { alias.Value, replacement.Value }); } } } plugin.TokenReplacements = replacements; }
private void LoadStartTokensAsList(CompilerPlugin plugin) { if (!Ctx.Memory.Contains("start_tokens")) { return; } var list = Ctx.Memory.Get <object>("start_tokens") as LArray; List <string> tokens = null; // 5. Not start tokens supplied ? if (list != null && list.Value.Count != 0) { tokens = new List <string>(); for (var ndx = 0; ndx < list.Value.Count; ndx++) { var val = list.Value[ndx] as LString; tokens.Add(val.Value); } } if (tokens != null && tokens.Count > 0) { plugin.StartTokens = tokens.ToArray(); } }
/// <summary> /// After parsing is complete, register the alias. /// </summary> /// <param name="node"></param> public override void OnParseComplete(AstNode node) { var stmt = node as AliasStmt; //var plugin = new AliasTokenPlugin(stmt.Alias, stmt.Actual); //plugin.Init(_parser, _tokenIt); var plugin = new CompilerPlugin(); plugin.PluginType = "token"; plugin.TokenReplacements = new List <string[]>(); plugin.TokenReplacements.Add(new string[] { stmt.Alias, stmt.Actual.Text }); plugin.Precedence = 1; plugin.IsEnabled = true; Ctx.PluginsMeta.Register(plugin); }
private void LoadExamples(CompilerPlugin plugin) { // 3. Examples var examplesList = Ctx.Memory.Get <object>("examples") as LArray; if (examplesList != null && examplesList.Value != null && examplesList.Value.Count > 0) { var examples = new List <string>(); foreach (var lobj in examplesList.Value) { var example = lobj as LObject; var exampleText = example.GetValue().ToString(); examples.Add(exampleText); } plugin.Examples = examples.ToArray(); } }
private void LoadGrammar(CompilerPlugin plugin) { // 6. Parse the grammar plugin.Grammar = GetOrDefaultString("grammar_parse", ""); var parser = new GrammerParser(); // 7. Parse grammar match ( if present ) plugin.GrammarMatch = GetOrDefaultString("grammar_match", ""); if (!string.IsNullOrEmpty(plugin.GrammarMatch)) { plugin.Matches = parser.Parse(plugin.GrammarMatch); plugin.TotalRequiredMatches = parser.TotalRequired(plugin.Matches); } // 7a. check for empty if (!string.IsNullOrEmpty(plugin.Grammar)) { plugin.MatchesForParse = parser.Parse(plugin.Grammar); } }
private void SetupPlugin() { // 1. Create the meta plugin var plugin = new CompilerPlugin(); plugin.Name = Name; // 2. Load default properties such as desc, company, etc. LoadDefaultProperties(plugin); // 3. Load the examples LoadExamples(plugin); // 4. token replacements ? or expression plugin? if (plugin.PluginType == "expr") { plugin.TokenMap1 = GetTokenMap("tokenmap1"); plugin.TokenMap2 = GetTokenMap("tokenmap2"); LoadStartTokensAsMap(plugin); } else if (plugin.PluginType == "token") { LoadStartTokensAsList(plugin); LoadTokenReplacements(plugin); } else if (plugin.PluginType == "lexer") { LoadStartTokensAsList(plugin); } // 5. Load the grammar and build functions. LoadGrammar(plugin); if (Ctx.Memory.Contains("build")) { plugin.BuildExpr = GetFunc("build"); } // 5. Finally register the plugin. Ctx.PluginsMeta.Register(plugin); }
private void LoadStartTokensAsMap(CompilerPlugin plugin) { // 4. Setup the start tokens. var tokens = new List <string>(); var stokenMap = Ctx.Memory.Get <object>("start_tokens") as LObject; if (stokenMap.Type == LTypes.Array) { var list = stokenMap as LArray; // 5. Not start tokens supplied ? if (list != null && list.Value.Count != 0) { plugin.StartTokenMap = new Dictionary <string, object>(); for (var ndx = 0; ndx < list.Value.Count; ndx++) { var val = list.Value[ndx] as LString; tokens.Add(val.Value); plugin.StartTokenMap[val.Value] = val; } plugin.StartTokens = tokens.ToArray(); } } else if (stokenMap.Type == LTypes.Map) { var map = stokenMap as LMap; // 5. Start tokens supplied ? if (map != null && map.Value.Count != 0) { plugin.StartTokenMap = map.Value; foreach (var keyval in map.Value) { tokens.Add(keyval.Key); } plugin.StartTokens = tokens.ToArray(); } } }
private void LoadDefaultProperties(CompilerPlugin plugin) { // 2. Assign all plugin properties plugin.Desc = GetOrDefaultString("desc", string.Empty); plugin.PluginType = GetOrDefaultString("type", "expr"); plugin.Author = GetOrDefaultString("author", "Kishore Reddy"); plugin.Company = GetOrDefaultString("company", "CodeHelix Solutions Inc."); plugin.Url = GetOrDefaultString("url", "http://www.codehelixsolutions.com"); plugin.Url2 = GetOrDefaultString("url2", "http://fluentscript.codeplex.com"); plugin.Doc = GetOrDefaultString("doc", "http://fluentscript.codeplex.com/documentation"); plugin.Version = GetOrDefaultString("version", "0.9.8.10"); plugin.IsStatement = GetOrDefaultBool("isStatement", false); plugin.IsEndOfStatementRequired = GetOrDefaultBool("isEOSRequired", false); plugin.IsEnabled = GetOrDefaultBool("isEnabled", true); plugin.IsSystemLevel = GetOrDefaultBool("isSystemLevel", false); plugin.IsAutoMatched = GetOrDefaultBool("isAutoMatched", false); plugin.IsAssignmentSupported = GetOrDefaultBool("isAssignmentSupported", false); if (Ctx.Memory.Contains("defaults")) { var map = Ctx.Memory["defaults"] as LMap; plugin.ParseDefaults = map.Value; } }