First version, c++.
#include "jsonsax.hpp"
#include <iostream>
#include <assert.h>
// #define DEBUGTEST
class JSLXTester : public IJSLXBackend
{
public:
explicit JSLXTester(const char* json)
: m_json(json)
{}
void debug(const char* data)
{
#ifdef DEBUGTEST
std::cerr << std::endl << "-*- " << data << " -*-" << std::endl;
#endif
}
virtual bool Eof()
{
return *m_json == '\0';
}
virtual char GetChar()
{
assert(!Eof());
#ifdef DEBUGTEST
std::cerr.put(*m_json == ' ' ? '_' : *m_json);
#endif
return *m_json++;
}
virtual bool OnStartObject()
{
assert(m_json[-1] == '{');
debug("OnStartObject");
return true;
}
virtual bool OnStopObject()
{
assert(m_json[-1] == '}');
debug("OnStopObject");
return true;
}
virtual bool OnStartArray()
{
assert(m_json[-1] == '[');
debug("OnStartArray");
return true;
}
virtual bool OnStopArray()
{
assert(m_json[-1] == ']');
debug("OnStopArray");
return true;
}
virtual bool OnStartNumber()
{
// assert(m_json[-1] == ']');
debug("OnStartNumber");
return true;
}
virtual bool OnStopNumber()
{
// assert(m_json[-1] == ']');
debug("OnStopNumber");
return true;
}
virtual bool OnStartString()
{
assert(m_json[-1] == '"');
debug("OnStartString");
return true;
}
virtual bool OnStopString()
{
assert(m_json[-1] == '"');
debug("OnStopString");
return true;
}
virtual bool OnNull()
{
// assert(m_json[-1] == ']');
debug("OnNull");
return true;
}
virtual bool OnTrue()
{
// assert(m_json[-1] == ']');
debug("OnTrue");
return true;
}
virtual bool OnFalse()
{
// assert(m_json[-1] == ']');
debug("OnFalse");
return true;
}
virtual void OnError(const char* err)
{
debug("Error");
debug(err);
}
bool Check()
{
return Eof();
}
private:
const char* m_json;
};
int main()
{
const char json[] =
"{ \"hello\" : [ 11, 12 ,1"
"3 ], \n \"world\" : -3.45e2 }";
JSLXTester tester(json);
JSLXParser parser(&tester);
assert(parser.Parse());
assert(tester.Check());
return 0;
}