jsonsax.cpp
author Fabien Ninoles <fabien@tzone.org>
Sat, 06 Oct 2012 21:08:55 -0400
changeset 0 d187e7fc9970
permissions -rw-r--r--
First version, c++.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     1
#include "jsonsax.hpp"
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     2
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     3
#include <assert.h>
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     4
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     5
#define CASE_IS_SPACE \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     6
	case ' ':		  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     7
case '\n':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     8
case '\t':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     9
case '\r'
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    10
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    11
#define CASE_IS_DIGIT \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    12
	case '0':		  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    13
case '1':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    14
case '2':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    15
case '3':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    16
case '4':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    17
case '5':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    18
case '6':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    19
case '7':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    20
case '8':			  \
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    21
case '9'
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    22
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    23
JSLXParser::JSLXParser(IJSLXBackend* pBackend)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    24
    : m_pBackend(pBackend)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    25
{}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    26
bool JSLXParser::Parse()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    27
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    28
    return GetNextChar() && ParseValue();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    29
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    30
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    31
bool JSLXParser::_GetNextChar()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    32
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    33
    if (!m_pBackend->Eof())
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    34
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    35
        m_lastChar = m_pBackend->GetChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    36
        return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    37
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    38
    return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    39
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    40
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    41
bool JSLXParser::TrimWhiteSpace()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    42
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    43
    do
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    44
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    45
        switch(m_lastChar)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    46
        {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    47
        CASE_IS_SPACE:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    48
            break;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    49
        default:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    50
            return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    51
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    52
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    53
    while(_GetNextChar());
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    54
    return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    55
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    56
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    57
bool JSLXParser::GetNextChar(bool trim /* = true */)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    58
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    59
    if (trim)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    60
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    61
        return _GetNextChar() && TrimWhiteSpace();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    62
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    63
    return _GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    64
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    65
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    66
bool JSLXParser::ParseValue()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    67
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    68
    switch(m_lastChar)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    69
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    70
    case '[':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    71
        return ParseArray();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    72
    case '{':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    73
        return ParseObject();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    74
    case '"':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    75
        return ParseString();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    76
    case '-':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    77
    CASE_IS_DIGIT:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    78
        return ParseNumber();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    79
    case 'n':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    80
        return ParseNull();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    81
    case 't':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    82
        return ParseTrue();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    83
    case 'f':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    84
        return ParseFalse();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    85
    default:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    86
        return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    87
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    88
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    89
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    90
bool JSLXParser::ParseObject()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    91
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    92
    assert(m_lastChar == '{');
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    93
    m_pBackend->OnStartObject();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    94
    GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    95
    while(ParsePair())
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    96
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    97
        switch(m_lastChar)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    98
        {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    99
        case ',':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   100
            GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   101
            break;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   102
        case '}':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   103
            m_pBackend->OnStopObject();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   104
            GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   105
            return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   106
        default:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   107
            m_pBackend->OnError("ParseObject: invalid char");
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   108
            return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   109
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   110
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   111
    if (m_lastChar != '}')
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   112
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   113
        m_pBackend->OnError("ParseObject: invalid char");
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   114
        return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   115
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   116
    m_pBackend->OnStopObject();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   117
    GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   118
    return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   119
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   120
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   121
bool JSLXParser::ParsePair()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   122
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   123
    if (m_lastChar != '"')
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   124
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   125
        m_pBackend->OnError("ParsePair: Invalid Key");
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   126
        return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   127
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   128
    if (!ParseString())
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   129
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   130
        m_pBackend->OnError("ParsePair: Invalid Key");
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   131
        return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   132
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   133
    if (m_lastChar != ':')
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   134
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   135
        m_pBackend->OnError("ParsePair: Missing pair separator");
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   136
        return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   137
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   138
    if (!GetNextChar())
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   139
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   140
        m_pBackend->OnError("ParsePair: Missing value");
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   141
        return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   142
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   143
    return ParseValue();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   144
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   145
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   146
bool JSLXParser::ParseArray()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   147
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   148
    assert(m_lastChar == '[');
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   149
    if (!GetNextChar()) return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   150
    while(ParseValue())
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   151
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   152
        switch(m_lastChar)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   153
        {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   154
        case ',':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   155
            GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   156
            break;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   157
        case ']':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   158
            m_pBackend->OnStopArray();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   159
            GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   160
            return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   161
        default:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   162
            m_pBackend->OnError("ParseArray: Missing seperator in array");
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   163
            return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   164
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   165
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   166
    if (m_lastChar != ']')
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   167
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   168
        m_pBackend->OnError("ParseArray: Bad value in array");
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   169
        return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   170
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   171
    m_pBackend->OnStopArray();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   172
    GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   173
    return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   174
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   175
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   176
bool JSLXParser::ParseString()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   177
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   178
    assert(m_lastChar == '"');
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   179
    m_pBackend->OnStartString();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   180
    while(GetNextChar())
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   181
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   182
        switch(m_lastChar)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   183
        {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   184
        case '\\':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   185
            GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   186
            break;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   187
        case '"':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   188
            m_pBackend->OnStopString();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   189
            GetNextChar();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   190
            return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   191
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   192
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   193
    return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   194
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   195
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   196
bool JSLXParser::ParseNumber()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   197
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   198
    assert(m_lastChar == '-' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   199
        m_lastChar == '0' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   200
        m_lastChar == '1' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   201
        m_lastChar == '2' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   202
        m_lastChar == '3' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   203
        m_lastChar == '4' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   204
        m_lastChar == '5' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   205
        m_lastChar == '6' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   206
        m_lastChar == '7' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   207
        m_lastChar == '8' ||
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   208
        m_lastChar == '9');
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   209
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   210
    m_pBackend->OnStartNumber();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   211
    while(GetNextChar())
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   212
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   213
        switch(m_lastChar)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   214
        {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   215
            // TODO: lookup for correct number format.
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   216
        case 'e':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   217
        case '-':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   218
        case '.':
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   219
        CASE_IS_DIGIT:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   220
            break;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   221
        default:
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   222
            m_pBackend->OnStopNumber();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   223
            return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   224
        }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   225
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   226
    return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   227
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   228
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   229
bool JSLXParser::ParseNull()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   230
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   231
    if (ParseConstant("null"))
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   232
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   233
        m_pBackend->OnNull();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   234
        return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   235
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   236
    return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   237
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   238
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   239
bool JSLXParser::ParseTrue()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   240
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   241
    if (ParseConstant("true"))
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   242
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   243
        m_pBackend->OnTrue();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   244
        return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   245
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   246
    return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   247
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   248
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   249
bool JSLXParser::ParseFalse()
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   250
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   251
    if (ParseConstant("false"))
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   252
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   253
        m_pBackend->OnFalse();
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   254
        return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   255
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   256
    return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   257
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   258
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   259
bool JSLXParser::ParseConstant(const char* constant)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   260
{
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   261
    assert(m_lastChar == constant[0]);
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   262
    ++constant;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   263
    while(GetNextChar())
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   264
    {
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   265
        if (*constant == '\0')
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   266
            return true;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   267
        if (*constant != m_lastChar)
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   268
            return false;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   269
        constant++;
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   270
    }
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   271
    return *constant == '\0';
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   272
}
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   273
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   274
#undef CASE_IS_DIGIT
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   275
#undef CASE_IS_SPACE
d187e7fc9970 First version, c++.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   276