def _startswith_tagtable_rest_of_line(text): return ( # Ensure the text starts with the given word ("begin", TT.Word, text, TT.MatchFail, +1), # Read to the end of line (None, TT.AllInSet, TT.invset('\r\n'), +1, +1), # Read the end of line (None, TT.Is, '\n', +1, +4), # matches '\n' or (None, TT.Is, '\r', +2, +1), # '\r' followed by (None, TT.Is, '\n', +2, +2), # optional '\n' # Check if EOF (allow EOF if no EOL found) (None, TT.EOF, TT.Here, +1, TT.MatchOk), # Not EOF, so look for the next line starting with text ("begin", TT.Word, text, +1, -5), # Not what I am looking for, so read to the end of line (None, TT.AllInSet, TT.invset('\r\n'), +1, +1), # Read the end of line then test the next line (None, TT.Is, '\n', +1, -2), # '\n' (None, TT.Is, '\r', +2, +1), # '\r' followed by (None, TT.Is, '\n', -4, -4), # optional '\n' # Allow termination at EOF (None, TT.EOF, TT.Here, TT.MatchFail, TT.MatchOk), )
def _endswith_tagtable_rest_of_line(text): return ( # Is the current line the end of record marker? (None, TT.Word, text, +8, +1), # Read whatever else is on that line (could be nothing) (None, TT.AllInSet, TT.invset('\r\n'), +1, +1), # Get the end of line ("end", TT.Is, '\n', +1, -2), # matches '\n' (None, TT.Is, '\r', +4, +1), ("end", TT.Is, '\n', +1, -4), (None, TT.Skip, -1, +1, +1), ("end", TT.Skip, +1, -6, -6), # Check if EOF (only tests when the end of record line has no \n) # Only time this should fail is with a bug in TT. ("end", TT.EOF, TT.Here, TT.MatchFail, TT.MatchOk), # Not the end of record marker, so read to the end of line (None, TT.AllInSet, TT.invset('\r\n'), +1, +1), # Check if EOF (None, TT.EOF, TT.Here, +1, TT.MatchOk), # Not EOF, so scarf any newlines and try again (None, TT.AllInSet, TT.set('\r\n'), TT.MatchFail, -10), )
def _startswith_tagtable_newline(text): return ( # Ensure the text starts with the given word ... ("begin", TT.Word, text, TT.MatchFail, +1), # ... followed by the end of line (None, TT.Is, '\n', +1, +4), # matches '\n' or (None, TT.Is, '\r', +2, +1), # '\r' followed by (None, TT.Is, '\n', +2, +2), # optional '\n' # Check if EOF instead of a newline (allow EOF if found) # Otherwise, this means the line starts with the text but # doesn't have a successive newline. # XXX BUG! When looking for "A\n" should not fail on "AA\n"! (None, TT.EOF, TT.Here, TT.MatchFail, TT.MatchOk), # Look for the next line starting with text ("begin", TT.Word, text, +1, -4), # Not what I am looking for, so read to the end of line (None, TT.AllInSet, TT.invset('\r\n'), +1, +1), # Read the end of line then test the next line (None, TT.Is, '\n', +1, -2), # '\n' (None, TT.Is, '\r', +2, +1), # '\r' followed by (None, TT.Is, '\n', -4, -4), # optional '\n' # Allow termination at EOF (None, TT.EOF, TT.Here, TT.MatchFail, TT.MatchOk), )
def _endswith_tagtable_newline(text): return ( # Is the current line the end of record marker? (None, TT.Word, text, +6, +1), # Make sure it ends the line ("end", TT.Is, '\n', +1, -1), # matches '\n' (None, TT.Is, '\r', +4, +1), ("end", TT.Is, '\n', +1, -3), (None, TT.Skip, -1, +1, +1), ("end", TT.Skip, +1, -5, -5), # Not the end of record marker, so read to the end of line (None, TT.AllInSet, TT.invset('\r\n'), +1, +1), # Check if EOF (None, TT.EOF, TT.Here, +1, TT.MatchOk), # Not EOF, so scarf any newlines (None, TT.AllInSet, TT.set('\r\n'), TT.MatchFail, -8), )
fake = self.text + "\n" reader = StartsWith(self.infile, self.text, self.sizehint, fake + self.lookahead) rec = reader.next() rec = rec[len(fake):] # remove the fake data self.infile, self.lookahead = reader.remainder() self.found = 1 return rec def remainder(self): return self.infile, self.lookahead # Tag the last byte of every newline _tag_lines_tagtable = ( # Skip non-newline characters (None, TT.AllInSet, TT.invset('\r\n'), +1, +1), # Check if newline ("newline", TT.Is, '\n', +1, -1), # can be '\n' (None, TT.Is, '\r', +3, +1), # or start a '\r' followed by .. ("newline", TT.Is, '\n', +1, -3), # .. an optional '\n' ("newline", TT.Skip, 0, -4, -4), # get here with just an '\r' (None, TT.EOF, TT.Here, -5, TT.MatchOk), # stop at end of text ) class CountLines(RecordReader): """Read a specified (fixed) number of lines""" def __init__(self, infile, count, sizehint = SIZEHINT, lookahead = ""): assert count > 0, "CountLines reader must read at least one line" assert lookahead > 0, "Must read at least a character at a time"
def generate_dot(expression, genstate): return [ (None, TT.IsInSet, TT.invset('\n')), ]
def generate_dot(expression, genstate): return [(None, TT.IsInSet, TT.invset('\n')), ]