public IRule Parse(IParserImmutableContext context) { var(name, rulePattern, tokenPattern) = this.TryParse(context); if (string.IsNullOrEmpty(name)) { throw new UserRuleParserBadNameException(); } if (string.IsNullOrEmpty(rulePattern)) { throw new UserRuleParserBadRulePatternException(); } if (string.IsNullOrEmpty(tokenPattern)) { throw new UserRuleParserBadTokenExpressionException(); } var tokenExpression = this.ParseTokenExpression(tokenPattern); if (tokenExpression == null) { throw new UserRuleParserBadTokenExpressionException(); } var rule = new UserRule(name: name, rulePattern: rulePattern, tokenConvertionPattern: tokenExpression); if (!rule.IsValid(context)) { throw new UserRuleParserBadTokenExpressionException(); } DefaultParserContext.GlobalContext.ParsedRules.Push(rule); return(rule); }