예제 #1
0
                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();
                    }
                }
예제 #2
0
            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));
            }