Skip to content

Commit 6a6e86d

Browse files
author
LE, Duc-Anh
committed
CLDEPARSER-24 #time 2h
1 parent b02dc1d commit 6a6e86d

29 files changed

+553
-44
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ set(TEST_SOURCE
7878
Test/JsonParserInstance.h
7979
Test/JsonTestFixture.cpp
8080
Test/JsonTestFixture.h
81-
Test/Case01_OtherTest.hpp)
81+
)
8282

8383
include_directories(${EXTRA_DIR}/gtest-1.7.0/include)
8484
LINK_DIRECTORIES(${EXTRA_DIR}/gtest-1.7.0/lib)

Source/Parsing/Json/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ add_library(parser-json STATIC
2525
JsonSyntaxModel.h
2626
JsonValueFactory.cpp
2727
JsonValueFactory.h
28+
JsonEntityHelper.cpp
29+
JsonEntityHelper.h
30+
JsonValueHelper.cpp
31+
JsonValueHelper.h
2832
)

Source/Parsing/Json/Json.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
#include "JsonException.h"
99
#include "JsonDerivative.h"
1010
#include "JsonEntity.h"
11+
#include "JsonEntityHelper.h"
1112
#include "JsonObject.h"
1213
#include "JsonArray.h"
1314
#include "JsonValue.h"
15+
#include "JsonValueHelper.h"
1416

1517
#endif //CLDEPARSER_JSON_H

Source/Parsing/Json/JsonArray.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ namespace CLDEParser {
3030

3131
protected:
3232
SPtrJsonValueVector _container;
33-
3433
};
34+
35+
using SPtrJsonArray = std::shared_ptr<JsonArray>;
3536
}
3637
}
3738
}

Source/Parsing/Json/JsonDerivative.cpp

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,43 @@ namespace CLDEParser {
1313
//
1414
}
1515

