diff --git a/src/RCParsing/ParserBuilder.cs b/src/RCParsing/ParserBuilder.cs index 7bd8003..90dbb0f 100644 --- a/src/RCParsing/ParserBuilder.cs +++ b/src/RCParsing/ParserBuilder.cs @@ -1,13 +1,9 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.Data; using System.Linq; -using System.Text; using RCParsing.Building; using RCParsing.Building.ParserRules; using RCParsing.Building.TokenPatterns; -using RCParsing.ParserRules; using RCParsing.TokenPatterns; using RCParsing.Utils; @@ -69,7 +65,6 @@ public TokenBuilder CreateToken(string name) { if (_tokenPatterns.ContainsKey(name)) throw new ArgumentException($"Token with name '{name}' already exists."); - var token = new TokenBuilder(); _tokenPatterns[name] = token; return token; @@ -114,6 +109,33 @@ public TokenBuilder GetOrCreateToken(string name) return token; } + /// + /// Renames a token pattern. If the new name already exists, it will not be renamed and will be returned. + /// + /// The current name of the token pattern. + /// The new name for the token pattern. Must be unique among all token patterns. + /// if the token pattern was successfully renamed; otherwise, . + public bool RenameToken(string oldName, string newName) + { + if (!_tokenPatterns.TryGetValue(oldName, out var token)) + return false; + if (_tokenPatterns.ContainsKey(newName)) + return false; + _tokenPatterns.Remove(oldName); + _tokenPatterns[newName] = token; + return true; + } + + /// + /// Removes a token pattern by its name. If the token pattern does not exist, it will not be removed and will be returned. + /// + /// The name of the token pattern to remove. + /// if the token pattern was successfully removed; otherwise, . + public bool RemoveToken(string name) + { + return _tokenPatterns.Remove(name); + } + /// /// Creates a rule builder and registers it under the given name. /// @@ -124,7 +146,6 @@ public RuleBuilder CreateRule(string name) { if (_rules.ContainsKey(name)) throw new ArgumentException($"Rule with name '{name}' already exists."); - var rule = new RuleBuilder(); _rules[name] = rule; return rule; @@ -169,6 +190,33 @@ public RuleBuilder GetOrCreateRule(string name) return rule; } + /// + /// Renames a rule. If the new name already exists, it will not be renamed and will be returned. + /// + /// The current name of the rule. + /// The new name for the rule. Must be unique among all rules. + /// if the rule was successfully renamed; otherwise, . + public bool RenameRule(string oldName, string newName) + { + if (!_rules.TryGetValue(oldName, out var rule)) + return false; + if (_rules.ContainsKey(newName)) + return false; + _rules.Remove(oldName); + _rules[newName] = rule; + return true; + } + + /// + /// Removes a rule by its name. If the rule does not exist, it will not be removed and will be returned. + /// + /// The name of the rule to remove. + /// if the rule was successfully removed; otherwise, . + public bool RemoveRule(string name) + { + return _rules.Remove(name); + } + /// /// Creates a rule builder and registers it as the main rule. /// @@ -181,7 +229,6 @@ public RuleBuilder CreateMainRule() { if (_mainRuleBuilder != null) throw new ArgumentException("Main rule has already been set."); - _mainRuleBuilder = new RuleBuilder(); return _mainRuleBuilder; } @@ -201,7 +248,6 @@ public RuleBuilder CreateMainRule(string name) throw new ArgumentException("Main rule has already been set."); if (_rules.ContainsKey(name)) throw new ArgumentException($"Rule with name '{name}' already exists."); - _mainRuleBuilder = new RuleBuilder(); _rules[name] = _mainRuleBuilder; return _mainRuleBuilder; @@ -230,6 +276,74 @@ public RuleBuilder GetMainRule() return null; } + /// + /// Gets or creates the main rule builder. If no main rule exists, it will be created and returned. + /// + /// A instance for building the main rule. + public RuleBuilder? GetOrCreateMainRule() + { + if (_mainRuleBuilder != null) + return _mainRuleBuilder; + _mainRuleBuilder = new RuleBuilder(); + return _mainRuleBuilder; + } + + /// + /// Gets the main rule name. If no main rule exists or the main rule has no name, it will return . + /// + /// The name of the main rule or if no main rule exists. + public string? GetMainRuleName() + { + if (_mainRuleBuilder == null) + return null; + return _rules.FirstOrDefault(r => r.Value == _mainRuleBuilder).Key; + } + + /// + /// Renames the main rule. If the new name already exists, it will not be renamed and will be returned. + /// + /// The new name for the main rule. Must be unique among all rules. + /// if the main rule was successfully renamed; otherwise, . + public bool NameMainRule(string name) + { + if (_mainRuleBuilder == null) + return false; + if (_rules.ContainsKey(name)) + return false; + var oldName = _rules.FirstOrDefault(r => r.Value == _mainRuleBuilder).Key; + if (oldName != null) + _rules.Remove(oldName); + _rules[name] = _mainRuleBuilder; + return true; + } + + /// + /// Removes the name from main rule. If main rule not exists or the main rule has no name, name will not be removed and will be returned. + /// + /// if the name was successfully removed; otherwise, . + public bool RemoveMainRuleName() + { + if (_mainRuleBuilder == null) + return false; + var oldName = _rules.FirstOrDefault(r => r.Value == _mainRuleBuilder).Key; + return oldName != null && _rules.Remove(oldName); + } + + /// + /// Removes the main rule completely. If no main rule exists, it will not be removed and will be returned. + /// + /// if the main rule was successfully removed; otherwise, . + public bool RemoveMainRule() + { + if (_mainRuleBuilder == null) + return false; + var oldName = _rules.FirstOrDefault(r => r.Value == _mainRuleBuilder).Key; + if (oldName != null) + _rules.Remove(oldName); + _mainRuleBuilder = null; + return true; + } + /// diff --git a/src/RCParsing/RCParsing.csproj b/src/RCParsing/RCParsing.csproj index 4a55ad3..5ba2fe8 100644 --- a/src/RCParsing/RCParsing.csproj +++ b/src/RCParsing/RCParsing.csproj @@ -8,7 +8,7 @@ RCParsing - 5.2.0 + 5.2.1 Roman K. RomeCore RCParsing