예제 #1
0
        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;
        }
예제 #2
0
        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();
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        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();
            }
        }
예제 #5
0
        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);
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
        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();
                }
            }
        }
예제 #8
0
 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;
     }
 }