public ParserStateEntry(string name, FiniteState state, bool fragment, bool tryReturn) : base(state) { Fragment = fragment; TryReturn = tryReturn; ParserEntryData = new ParserEntryData(name, this); }
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); }
public ParserPredicateEntry(Grammar <TToken> .ParserEntry grammarEntry, Func <AutomataContext, PredicateResult> predicate) : base(predicate) { ParserEntryData = new ParserEntryData(EnsureName(grammarEntry), this); }
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)) });