public Grammar GetGrammar(GrammarSource source)
        {
            int    counter = 0;
            string line;
            var    grammar = new Grammar
            {
                Rules         = new List <Rule>(),
                StartRules    = new List <Rule>(),
                KnowTerminals = new HashSet <Terminal>(),
                KnowVariables = new HashSet <Terminal>()
            };

            using (var file = new StreamReader(source.Source))
            {
                while ((line = file.ReadLine()) != null)
                {
                    counter++;
                    if (string.IsNullOrWhiteSpace(line))
                    {
                        continue;
                    }

                    var rule = _ruleParser.Parse(line, grammar.KnowTerminals, grammar.KnowVariables);
                    if (rule.Type == RuleType.Start)
                    {
                        grammar.StartRules.Add(rule);
                    }
                    grammar.Rules.Add(rule);
                }
            }

            return(grammar);
        }
Exemplo n.º 2
0
        public void GetGrammarFromLocal()
        {
            var sc = new ServiceCollection();

            ContainerProvider.RegisterDefaults(sc);
            var serviceProvider = sc.BuildServiceProvider(true);
            var provider        = serviceProvider.GetService <IGrammarProvider>();
            var source          = new GrammarSource {
                Source = "date_gramar.txt"
            };
            var grammar = provider.GetGrammar(source);
            var parser  = serviceProvider.GetService <IGrammarParserService>();
            var list    = parser.GetExpandedRulesList(grammar);

            Assert.GreaterOrEqual(list.Count, 1);
        }
Exemplo n.º 3
0
        public void When_ScanGrammar_ShouldMatch(string input, string expectedVariableRule)
        {
            var sc = new ServiceCollection();

            ContainerProvider.RegisterDefaults(sc);
            var serviceProvider = sc.BuildServiceProvider(true);
            var provider        = serviceProvider.GetService <IGrammarProvider>();
            var source          = new GrammarSource {
                Source = "date_gramar.txt"
            };
            var grammar = provider.GetGrammar(source);
            var parser  = serviceProvider.GetService <IGrammarParserService>();

            var matches = parser.GetMatches(grammar, input);

            Assert.AreEqual(1, matches.Count);
            var match = matches.First();

            Assert.AreEqual(expectedVariableRule, match.Rule.Variable.Pattern);
        }
Exemplo n.º 4
0
        private void PrintGrammarList()
        {
            EditorGUILayout.LabelField("Grammars", EditorStyles.boldLabel);
            if (MichelangeloSession.GrammarList.Count == 0)
            {
                EditorGUILayout.HelpBox("Loading, please wait...", MessageType.Info);
                return;
            }
            if (GUILayout.Button("Create Grammar"))
            {
                MichelangeloSession.CreateGrammar().Then(_ => { Repaint(); }).Catch(OnRejected);
            }
            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);

            var pageCount           = 0;
            var filteredGrammarList = MichelangeloSession.GrammarList.Values.OrderByDescending(x => x.LastModifiedDate).Where(FilterGrammar).ToList();

            if (grammarsPerPage <= 0)
            {
                foreach (var grammar in filteredGrammarList)
                {
                    grammar.Draw(Repaint, OnRejected, true);
                }
            }
            else
            {
                pageCount = (filteredGrammarList.Count - 1) / grammarsPerPage;
                if (pageCount < grammarPage)
                {
                    grammarPage = pageCount;
                }

                foreach (var grammar in filteredGrammarList.Skip(grammarPage * grammarsPerPage).Take(grammarsPerPage))
                {
                    grammar.Draw(Repaint, OnRejected, true);
                }
            }
            EditorGUILayout.EndScrollView();

            if (pageCount > 0)
            {
                EditorGUILayout.BeginHorizontal(GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth));
                if (GUILayout.Button("Prev") && grammarPage != 0)
                {
                    --grammarPage;
                }
                EditorGUILayout.LabelField($"{grammarPage + 1}/{pageCount + 1}", new GUIStyle(GUI.skin.label)
                {
                    alignment = TextAnchor.MiddleCenter
                });
                if (GUILayout.Button("Next") && grammarPage < pageCount)
                {
                    ++grammarPage;
                }
                EditorGUILayout.EndHorizontal();
            }
            EditorGUILayout.LabelField("Filters", EditorStyles.boldLabel);

            DrawNameFilter();
            sourceFilter    = (GrammarSource)EditorGUILayout.EnumPopup("Source", sourceFilter);
            grammarsPerPage = EditorGUILayout.IntField(new GUIContent("Items per page", "0 = unlimited"), grammarsPerPage);
            localOnly       = EditorGUILayout.Toggle(new GUIContent("Local only", "Filter out not downloaded grammars."), localOnly);
        }