public void ShouldFeedAndReduceUsingAnyTerminalPredicate() { Automaton automaton; IAutomatonTable <char> automatonTable; INonTerminalNode <char> node; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "B*=abc;", "A*=a.c;" }); automaton = new Automaton(automatonTable); automaton.Feed('a'); automaton.Feed('b'); automaton.Feed('c'); Assert.AreEqual(3, automaton.StackCount); Assert.IsTrue(automaton.CanAccept()); node = automaton.Accept(); Assert.AreEqual("B", node.Input.Name); automaton.Feed('a'); automaton.Feed('c'); automaton.Feed('c'); Assert.AreEqual(3, automaton.StackCount); Assert.IsTrue(automaton.CanAccept()); node = automaton.Accept(); Assert.AreEqual("A", node.Input.Name); }
public void MayNotAcceptUsingReduction() { Automaton automaton; INonTerminalNode <char> node; IAutomatonTable <char> automatonTable; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A=abc;", "B=def;", "E*={A}|{B};" }); automaton = new Automaton(automatonTable); Assert.IsFalse(automaton.CanAccept()); Assert.ThrowsException <InvalidOperationException>(() => automaton.Accept()); automaton.Feed('a'); Assert.IsFalse(automaton.CanAccept()); Assert.ThrowsException <InvalidOperationException>(() => automaton.Accept()); automaton.Feed('b'); Assert.IsFalse(automaton.CanAccept()); Assert.ThrowsException <InvalidOperationException>(() => automaton.Accept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); node = automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); Assert.AreEqual("E", node.Input.Name); Assert.AreEqual(1, node.Nodes.Count()); }
public void ShouldFeedAndReduceLeftRecursiveRules() { Automaton automaton; IAutomatonTable <char> automatonTable; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "A*=a{S}a;", "S={S}b;", "S=c;" }); automaton = new Automaton(automatonTable); // aca automaton.Reset(); automaton.Feed('a'); automaton.Feed('c'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('a'); Assert.IsTrue(automaton.CanAccept()); automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); // acba automaton.Reset(); automaton.Feed('a'); automaton.Feed('c'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('b'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('a'); Assert.IsTrue(automaton.CanAccept()); automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); // acbbba automaton.Reset(); automaton.Feed('a'); automaton.Feed('c'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('b'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('b'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('b'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('a'); Assert.IsTrue(automaton.CanAccept()); automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); }
public void ShouldFeedAndReduceGreedy() { Automaton automaton; IAutomatonTable <char> automatonTable; INonTerminalNode <char> node; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A*=ab{C}*;", "C=c;" }); automaton = new Automaton(automatonTable); automaton.Feed('a'); automaton.Feed('b'); Assert.IsTrue(automaton.CanAccept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); node = automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); }
public void ShouldFeedGreedy() { Automaton automaton; IAutomatonTable <char> automatonTable; INonTerminalNode <char> node; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A*=abc*;" }); automaton = new Automaton(automatonTable); automaton.Feed('a'); automaton.Feed('b'); automaton.Feed('c'); Assert.AreEqual(3, automaton.StackCount); Assert.IsTrue(automaton.CanAccept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); node = automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); Assert.AreEqual(6, node.Nodes.Count()); }
public void ShouldAccept() { Automaton automaton; INonTerminalNode <char> node; IAutomatonTable <char> automatonTable; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A*=abc;" }); automaton = new Automaton(automatonTable); automaton.Feed('a'); automaton.Feed('b'); automaton.Feed('c'); Assert.AreEqual(3, automaton.StackCount); Assert.IsTrue(automaton.CanAccept()); node = automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); Assert.AreEqual(3, node.Nodes.Count()); Assert.AreEqual(0, automaton.StackCount); // ensure that child order is correct Assert.AreEqual('a', ((TerminalNode <char>)node.Nodes.ElementAt(0)).Input.Value); Assert.AreEqual('b', ((TerminalNode <char>)node.Nodes.ElementAt(1)).Input.Value); Assert.AreEqual('c', ((TerminalNode <char>)node.Nodes.ElementAt(2)).Input.Value); }
public void ShouldRecursiveAccept() { Automaton automaton; IAutomatonTable <char> automatonTable; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "A*=ab{B};", "B={C};", "C={D};", "D=c;" }); automaton = new Automaton(automatonTable); automaton.Feed('a'); automaton.Feed('b'); automaton.Feed('c'); Assert.AreEqual(3, automaton.StackCount); Assert.IsTrue(automaton.CanAccept()); automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); }
public void ShouldFeedAndReduceUsingTerminalRange() { Automaton automaton; IAutomatonTable <char> automatonTable; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "A*=a{B}[c-z];", "B=b;" }); automaton = new Automaton(automatonTable); automaton.Feed('a'); automaton.Feed('b'); automaton.Feed('c'); Assert.AreEqual(3, automaton.StackCount); Assert.IsTrue(automaton.CanAccept()); automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); }
public void ShouldReturnCanAccept() { Automaton automaton; IAutomatonTable <char> automatonTable; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new string[] { "A*=abc;" }); automaton = new Automaton(automatonTable); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('a'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('b'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('c'); Assert.IsTrue(automaton.CanAccept()); automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); }
public void ShouldFeedAndReduce() { Automaton automaton; IAutomatonTable <char> automatonTable; automatonTable = AutomatonTableHelper.BuildAutomatonTable(new String[] { "A*=a{BCD}e;", "BCD=b{C}d;", "C=c;" }); automaton = new Automaton(automatonTable); automaton.Feed('a'); automaton.Feed('b'); automaton.Feed('c'); Assert.AreEqual(3, automaton.StackCount); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('d'); Assert.IsFalse(automaton.CanAccept()); automaton.Feed('e'); Assert.IsTrue(automaton.CanAccept()); automaton.Accept(); Assert.IsFalse(automaton.CanAccept()); }