Beispiel #1
0
        public bool TryGetNonterminalFactory(Rule rule, out SemanticNonterminalFactory <T> factory)
        {
            Initialize();
            if (nonterminalFactories.TryGetValue(rule, out factory))
            {
                return(true);
            }
            SemanticTrimFactory <T> trimFactory;

            if (trimFactories.TryGetValue(rule, out trimFactory))
            {
                factory = trimFactory;
                return(true);
            }
            return(false);
        }
Beispiel #2
0
 protected virtual void RegisterNonterminalFactory(Rule rule, SemanticNonterminalFactory <T> factory)
 {
     if (rule == null)
     {
         throw new ArgumentNullException("rule");
     }
     if (rule.Owner != grammar)
     {
         throw new ArgumentException("The rule was defined on another grammar", "rule");
     }
     if (factory == null)
     {
         throw new ArgumentNullException("factory");
     }
     AssertNotInitialized();
     nonterminalFactories.Add(rule, factory);
 }
        private void ProcessAttribute <TU>(ICollection <string> errors, bool strongParameterCheck, RuleAttribute ruleAttribute, Type type, TU methodBase, GetFactoryType <TU> getFactoryType) where TU : MethodBase
        {
            Rule rule = ruleAttribute.Bind(Grammar);

            if (rule == null)
            {
                errors.Add(string.Format("Rule {0} not found in grammar", ruleAttribute.Rule));
            }
            else
            {
                try {
                    Type factoryType;
                    TU   factoryConstructor;
                    getFactoryType(methodBase, ruleAttribute, type, out factoryType, out factoryConstructor);
                    int[] parameterMapping = ParameterMapping(strongParameterCheck, rule, ruleAttribute, methodBase);
                    SemanticNonterminalFactory <T> nonterminalFactory = CreateNonterminalFactory(factoryType, factoryConstructor, parameterMapping, rule.SymbolCount);
                    RegisterNonterminalFactory(rule, nonterminalFactory);
                } catch (TargetInvocationException ex) {
                    errors.Add(string.Format("Rule {0} factory problem: {1}", rule, ex.InnerException.Message));
                } catch (Exception ex) {
                    errors.Add(string.Format("Rule {0} factory problem: {1}", rule, ex.Message));
                }
            }
        }
 protected override void RegisterNonterminalFactory(Rule rule, SemanticNonterminalFactory <T> factory)
 {
     base.RegisterNonterminalFactory(rule, factory);
     MemorizeType(factory, rule.RuleSymbol);
 }