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