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