예제 #1
0
 public static PipelinePayload FromSlrParserPayload(SlrParserPayload slrParserPayload)
 {
     return(new PipelinePayload
     {
         Grammar = slrParserPayload.Grammar,
         Lexer = slrParserPayload.Lexer
     });
 }
예제 #2
0
        public void Test__NumericGrammar()
        {
            // Arrange
            var grammar = GrammarBuilder.New <NumericEnums.NonTerminals, NumericEnums.Terminals>()
                          .Init()
                          .WithStartSymbol(NumericEnums.NonTerminals.E)
                          .WithEpsilon(NumericEnums.Terminals.Epsilon)
                          .WithEof(NumericEnums.NonTerminals.Root, NumericEnums.Terminals.Eof)
                          .WithProduction(NumericEnums.NonTerminals.E, x =>
            {
                x.NonTerminal(NumericEnums.NonTerminals.E);
                x.Terminal(NumericEnums.Terminals.Multiply);
                x.NonTerminal(NumericEnums.NonTerminals.E);
                x.Order(3);
            })
                          .WithProduction(NumericEnums.NonTerminals.E, x =>
            {
                x.NonTerminal(NumericEnums.NonTerminals.E);
                x.Terminal(NumericEnums.Terminals.Plus);
                x.NonTerminal(NumericEnums.NonTerminals.E);
                x.Order(2);
            })
                          .WithProduction(NumericEnums.NonTerminals.E, x =>
            {
                x.Terminal(NumericEnums.Terminals.Number);
                x.Order(1);
            })
                          .Build();

            var payload = new SlrParserPayload
            {
                Grammar = grammar,
                Lexer   = x =>
                {
                    var map = x.GroupBy(y => y.Name)
                              .ToDictionary(y => y.Key, y => y.First());

                    return(ImmutableList <ITerminal> .Empty
                           .Add(map[NumericEnums.Terminals.Number])
                           .Add(map[NumericEnums.Terminals.Plus])
                           .Add(map[NumericEnums.Terminals.Number])
                           .Add(map[NumericEnums.Terminals.Multiply])
                           .Add(map[NumericEnums.Terminals.Number]));
                }
            };

            var str = grammar.ToString();

            // Act
            var result = _logic.Resolve(payload);

            var statesStr = result.States.Print();

            // Assert
            Assert.NotEmpty(result.States);
        }
예제 #3
0
        public PipelinePayload Resolve(SlrParserPayload pipelinePayload)
        {
            var payload = PipelinePayload.FromSlrParserPayload(pipelinePayload);

            var pipeline = new Pipeline <PipelinePayload>()
                           .Add <AugmentGrammarPipelineStep>()
                           .Add <ParseStatePipelineStep>()
                           .Add <ParseTablePipelineStep>()
                           .Add <LrParsePipelineStep>();

            pipeline.Execute(payload);

            return(payload);
        }