Beispiel #1
0
        public static Grammar Parse(List <string> grammarStringLines)
        {
            var numOfNonTerminalSymbols = int.Parse(grammarStringLines[0]);
            var numOfTerminalSymbols    = int.Parse(grammarStringLines[1]);
            var numOfRules = int.Parse(grammarStringLines[2]);

            var nonTerminals = new List <NonTerminalSymbol>();

            foreach (var nonTerminalStringLine in grammarStringLines.Skip(3).Take(numOfNonTerminalSymbols))
            {
                nonTerminals.Add(new NonTerminalSymbol(nonTerminalStringLine));
            }

            var terminals = new List <TerminalSymbol>();

            foreach (var terminalStringLine in grammarStringLines.Skip(3 + numOfNonTerminalSymbols).Take(numOfTerminalSymbols))
            {
                terminals.Add(new TerminalSymbol(terminalStringLine));
            }

            var rulesStrings = new List <string>();

            foreach (var ruleStringLine in grammarStringLines.Skip(3 + numOfNonTerminalSymbols + numOfTerminalSymbols).Take(numOfRules))
            {
                rulesStrings.Add(ruleStringLine);
            }

            var possibleSymbols = new List <Symbol>();

            possibleSymbols.AddRange(nonTerminals);
            possibleSymbols.AddRange(terminals);
            var rules = RuleParser.ParseRules(rulesStrings, possibleSymbols);

            return(new Grammar(nonTerminals, terminals, rules));
        }
Beispiel #2
0
        static void Main(string[] args)
        {
            RuleParser.ParseRules();
            RuleParser.testGetRuleLineType();

            //var glos = GlossaryParser.GetGlossary();
            //GlossaryParser.PrintGlossary(glos);
        }
        public void VerifyPassword_ForInvalidPart2_ShouldReturnFalse()
        {
            string raw      = "1-3 b: cdefg";
            string password = String.Empty;

            RuleParser ruleParser = new RuleParser();

            ruleParser.ParseRules(raw.Substring(0, raw.IndexOf(':')));

            PasswordValidator passValidator = new PasswordValidator(ruleParser, raw.Substring(raw.IndexOf(':')));
            bool isValidPassword            = passValidator.IsPart2Valid();

            Assert.False(isValidPassword);
        }
        public void VerifyPassword_ForPart1_ShouldReturnTrue()
        {
            string raw      = "1-3 a: abcde";
            string password = String.Empty;

            RuleParser ruleParser = new RuleParser();

            ruleParser.ParseRules(raw.Substring(0, raw.IndexOf(':')));

            PasswordValidator passValidator = new PasswordValidator(ruleParser, raw.Substring(raw.IndexOf(':')));
            bool isValidPassword            = passValidator.IsPart1Valid();

            Assert.True(isValidPassword);
        }
Beispiel #5
0
        /// <summary>
        /// 新方法-加载所有规则
        /// </summary>
        public void LoadRules()
        {
            var files = Directory.GetFiles(config.RulefilesPath, "*.rule");

            if (files == null || files.Length == 0)
            {
                throw new Exception("rule文件不存在");
            }

            List <Region> regions  = new List <Region>();
            string        fileName = string.Empty;
            StringBuilder text     = new StringBuilder();

            files.ToList().ForEach(file =>
            {
                fileName     = Path.GetFileNameWithoutExtension(file);
                var fileText = File.ReadAllText(file);
                config.FileRegion[fileName] = RegionParser.ParseRegions(fileText.ToString());
                regions.AddRange(config.FileRegion[fileName]);
                text.AppendLine(fileText);
            });

            if (regions == null || regions.Count == 0)
            {
                throw new Exception("region不存在");
            }

            regions.ForEach(region =>
            {
                var rules = RuleParser.ParseRules(region.RegionContent);

                if (regions == null || regions.Count == 0)
                {
                    throw new Exception(string.Format("region '{0}' 无法找到rule", region.RegionName));
                }

                rules.ForEach(rule =>
                {
                    rule.RegionName = region.RegionName;
                });

                rules.ForEach(rule =>
                {
                    var key = string.Format("{0}.{1}", rule.RegionName, rule.RuleName);
                    config.RuleDefinations[key] = rule;
                });
            });
        }
