public static ITypeDeclaration ParseBasicType(string Code, out DToken OptionalToken) { OptionalToken = null; var p = Create(new StringReader(Code)); p.Step(); // Exception: If we haven't got any basic types as our first token, return this token via OptionalToken if (!p.IsBasicType() || p.laKind == __LINE__ || p.laKind == __FILE__) { p.Step(); p.Peek(1); OptionalToken = p.t; // Only if a dot follows a 'this' or 'super' token we go on parsing; Return otherwise if (!((p.t.Kind == This || p.t.Kind == Super) && p.laKind == Dot)) { return(null); } } var bt = p.BasicType(); while (p.IsBasicType2()) { var bt2 = p.BasicType2(); bt2.InnerMost = bt; bt = bt2; } return(bt); }
DToken Peek(int n) { Lexer.StartPeek(); DToken x = la; while (n > 0) { x = Lexer.Peek(); n--; } return(x); }
public static ITypeDeclaration ParseBasicType(string Code,out DToken OptionalToken) { OptionalToken = null; var p = Create(new StringReader(Code)); p.Step(); // Exception: If we haven't got any basic types as our first token, return this token via OptionalToken if (!p.IsBasicType() || p.laKind == __LINE__ || p.laKind == __FILE__) { p.Step(); p.Peek(1); OptionalToken = p.t; // Only if a dot follows a 'this' or 'super' token we go on parsing; Return otherwise if (!((p.t.Kind == This || p.t.Kind == Super) && p.laKind == Dot)) return null; } var bt= p.BasicType(); while (p.IsBasicType2()) { var bt2 = p.BasicType2(); bt2.InnerMost = bt; bt = bt2; } return bt; }
/// <summary> /// Skips to the end of the current code block. /// For this, the lexer must have read the next token AFTER the token opening the /// block (so that Lexer.DToken is the block-opening token, not Lexer.LookAhead). /// After the call, Lexer.LookAhead will be the block-closing token. /// </summary> public void SkipCurrentBlock() { int braceCount = 0; // Scan already parsed tokens var tok = lookaheadToken; while (tok != null) { if (tok.Kind == DTokens.OpenCurlyBrace) braceCount++; else if (tok.Kind == DTokens.CloseCurlyBrace) { braceCount--; if (braceCount < 0) { lookaheadToken = tok; laKind = tok.Kind; return; } } tok = tok.next; } // Scan/proceed tokens rawly (skip them only until braceCount<0) //recyclePrevToken(); prevToken = LookAhead; int nextChar; while ((nextChar = ReaderRead()) != -1) { switch (nextChar) { // Handle line ends case '\r': case '\n': HandleLineEnd((char)nextChar); break; // Handle comments case '/': int peek = ReaderPeek(); if (peek == '/' || peek == '*' || peek == '+') { ReadComment(); continue; } break; // handle string literals case 'r': int pk = ReaderPeek(); if (pk == '"') { ReaderRead(); ReadVerbatimString('"'); } break; case '`': ReadVerbatimString(nextChar); break; case '"': ReadString(nextChar); break; case '\'': ReadChar(); break; case '{': braceCount++; continue; case '}': braceCount--; if (braceCount < 0) { lookaheadToken = Token(laKind = DTokens.CloseCurlyBrace, Col - 1, Line); StartPeek(); Peek(); return; } break; } } }
/// <summary> /// Reads the next token and gives it back. /// </summary> /// <returns>An <see cref="CurrentToken"/> object.</returns> public void NextToken() { if (lookaheadToken == null){ lookaheadToken = Next(); laKind = lookaheadToken.Kind; Peek(); } else { recyclePrevToken(); prevToken = curToken; curToken = lookaheadToken; if (lookaheadToken.next == null) lookaheadToken.next = Next(); lookaheadToken = lookaheadToken.next; laKind = lookaheadToken.Kind; StartPeek(); Peek(); } }
public void RestoreLookAheadBackup() { prevToken = null; curToken = null; lookaheadToken = laBackup.Pop(); laKind = lookaheadToken.Kind; StartPeek(); Peek(); }
public void PopLookAheadBackup() { prevToken = null; curToken = null; laBackup.Pop(); /* var bk = laBackup.Pop(); if(laBackup.Count == 0) { while(bk != lookaheadToken) { var n = bk.next; bk.next = null; bk.LiteralValue = null; tokenPool.Push(bk); if((bk = n) == null) return; } }*/ }
/// <summary> /// Gives back the next token. A second call to Peek() gives the next token after the last call for Peek() and so on. /// </summary> /// <returns>An <see cref="CurrentToken"/> object.</returns> public DToken Peek() { if (peekToken == null) StartPeek(); if (peekToken.next == null) peekToken.next = Next(); peekToken = peekToken.next; return peekToken; }
/// <summary> /// Must be called before a peek operation. /// </summary> public void StartPeek() { peekToken = lookaheadToken; }
public void Dispose() { reader = null; prevToken = curToken = lookaheadToken = peekToken = null; //sb = originalValue = null; escapeSequenceBuffer = null; identBuffer = null; LexerErrors = null; Comments = null; }