/**
 * There's a big problem with scanning in PHP: We haven't found
 * a way to imitate something like Perl's \G function (match where
 * the last match ended, not supported in PHP), or any other
 * possibility to give the PCRE engine an offset to begin searching.
 * So we had no choice: All scanners in CodeBB scan by:
 * - Deciding the TokenKind with a big if-elseif-...-statement
 *   The patterns are only tried at the start of code.
 * - Setting token and tokenKind
 * - CUTTING the token from the beginning of code
 * - Loop
 * As you can see, this means to move the whole code in the memory.
 * Of course this is very lavish, and we think that most time of
 * the scan process is spend by doing this.
 *
 *
 * A few things to help you making your own scanner:
 *
 * Every pattern should be surrounded by '/.../sA':
 *
 * ''-quotes to reduce ugly backslash chains.
 *   Note that, in '', only \' and \\ are unescaped.
 *   Some examples you will find useful:
 *   String  Regexp  Matches
 *   \k      \k      k
 *   \w      \w      A word character, [A-Za-z0-9_]
 *   \'      '       '
 *   \\      \       nothing, escape for next character
 *   \\.     \.      .
 *   \/      /       / (unescaped before sended to PCRE engine)
 *   \\\\    \\      \
 *   \\\\.   \\.     \ and any character.
 *   You have to escape +*?/([{^$ if you want the symbol itself.
 *   You should also escape )]} to avoid possible misinterpretations.
 *   Finally, I recommend to escape #, as it will become a comment if
 *   you use /x (hard to debug!)
 *   Using spaces can cause problems, use \t for TAB and \x20 for space.
 *   \040 is also space, I've read...but I can't read octal.
 *
 * //-delimiters. Using other could irritate the reader.
 *   Of course, /\/\*.*?\*\// (for matching a C-style multiline comment)
 *   looks complicate, but #/\*.*?\*/# is not really an improvement.
/*   (Guess why I had to put /* here ;)
 *
 * /s makes the . matching all characters, including newline.
 *   If you want to exclude newline, use [^\n].
 *
 * /A is the modifier that makes it work: The pattern must match at the
 *   beginning of code. Forget this and your scanner will produce
 *   undebugable nonsense!
 *
 * At last, if you aren't using an editor with good highlighting, pay
 * attention to the following:
 * Inside a string or a multiline-comment, the sequence ?> is nothing
 * special. But inside // or #, the PHP block will end there!
 * This may happen if you use atomic grouping (?>...) in a pattern, and
 * outcomment it for debugging.
 * Vim62 recognizes this correctly, and (of course) Scanner_php ;)
 *
 * Learn more from the existing scanners.
 */
        
/**
 * Es gibt ein grosses Problem mit dem Ablichten in PHP: Wir haben eine
 * Weise, etwas wie Funktion \G Perl gefunden (Gleiches nachzuahmen wo
 * das letzte Gleiche beendet, nicht in PHP gestützt), oder keine andere
 * Möglichkeit, der PCRE Maschine einen Versatz zu geben, um zu suchen anzufangen.
 * So hatten wir keine Wahl: Alle Scanner in CodeBB lichten vorbei ab:
 * - Entscheiden des TokenKind mit einem grossem, wenn-elseif... Aussage.
 *   Die Muster werden nur beim Anfang des Codes versucht.
 * - Einstellung des Zeichens und des tokenKind
 * - SCHNITT des Zeichens vom Anfang des Codes
 * - Schleife
 * Wie Sie sehen können, diese Mittel, den vollständigen Code im Gedächtnis zu verschieben.
 * Selbstverständlich ist dieses sehr verschwenderisch, und wir denken, daß die meiste Zeit des
 * Scan-Prozesses aufwenden ist, indem sie dies tut.
 * 
 * 
 * Einige Sachen, zum Sie zu helfen Ihren eigenen Scanner bildend:
 * 
 * Jedes Muster sollte durch '/... /sA' umgeben werden:
 * 
 * ''-quotes, zum der häßlichen Gegenschrägstrichketten zu verringern.
 *  Merken Sie, daß, in '', nur \' und \ \ sind unescaped.
 *  Einige Beispiele, die Sie nützlich finden:
 *   Reihen Sie Regexp Gleiche
 *   \k         \k     k
 *   \w         \w     A Wortbuchstaben, [ A-Za-z0-9 _ ]
 *   \'         '      '
 *   \\         \      nichts, Entweichen für folgendes Buchstabe
 *   \\.        \.     .
 *   \/         /      / (unescaped, bevor zur PCRE Maschine sended),
 *   \\\\       \\     \
 *   \\\\.      \\.    \ und irgendein Buchstabe.
 *   Sie müssen +*?/([{^$ entgehen, wenn Sie das Symbol selbst wünschen.
 *   Sie sollten das Entweichen )]} mögliche Fehlinterpretationen auch vermeiden.
 *   Schließlich empfehle mich ich zu entgehen #, da es eine Anmerkung wird, wenn
 *   Sie /x verwenden (stark ausprüfen!)
 *   Das Verwenden der Räume kann Probleme, Gebrauch \t für VORSPRUNG und \x20 für Raum verursachen.
 *   \040 ist auch Raum, ich haben gelesen..., aber ich kann nicht Oktal lesen.
 * 
 * //-delimiters. Das Verwenden anderes konnte den Leser reizen.
 *   Selbstverständlich /\/\*.*?\*\// (für das Zusammenbringen einer C-Art Mehrkanalanmerkung)
 *   erschweren Blicke, aber #/\*.*?\*/# ist nicht wirklich eine Verbesserung
/*   (Vermutung, warum ich/mußte * sich zu setzen, hier;)
 * 
 * /s bildet. alle Buchstaben, einschließlich neue Zeile zusammenbringen.
 *   Wenn Sie neue Zeile ausschließen möchten, verwenden Sie [ ^\n ].
 * 
 * /A ist der Modifizierfaktor, der Marken es Arbeit: Das Muster muß am
 *   Anfang des Codes zusammenpassen. Vergessen Sie, daß diesem und Ihr Scanner
 *   undebugable Unsinn produziert!
 * 
 * Schließlich wenn Sie nicht einen Herausgeber mit dem guten Hervorheben benutzen, Bezahlung
 * Aufmerksamkeit zum folgenden:
 * Innerhalb einer Zeichenkette oder, Mehrkanal-kommentieren die Reihenfolge? ist spezielles
 * nichts. Aber Innere // oder #, der PHP Block beenden dort!
 * Dieses kann geschehen, wenn Sie die Atomgruppierung (?...) in einem Muster verwenden, und
 * outcomment es für das Ausprüfen.
 * Vim62 erkennt dieses richtig und (selbstverständlich) Scanner_php ;)
 * 
 * Erlernen Sie mehr von den vorhandenen Scannern.
 */