public void testPeekGivesTheNextCharaterWithoutAdvancing() throws IOException { LexerSource src = newSource("abc"); assertTrue(src.peek('a')); assertEquals('a', src.read()); }
public int parseStringIntoBuffer(RubyYaccLexer lexer, LexerSource src, ByteList buffer) throws java.io.IOException { boolean qwords = (flags & RubyYaccLexer.STR_FUNC_QWORDS) != 0; boolean expand = (flags & RubyYaccLexer.STR_FUNC_EXPAND) != 0; boolean escape = (flags & RubyYaccLexer.STR_FUNC_ESCAPE) != 0; boolean regexp = (flags & RubyYaccLexer.STR_FUNC_REGEXP) != 0; int c; while ((c = src.read()) != RubyYaccLexer.EOF) { if (begin != '\0' && c == begin) { nest++; } else if (c == end) { if (nest == 0) { src.unread(c); break; } nest--; } else if (c == '#' && expand && !src.peek('\n')) { int c2 = src.read(); if (c2 == '$' || c2 == '@' || c2 == '{') { src.unread(c2); src.unread(c); break; } src.unread(c2); } else if (c == '\\') { c = src.read(); switch (c) { case '\n': if (qwords) break; if (expand) continue; buffer.append('\\'); break; case '\\': if (escape) buffer.append(c); break; default: if (regexp) { src.unread(c); parseEscapeIntoBuffer(src, buffer); continue; } else if (expand) { src.unread(c); if (escape) buffer.append('\\'); c = lexer.readEscape(); } else if (qwords && Character.isWhitespace(c)) { /* ignore backslashed spaces in %w */ } else if (c != end && !(begin != '\0' && c == begin)) { buffer.append('\\'); } } } else if (qwords && Character.isWhitespace(c)) { src.unread(c); break; } buffer.append(c); } return c; }