Ejemplo n.º 1
0
 public ParserStateEntry(string name, FiniteState state, bool fragment, bool tryReturn) : base(state)
 {
     Fragment        = fragment;
     TryReturn       = tryReturn;
     ParserEntryData = new ParserEntryData(name, this);
 }
Ejemplo n.º 2
0
 public ParserSetMatchEntry(Grammar <TToken> .TokenRuleSet grammarEntry) : base(grammarEntry.TokenRules.Select(CreateLexerEntry))
 {
     ParserEntryData = new ParserEntryData(EnsureName(grammarEntry), this);
 }
 public ParserActionEntry(Grammar <TToken> .ParserAction grammarEntry) : base(CreateActionDelegate(grammarEntry.ActionEntry))
 {
     ParserEntryData = new ParserEntryData(EnsureName(grammarEntry), this);
 }
Ejemplo n.º 4
0
 public ParserPredicateEntry(Grammar <TToken> .ParserEntry grammarEntry, Func <AutomataContext, PredicateResult> predicate) : base(predicate)
 {
     ParserEntryData = new ParserEntryData(EnsureName(grammarEntry), this);
 }
Ejemplo n.º 5
0
 public ParserPredicateEntry(Grammar <TToken> .ParserPredicate grammarEntry) : base(CreatePredicateDelegate(grammarEntry.PredicateEntry))
 {
     ParserEntryData = new ParserEntryData(EnsureName(grammarEntry), this);
 }
                private void BuildConsumeResult(ILBuilderContext ilBuilderContext, LocalBuilder resultLocal, ParserEntryData parserEntry)
                {
                    if (parserEntry == null || parserEntry.FlatIndex == -1)
                    {
                        return;
                    }

                    var parserProduction = parserEntry.ParserProduction;
                    var parserTransition = parserProduction;
                    var argumentBuilder  = parserTransition.Binder.Template[parserEntry.FlatIndex];

                    ilBuilderContext.EmitLdContext();
                    ilBuilderContext.IL.Emit(OpCodes.Call, PeekStateEntryMethodInfo);
                    ilBuilderContext.IL.Emit(OpCodes.Ldfld, ProductionInstanceBuilderArgumentsFieldInfo);

                    ilBuilderContext.IL.Emit(OpCodes.Ldc_I4, parserEntry.FlatIndex);
                    ilBuilderContext.IL.Emit(OpCodes.Ldelem_Ref);

                    ilBuilderContext.IL.Emit(OpCodes.Ldloc, resultLocal);
                    ilBuilderContext.IL.Emit(OpCodes.Callvirt, PredicateResultGetResultMethodInfo);

                    if (argumentBuilder is ParserArgumentBuilder parserArgumentBuilder)
                    {
                        parserArgumentBuilder.EmitConsumeValue(ilBuilderContext);
                    }
                    else if (argumentBuilder is LexerArgumentBuilder lexerArgumentBuilder)
                    {
                        ilBuilderContext.IL.Emit(OpCodes.Unbox_Any, typeof(Lexeme <>).MakeGenericType(lexerArgumentBuilder.TokenType));
                        lexerArgumentBuilder.EmitConsumeValue(this, ilBuilderContext);
                    }

                    if (parserProduction.Binder.TryReturn)
                    {
                        ilBuilderContext.EmitLdContext();
                        ilBuilderContext.IL.Emit(OpCodes.Ldc_I4, parserEntry.FlatIndex);
                        ilBuilderContext.IL.Emit(OpCodes.Call, OnAfterConsumeValueMethodInfo);
                    }
                }
 public ParserSingleMatchEntry(string name, TToken operand) : base(operand)
 {
     ParserEntryData = new ParserEntryData(name, this);
 }
                protected static ArgumentBuilder CreateArgumentBuilder(Type type, ParameterInfo parameterInfo, ParserEntryData flatEntryData)
                {
                    var parserEntry = flatEntryData.ParserEntry;

                    return(parserEntry switch
                    {
                        IParserPredicate parserPredicateEntry => CreatePredicateArgumentBuilder(type, parserPredicateEntry),
                        ParserSetMatchEntry parserSetMatchEntry => CreateLexerArgumentBuilder(type, null, parserSetMatchEntry),
                        ParserSingleMatchEntry parserSingleMatchEntry => CreateLexerArgumentBuilder(type, null, parserSingleMatchEntry),
                        ParserStateEntry parserStateEntry => CreateParserArgumentBuilder(type),

                        _ => throw new ArgumentOutOfRangeException(nameof(parserEntry))
                    });