16+
bool JsonDerivative::isObjectFirstFollow(SPtrTokenVectorIterator &iterator) {
17+
18+
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::BracketOpen) {
19+
return true;
20+
}
21+
22+
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::CurlyBraceOpen) {
23+
return true;
24+
}
25+
26+
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::String) {
27+
return true;
28+
}
29+
30+
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::BooleanFalse) {
31+
return true;
32+
}
33+
34+
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::BooleanTrue) {
35+
return true;
36+
}
37+
38+
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::Null) {
39+
return true;
40+
}
41+
42+
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::Number) {
43+
return true;
44+
}
45+
46+
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::NumberInteger) {
47+
return true;
48+
}
49+
50+
return false;
51+
}
52+
1653
void JsonDerivative::matchBracketOpen(SPtrTokenVectorIterator &iterator) {
1754

1855
if ((JsonSyntaxNodeType) (*iterator)->id() != JsonSyntaxNodeType::BracketOpen) {
@@ -270,10 +307,13 @@ namespace CLDEParser {
270307

271308
void JsonDerivative::array(SPtrTokenVectorIterator &iterator) {
272309

273-
_sptrSyntaxModel->_sptrSyntaxNodeQueue
274-
.push_back(JsonFactory::CreateSPtrJsonSyntaxNode((int) JsonSyntaxNodeType::Id,
275-
std::string{}));
276-
value(iterator);
310+
if (isObjectFirstFollow(iterator)) {
311+
312+
_sptrSyntaxModel->_sptrSyntaxNodeQueue
313+
.push_back(JsonFactory::CreateSPtrJsonSyntaxNode((int) JsonSyntaxNodeType::Id,
314+
std::string{}));
315+
value(iterator);
316+
}
277317

278318
if ((JsonSyntaxNodeType) (*iterator)->id() == JsonSyntaxNodeType::Comma) {
279319
value_add(iterator);
@@ -340,7 +380,6 @@ namespace CLDEParser {
340380
SPtrSyntaxModel JsonDerivative::SyntaxModel() {
341381
return _sptrSyntaxModel;
342382
}
343-
344383
void JsonDerivative::Reset() {
345384
_sptrSyntaxModel->Reset();
346385
}

Source/Parsing/Json/JsonDerivative.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace CLDEParser {
2020

2121
// Main
2222
bool json(SPtrTokenVectorIterator &iterator);
23+
bool isObjectFirstFollow(SPtrTokenVectorIterator &iterator);
2324

2425
// Terminal matching
2526
void matchId(SPtrTokenVectorIterator &iterator);

Source/Parsing/Json/JsonEntity.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
//
44

55
#include "JsonEntity.h"
6+
#include "JsonException.h"
67

78

9+
namespace CLDEParser {
10+
namespace Parsing {
11+
namespace Json {
812

913

14+
}
15+
}
16+
}

Source/Parsing/Json/JsonEntity.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace CLDEParser {
2626
using SPtrJsonEntityMap = std::unordered_map<std::string, SPtrJsonEntity>;
2727
using SPtrJsonEntityVector = std::vector<SPtrJsonEntity>;
2828

29-
class JsonEntity : public Common::IPrintable {
29+
class JsonEntity : public Common::IPrintable,
30+
public std::enable_shared_from_this<JsonEntity> {
3031

3132
public:
3233
JsonEntity() = default;
@@ -37,7 +38,7 @@ namespace CLDEParser {
3738
virtual ~JsonEntity() = default;
3839

3940
// Accessors & Mutators
40-
JsonEntityType &Type() { return _type; }
41+
JsonEntityType const &Type() const { return _type; }
4142

4243
protected:
4344
JsonEntity(JsonEntityType type) : _type{type} { };
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// Created by LE, Duc Anh on 8/25/15.
3+
//
4+
5+
#include "JsonEntityHelper.h"
6+
7+
namespace CLDEParser {
8+
namespace Parsing {
9+
namespace Json {
10+
11+
SPtrJsonArray JsonEntityHelper::ToSPtrArray(SPtrJsonEntity const &sptrJsonEntity) {
12+
13+
if (sptrJsonEntity->Type() != JsonEntityType::Array) {
14+
int code = (int) JsonException::JsonExceptionCode::InvalidTypeCasting;
15+
throw JsonException{code, std::string{}};
16+
}
17+
18+
return std::dynamic_pointer_cast<JsonArray>(sptrJsonEntity);
19+
}
20+
21+
SPtrJsonObject JsonEntityHelper::ToSPtrObject(SPtrJsonEntity const &sptrJsonEntity) {
22+
23+
if (sptrJsonEntity->Type() != JsonEntityType::Object) {
24+
int code = (int) JsonException::JsonExceptionCode::InvalidTypeCasting;
25+
throw JsonException{code, std::string{}};
26+
}
27+
28+
return std::dynamic_pointer_cast<JsonObject>(sptrJsonEntity);
29+
}
30+
}
31+
}
32+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// Created by LE, Duc Anh on 8/25/15.
3+
//
4+
5+
#ifndef CLDEPARSER_PARSING_JSON_JSONENTITYHELPER_H
6+
#define CLDEPARSER_PARSING_JSON_JSONENTITYHELPER_H
7+
8+
#include "JsonEntity.h"
9+
#include "JsonArray.h"
10+
#include "JsonObject.h"
11+
#include "JsonException.h"
12+
13+
namespace CLDEParser {
14+
namespace Parsing {
15+
namespace Json {
16+
struct JsonEntityHelper {
17+
static SPtrJsonArray ToSPtrArray(SPtrJsonEntity const &sptrJsonEntity);
18+
static SPtrJsonObject ToSPtrObject(SPtrJsonEntity const &sptrJsonEntity);
19+
};
20+
}
21+
}
22+
}
23+
24+
25+
#endif //CLDEPARSER_PARSING_JSON_JSONENTITYHELPER_H

0 commit comments

Comments
 (0)