public void Visit(OrderedChoice expression, Nonterminal context) { foreach (var item in expression.Expressions) { item.Accept(this, context); } }
public virtual void Visit(OrderedChoice expression, T context) { foreach (var current in expression.Expressions) { current.Accept(this, context); } }
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); }
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); }
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); }
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); }
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); }