src/Scanner.h
author David Anderson <dvander@alliedmods.net>
Sat Sep 01 17:11:06 2012 -0700 (2012-09-01)
changeset 176 2b9141b01023
parent 172 48cffae8c9e0
permissions -rw-r--r--
Add hex literal support.
dvander@172
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@172
     2
 *
dvander@0
     3
 * Copyright (C) 2012 David Anderson
dvander@0
     4
 *
dvander@172
     5
 * This file is part of SourcePawn.
dvander@0
     6
 *
dvander@172
     7
 * SourcePawn is free software: you can redistribute it and/or modify it under
dvander@0
     8
 * the terms of the GNU General Public License as published by the Free
dvander@0
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
    10
 * any later version.
dvander@0
    11
 * 
dvander@172
    12
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    15
 *
dvander@0
    16
 * You should have received a copy of the GNU General Public License along with
dvander@172
    17
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
dvander@0
    18
 */
dvander@0
    19
#ifndef _include_jitcraft_scanner_h_
dvander@0
    20
#define _include_jitcraft_scanner_h_
dvander@0
    21
dvander@0
    22
#include <string>
dvander@0
    23
#include "Token.h"
dvander@25
    24
#include "CompileContext.h"
danderson@92
    25
#include "Vector.h"
dvander@0
    26
dvander@59
    27
namespace ke {
dvander@0
    28
dvander@0
    29
class Scanner
dvander@0
    30
{
dvander@172
    31
    template <bool Enabled>
dvander@172
    32
    friend class AutoAllowTags;
dvander@172
    33
dvander@25
    34
    CompileContext &cc_;
dvander@0
    35
    const char *stream_;
dvander@0
    36
    size_t length_;
dvander@0
    37
    bool pushed_;
dvander@172
    38
    bool allowTags_;
dvander@0
    39
    char saved_;
dvander@0
    40
    const char *pos_;
danderson@92
    41
    Vector<char> literal_;
dvander@0
    42
    TokenKind lastToken_;
dvander@25
    43
    SourcePosition last_;
dvander@25
    44
    SourcePosition cur_;
dvander@25
    45
    SourcePosition begin_;
dvander@0
    46
dvander@0
    47
  private:
dvander@0
    48
    char getChar();
dvander@0
    49
    void putChar(char c);
dvander@0
    50
    void eatSingleLine();
dvander@0
    51
    bool eatComment();
dvander@25
    52
    void calcNewLine(char c);
dvander@21
    53
    int readEscapeCode();
dvander@21
    54
    TokenKind stringLiteral();
dvander@176
    55
    TokenKind hexLiteral();
dvander@4
    56
    TokenKind numberLiteral(char first);
dvander@0
    57
    TokenKind identifier(char first);
dvander@0
    58
dvander@0
    59
    TokenKind next();
dvander@0
    60
dvander@0
    61
  public:
dvander@25
    62
    Scanner(CompileContext &cc, const char *stream, size_t length);
dvander@0
    63
dvander@4
    64
    static double ParseDouble(const char *string);
dvander@4
    65
dvander@0
    66
    TokenKind scan();
dvander@0
    67
    TokenKind peek();
dvander@0
    68
    TokenKind last() const {
dvander@0
    69
        return lastToken_;
dvander@0
    70
    }
dvander@0
    71
dvander@172
    72
    bool tagsEnabled() const {
dvander@172
    73
        return allowTags_;
dvander@172
    74
    }
dvander@172
    75
    void setTagsEnabled(bool enabled) {
dvander@172
    76
        allowTags_ = enabled;
dvander@172
    77
    }
dvander@172
    78
dvander@25
    79
    // Beginning source position of the last instruction.
dvander@25
    80
    SourcePosition begin() const {
dvander@25
    81
        return begin_;
dvander@25
    82
    }
dvander@25
    83
dvander@21
    84
    // Note: the literal may have embedded NUL characters.
dvander@0
    85
    const char *literal() const {
danderson@92
    86
        return literal_.buffer();
dvander@0
    87
    }
dvander@21
    88
    size_t literal_length() const {
danderson@92
    89
        return literal_.length() - 1;
dvander@21
    90
    }
dvander@0
    91
};
dvander@0
    92
dvander@172
    93
template <bool Enabled>
dvander@172
    94
class AutoAllowTags
dvander@172
    95
{
dvander@172
    96
    Scanner &scanner_;
dvander@172
    97
    bool prev_;
dvander@172
    98
dvander@172
    99
  public:
dvander@172
   100
    AutoAllowTags(Scanner &scanner)
dvander@172
   101
      : scanner_(scanner),
dvander@172
   102
        prev_(scanner_.tagsEnabled())
dvander@172
   103
    {
dvander@172
   104
        scanner_.setTagsEnabled(Enabled);
dvander@172
   105
    }
dvander@172
   106
    ~AutoAllowTags()
dvander@172
   107
    {
dvander@172
   108
        scanner_.setTagsEnabled(prev_);
dvander@172
   109
    }
dvander@172
   110
};
dvander@172
   111
dvander@59
   112
} // namespace ke
dvander@0
   113
dvander@0
   114
#endif // _include_jitcraft_scanner_h_