public bool CallSubLexer <TSubToken>(SubLexerInvokeInfo <TSubToken> invokeInfo, out Lexeme <TSubToken> result) where TSubToken : unmanaged, Enum { var offset = TextPointer; var textSource = LexemeSource.TextSource.Slice(offset); var lexer = invokeInfo.Lexer; var lexemeSource = lexer.GetLexemeSource(textSource); var enumerator = lexemeSource.GetEnumerator(); result = default; try { if (enumerator.MoveNext() == false) { return(false); } if (lexer.GetIntValue(result.Token) != lexer.GetIntValue(invokeInfo.Rule.Token)) { return(false); } result = enumerator.Current; result.StartField += offset; result.EndField += offset; LexemeSource.Position = offset + result.End - result.Start; AdvanceInstructionPosition(); return(true); } catch { return(false); } finally { enumerator.Dispose(); lexemeSource.Dispose(); } }
private Entry CreateSubLexerEntry <TSubToken>(Grammar <TToken> .SubLexerEntry <TSubToken> subLexerEntry) where TSubToken : unmanaged, Enum { var subLexerInvokeInfo = new SubLexerInvokeInfo <TSubToken>(subLexerEntry); return(new ParserPredicateEntry <Lexeme <TSubToken> >(subLexerEntry, c => subLexerInvokeInfo.SubLex(c), ParserPredicateKind.SubLexer)); }