Exemple #1
0
 public void Visit(OrderedChoice expression, Nonterminal context)
 {
     foreach (var item in expression.Expressions)
     {
         item.Accept(this, context);
     }
 }
Exemple #2
0
 public virtual void Visit(OrderedChoice expression, T context)
 {
     foreach (var current in expression.Expressions)
     {
         current.Accept(this, context);
     }
 }
Exemple #3
0
        public void TestGrammar1NonterminalAndNonterminalChoice()
        {
            TestGrammar1 grammar     = TestGrammar1.Create();
            Nonterminal  nonterminal = grammar.GetNonterminal(o => o.NonterminalAndNonterminalChoice());

            Assert.AreEqual("NonterminalAndNonterminalChoice", nonterminal.Name);
            OrderedChoice orderedChoice = (OrderedChoice)nonterminal.Expression;

            Assert.AreEqual("LetterA", ((Nonterminal)orderedChoice.Expressions[0]).Name);
            Assert.AreEqual("LetterB", ((Nonterminal)orderedChoice.Expressions[1]).Name);
        }
Exemple #4
0
        public void TestGrammar1LetterChoice()
        {
            TestGrammar1 grammar     = TestGrammar1.Create();
            Nonterminal  nonterminal = grammar.GetNonterminal(o => o.LetterChoice());

            Assert.AreEqual("LetterChoice", nonterminal.Name);
            OrderedChoice orderedChoice = (OrderedChoice)nonterminal.Expression;

            Assert.AreEqual('a', ((CharacterTerminal)orderedChoice.Expressions[0]).Character);
            Assert.AreEqual('b', ((CharacterTerminal)orderedChoice.Expressions[1]).Character);
        }
Exemple #5
0
        public void TestGrammarThreeChoices()
        {
            TestGrammar1 grammar     = TestGrammar1.Create();
            Nonterminal  nonterminal = grammar.GetNonterminal(o => o.ThreeChoices());

            Assert.AreEqual("ThreeChoices", nonterminal.Name);
            OrderedChoice orderedChoice = (OrderedChoice)nonterminal.Expression;

            Assert.AreEqual("LetterA", ((Nonterminal)orderedChoice.Expressions[0]).Name);
            Assert.AreEqual("LetterB", ((Nonterminal)orderedChoice.Expressions[1]).Name);
            Assert.AreEqual('c', ((CharacterTerminal)orderedChoice.Expressions[2]).Character);
        }
Exemple #6
0
        public void TestGrammarTwoSequences()
        {
            TestGrammar1 grammar     = TestGrammar1.Create();
            Nonterminal  nonterminal = grammar.GetNonterminal(o => o.TwoSequences());

            Assert.AreEqual("TwoSequences", nonterminal.Name);
            OrderedChoice orderedChoice = (OrderedChoice)nonterminal.Expression;
            Sequence      sequence1     = (Sequence)orderedChoice.Expressions[0];
            Sequence      sequence2     = (Sequence)orderedChoice.Expressions[1];

            Assert.AreEqual("LetterA", ((Nonterminal)sequence1.Expressions[0]).Name);
            Assert.AreEqual("LetterB", ((Nonterminal)sequence1.Expressions[1]).Name);
            Assert.AreEqual("LetterB", ((Nonterminal)sequence2.Expressions[0]).Name);
            Assert.AreEqual("LetterA", ((Nonterminal)sequence2.Expressions[1]).Name);
        }
Exemple #7
0
        public static T Create(object[] args)
        {
            GrammarFactory <T> factory = new GrammarFactory <T>();
            T result = Proxy.CreateProxy <T>(factory.InvocationHandler);

            factory.grammar = result;
            result.NotifyCreated(args);

            // Now initialize the grammar
            foreach (MethodInfo method in typeof(T).GetMethods())
            {
                if (method.ReturnType == typeof(Expression) && method.GetParameters().Length == 0 && !method.IsSpecialName)
                {
                    Nonterminal rule = new Nonterminal();
                    rule.Name  = method.Name;
                    rule.Index = factory.nonterminalIndex++;
                    result.Nonterminals.Add(rule);

//                    if (method.HasAttribute<StartRuleAttribute>())
//                        result.StartRule = rule;

                    factory.rules[method.Name] = rule;
                }
            }
            foreach (MethodInfo method in typeof(T).GetMethods())
            {
                if (method.ReturnType == typeof(Expression) && method.GetParameters().Length == 0 && !method.IsSpecialName)
                {
                    method.Invoke(result, null);
                }
            }
            foreach (MethodInfo method in typeof(T).GetMethods())
            {
                if (method.ReturnType == typeof(Expression) && method.GetParameters().Length == 0 && !method.IsSpecialName)
                {
                    Nonterminal rule = factory.rules[method.Name];
                    if (method.HasAttribute <TokenizerAttribute>())
                    {
                        result.Tokenizer = rule;
                    }
                    TokenAttribute tokenAttribute = method.GetAttribute <TokenAttribute>();
                    if (tokenAttribute != null)
                    {
                        if (!tokenAttribute.TokenizeChildren)
                        {
                            rule.IsToken = true;
                            if (tokenAttribute.IsOmitted)
                            {
                                rule.IsTokenOmitted = true;
                            }
                        }
                        else
                        {
                            OrderedChoice children = (OrderedChoice)rule.Expression;
                            foreach (var child in children.Expressions)
                            {
                                Nonterminal childRule = (Nonterminal)child;
                                childRule.IsToken = true;
                            }
                        }
                    }
                }
            }

            FieldInfo tokenizerGrammarField = typeof(T).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where(o => typeof(Grammar).IsAssignableFrom(o.FieldType) && o.HasAttribute <TokenizerAttribute>()).FirstOrDefault();

            if (tokenizerGrammarField != null)
            {
                Grammar tokenizerGrammar = (Grammar)tokenizerGrammarField.GetValue(result);
                if (tokenizerGrammar.Tokenizer != null)
                {
                    result.SetTokenizer(tokenizerGrammar, tokenizerGrammar.Tokenizer);
                }
            }

            return(result);
        }
 public override void Visit(OrderedChoice expression, object context)
 {
     expressions.Add(expression);
     base.Visit(expression, context);
 }