Beispiel #6
0
        /// <summary>
        /// 原方法-加载所有规则
        /// </summary>
        public void LoadRules0()
        {
            var files = System.IO.Directory.GetFiles(config.RulefilesPath, "*.rule");

            if (files == null || files.Length == 0)
            {
                throw new Exception("rule文件不存在");
            }

            StringBuilder text = new StringBuilder();

            files.ToList().ForEach(file =>
            {
                var fileText = System.IO.File.ReadAllText(file);
                text.AppendLine(fileText);
            });

            List <Region> regions = RegionParser.ParseRegions(text.ToString());

            if (regions == null || regions.Count == 0)
            {
                throw new Exception("region不存在");
            }

            regions.ForEach(region =>
            {
                var rules = RuleParser.ParseRules(region.RegionContent);

                if (regions == null || regions.Count == 0)
                {
                    throw new Exception(string.Format("region '{0}' 无法找到rule", region.RegionName));
                }

                rules.ForEach(rule =>
                {
                    rule.RegionName = region.RegionName;
                });

                rules.ForEach(rule =>
                {
                    var key = string.Format("{0}.{1}", rule.RegionName, rule.RuleName);
                    config.RuleDefinations[key] = rule;
                });
            });
        }
        public void ParsePasswordRules_WithSimpleText_ShouldReturnRules()
        {
            string raw         = "1-3 a: abcde";
            int    minRequired = 0;
            int    maxRequired = 0;
            char   pattern     = ' ';

            RuleParser ruleParser = new RuleParser();

            ruleParser.ParseRules(raw.Substring(0, raw.IndexOf(':')));

            minRequired = ruleParser.Min;
            maxRequired = ruleParser.Max;
            pattern     = ruleParser.Pattern;

            Assert.Equal(1, minRequired);
            Assert.Equal(3, maxRequired);
            Assert.Equal('a', pattern);
        }
        public void CountValidPasswords_WithDefaultInput_ShouldReturn2()
        {
            string[] input = new string[] {
                "1-3 a: abcde",
                "1-3 b: cdefg",
                "2-9 c: ccccccccc"
            };
            int total = 0;

            for (int i = 0; i < input.Length; i++)
            {
                string     raw        = input[i];
                RuleParser ruleParser = new RuleParser();
                ruleParser.ParseRules(raw.Substring(0, raw.IndexOf(':')));
                PasswordValidator passValidator = new PasswordValidator(ruleParser, raw.Substring(raw.IndexOf(':')));
                if (passValidator.IsPart1Valid())
                {
                    total += 1;
                }
            }

            Assert.Equal(2, total);
        }
Beispiel #9
0
        /// <summary>
        /// Bagr.Cmd entry point
        /// </summary>
        /// <param name="args">Command line arguments (not used)</param>
        static void Main(string[] args)
        {
            var filePath = "./input";
            var reader   = new FileReader();
            // Normalize line endings.  Bake this into the fileReader class soon.
            var contents = reader.ReadFile(filePath).Replace("\r\n", "\n");

            var formatter = new RecordFormatter(null);

            var ruleStrings = formatter.FormatRecord(contents, "\n", true);

            var parser = new RuleParser();

            var parsedRules = parser.ParseRules(ruleStrings);

            var bagColors = parser.FindBagColorsContainingBag(parsedRules, "shiny gold");

            Console.WriteLine(bagColors.Count());

            // Subtract 1 because we only care about what's in our bag
            var sumOfContents = parser.FindSumOfContents(parsedRules, "shiny gold") - 1;

            Console.WriteLine(sumOfContents);
        }