예제 #1
0
        public void ShouldBuildAutomatonTableFromTwoSequencesUsingAnyTerminal()
        {
            AutomatonTableFactory <char> factory;
            IAutomatonTable <char>       automatonTable;
            LexicalRule          rule1, rule2;
            AutomatonTableParser parser;

            factory = new AutomatonTableFactory <char>();

            rule1 = RuleHelper.BuildRule("A*=a.c;");
            rule2 = RuleHelper.BuildRule("B*=abc;");

            automatonTable = factory.BuildAutomatonTable(SituationCollectionFactoryHelper.BuildSituationCollectionFactory(new LexicalRule[] { rule1, rule2 }), new DistinctInputFactory(new RangeValueProvider()));
            Assert.IsNotNull(automatonTable);

            parser = new AutomatonTableParser(automatonTable);


            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('a')));
            Assert.AreEqual(3, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('b')));
            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('c')));

            parser.Reset();

            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('a')));
            Assert.AreEqual(3, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('c')));
            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('c')));
        }
예제 #2
0
파일: GraphHelper.cs 프로젝트: dfgs/FSMLib
        public static IAutomatonTable <char> BuildAutomatonTable(IEnumerable <string> Rules)
        {
            IAutomatonTableFactory <char>     automatonTableFactory;
            IAutomatonTable <char>            automatonTable;
            SituationCollectionFactory <char> situationCollectionFactory;
            DistinctInputFactory distinctInputFactory;

            distinctInputFactory       = new DistinctInputFactory(new RangeValueProvider());
            automatonTableFactory      = new AutomatonTableFactory <char>( );
            situationCollectionFactory = new SituationCollectionFactory <char>(SituationGraphHelper.BuildSituationGraph(Rules.Select(item => RuleHelper.BuildRule(item)).ToArray()));
            automatonTable             = automatonTableFactory.BuildAutomatonTable(situationCollectionFactory, distinctInputFactory);

            return(automatonTable);
        }
예제 #3
0
        public void ShouldBuildAutomatonTableFromExtendedSequence()
        {
            AutomatonTableFactory <char> factory;
            IAutomatonTable <char>       automatonTable;
            LexicalRule          rule;
            Sequence             predicate;
            AutomatonTableParser parser;

            factory = new AutomatonTableFactory <char>( );

            predicate = new Sequence();
            predicate.Items.Add(new Terminal('a'));
            predicate.Items.Add(new Terminal('b'));
            predicate.Items.Add(new Terminal('c'));

            rule = new LexicalRule()
            {
                Name = "rule", IsAxiom = true
            };
            rule.Predicate = new ZeroOrMore()
            {
                Item = predicate
            };

            automatonTable = factory.BuildAutomatonTable(SituationCollectionFactoryHelper.BuildSituationCollectionFactory(rule.AsEnumerable()), new DistinctInputFactory(new RangeValueProvider()));
            Assert.IsNotNull(automatonTable);

            parser = new AutomatonTableParser(automatonTable);

            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('a')));
            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('b')));
            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('c')));
            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('a')));
        }
예제 #4
0
        public void ShouldBuildAutomatonTableFromBasicSequence()
        {
            AutomatonTableFactory <char> factory;
            IAutomatonTable <char>       automatonTable;
            LexicalRule          rule;
            AutomatonTableParser parser;

            factory = new AutomatonTableFactory <char>(  );

            rule = RuleHelper.BuildRule("A*=abc;");

            automatonTable = factory.BuildAutomatonTable(SituationCollectionFactoryHelper.BuildSituationCollectionFactory(rule.AsEnumerable()), new DistinctInputFactory(new RangeValueProvider()));
            Assert.IsNotNull(automatonTable);

            parser = new AutomatonTableParser(automatonTable);

            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('a')));
            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('b')));
            Assert.AreEqual(1, parser.ActionCount);
            Assert.IsTrue(parser.Parse(new TerminalInput('c')));
        }
예제 #5
0
 private void CreateSyntaxicView(params string[] Rules)
 {
     CreateView(syntaxicAutomatonTableFactory.BuildAutomatonTable(
                    FSMLib.SyntaxicAnalysis.Helpers.SituationCollectionFactoryHelper.BuildSituationCollectionFactory(Rules.Select(item => FSMLib.SyntaxicAnalysis.Helpers.RuleHelper.BuildRule(item))), new FSMLib.SyntaxicAnalysis.Tables.DistinctInputFactory(new FSMLib.SyntaxicAnalysis.RangeValueProvider()))
                );
 }