--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# This file is free software, which comes along with NIT. This software is
+# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE. You can modify it is you want, provided this header
+# is kept unaltered, and a notification of the changes is added.
+# You are allowed to redistribute it and sell it, alone or is a part of
+# another product.
+
+# Simple base for hand-made parsers of all kinds
+module parser_base
+
+# Basic facilities for common parser operations on String sources
+class StringProcessor
+ # Source document to parse
+ private var src: String
+
+ # Current position in `src`
+ private var pos = 0
+
+ # Position at which current line started
+ private var line_start = 0
+
+ # Current line in `src`
+ private var line = 1
+
+ # Offset in the current line
+ private fun line_offset: Int do return pos - line_start + 1
+
+ # Gives the current location in the `src`
+ fun current_location: Location do return new Location(line, line_offset)
+
+ # Advances in `src` until a non-whitespace character is encountered
+ private fun ignore_whitespaces do
+ var srclen = src.length
+ if pos >= srclen then return
+ var c = src[pos]
+ while c.is_whitespace do
+ pos += 1
+ if pos >= srclen then break
+ if c == '\n' then
+ line += 1
+ line_start = pos
+ end
+ c = src[pos]
+ end
+ end
+
+ # Reads characters until pattern `s` is found
+ private fun ignore_until(s: String): Int do
+ if s.length == 0 then return pos
+ var srclen = src.length
+ if pos >= srclen then return -1
+ loop
+ var c = s[0]
+ var src_c = src[pos]
+ while src_c != c do
+ pos += 1
+ if pos >= srclen then return -1
+ if src_c == '\n' then
+ line += 1
+ line_start= pos
+ end
+ src_c = src[pos]
+ end
+ var relpos = pos
+ var fnd = true
+ for i in s do
+ if relpos >= srclen then
+ fnd = false
+ break
+ end
+ if src[relpos] != i then
+ pos += 1
+ fnd = false
+ break
+ end
+ relpos += 1
+ end
+ if fnd then return pos
+ end
+ end
+end
+
+# Information about the location of an entity in a source document
+class Location
+ # Line in which the element is described
+ var line: Int
+ # Offset in the line at which the element is positioned
+ var offset: Int
+
+ redef fun to_s do return "line {line}, position {offset}"
+end