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