Skip to content

Commit 25c1341

Browse files
author
LE, Duc-Anh
committed
CLDEPARSER-19 #time 3h
1 parent 8899a47 commit 25c1341

15 files changed

+213
-10
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,4 @@ Makefile.in
9292
# CMake & Builds generated files
9393
/.idea
9494
/CMake
95+
/Extra

CMakeLists.txt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ add_subdirectory(Source/Exceptions)
77
add_subdirectory(Source/Scanning)
88
add_subdirectory(Source/Parsing)
99
add_subdirectory(Source/Parsing/Json)
10+
add_subdirectory(Test)
1011

1112

1213
set(SOURCE_FILES
@@ -52,7 +53,6 @@ target_link_libraries(cldeparser scanner parser parser-json exceptions)
5253
add_executable(example-json Examples/example-json.cpp)
5354
target_link_libraries(example-json cldeparser-static)
5455

55-
5656
# Example - math
5757
add_executable(example-math Examples/example-math.cpp)
5858
target_link_libraries(example-math cldeparser-static)
@@ -67,3 +67,18 @@ install(TARGETS cldeparser-static cldeparser
6767
LIBRARY DESTINATION ./
6868
ARCHIVE DESTINATION ./
6969
)
70+
71+
72+
# Extra folder (containing supporting libraries such as gtest, gmock, valgrind ... Extra folder is not tracked)
73+
set(EXTRA_DIR "Extra")
74+
set(TEST_SOURCE
75+
Test/main.cpp
76+
Test/case01.hpp
77+
Test/JsonParserInstance.cpp Test/JsonParserInstance.h Test/JsonTestFixture.cpp Test/JsonTestFixture.h)
78+
79+
include_directories(${EXTRA_DIR}/gtest-1.7.0/include)
80+
LINK_DIRECTORIES(${EXTRA_DIR}/gtest-1.7.0/lib)
81+
82+
# Targets
83+
add_executable(cldeparser-apptest ${TEST_SOURCE})
84+
target_link_libraries(cldeparser-apptest gtest cldeparser-static)

Examples/example-json.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ int main() {
4040
auto filteredTokens = Scanning::TokenHelper::Filter(filteredCodes, tokens);
4141

4242
// Parsing
43-
auto sptrSyntaxModel = std::dynamic_pointer_cast<Parsing::Json::JsonSyntaxModel>(parser.Parse(filteredTokens));
43+
auto sptrSyntaxModel = parser.ParseCast<Parsing::Json::JsonSyntaxModel>(filteredTokens);
4444
auto sptrJsonEntity = sptrSyntaxModel->CreateSPtrJsonEnity();
4545

4646
std::cout << "Input: " << example << std::endl;

Source/ParserSingle.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@
88

99
namespace CLDEParser {
1010

11-
SPtrSyntaxModel ParserSingle::Parse(SPtrTokenVector const &sptrTokens) {
11+
SPtrSyntaxModel ParserSingle::Parse(SPtrTokenVector const &sptrTokens) const {
1212

1313
auto iterator = sptrTokens.cbegin();
1414

1515
try {
1616

17+
// Empty string returns a nullptr entity
18+
if(iterator == sptrTokens.cend()){
19+
return _sptrDerivative->SyntaxModel();
20+
}
21+
22+
// Process
1723
if (!_sptrDerivative->Derive(iterator)) {
1824
int code = (int) Exceptions::ParserException::ParserExceptionCode::UnmatchedToken;
1925
throw Exceptions::ParserException{code, iterator};

Source/ParserSingle.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ namespace CLDEParser {
2626
virtual ~ParserSingle() = default;
2727

2828
// Locals
29-
virtual SPtrSyntaxModel Parse(SPtrTokenVector const &sptrTokens);
29+
virtual SPtrSyntaxModel Parse(SPtrTokenVector const &sptrTokens) const;
30+
31+
template<typename T>
32+
std::shared_ptr<T> ParseCast(SPtrTokenVector const &sptrTokens) const {
33+
return std::dynamic_pointer_cast<T>(Parse(sptrTokens));
34+
}
3035
};
3136
}
3237

Source/Parsing/Json/JsonSyntaxModel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace CLDEParser {
1919

2020
SPtrJsonEntity JsonSyntaxModel::CreateSPtrJsonEnity() {
2121
auto iterator = _sptrSyntaxNodeQueue.cbegin();
22-
return createSPtrJsonEntity(iterator);
22+
return (iterator != _sptrSyntaxNodeQueue.cend()) ? createSPtrJsonEntity(iterator) : SPtrJsonEntity{};
2323
}
2424

2525
SPtrJsonEntity JsonSyntaxModel::createSPtrJsonEntity(SPtrJsonSyntaxNodeIterator &iterator) {

Source/Scanner.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace CLDEParser {
1313
return _tokenizers;
1414
}
1515

16-
SPtrTokenVector Scanner::Scan(const std::string &string) {
16+
SPtrTokenVector Scanner::Scan(const std::string &string) const {
1717

1818
SPtrTokenizerList matchedTokenizers;
1919
SPtrTokenVector tokens;
@@ -60,7 +60,7 @@ namespace CLDEParser {
6060

6161
SPtrToken Scanner::ProcessAndMoveNext(std::string::const_iterator &cIter,
6262
std::string::const_iterator &cEnd,
63-
SPtrTokenizerList &matchedTokenizers) {
63+
SPtrTokenizerList &matchedTokenizers) const {
6464

6565
std::vector<SPtrTokenizerList::const_iterator> unmatched;
6666
SPtrTokenizer sptrTokenizer;

Source/Scanner.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ namespace CLDEParser {
2626

2727
// Locals
2828
SPtrTokenizerVector &Tokenizers();
29-
SPtrTokenVector Scan(const std::string &string);
30-
int exceptionTokenNo() const { return _exceptionTokenNo; }
29+
SPtrTokenVector Scan(const std::string &string) const;
30+
int ExceptionTokenNo() const { return _exceptionTokenNo; }
3131
void setExceptionTokenNo(int exceptionTokenNo) { _exceptionTokenNo = exceptionTokenNo; }
3232

3333
protected:
3434
SPtrToken ProcessAndMoveNext(std::string::const_iterator &cIter,
3535
std::string::const_iterator &cEnd,
36-
SPtrTokenizerList &matchedTokenizers);
36+
SPtrTokenizerList &matchedTokenizers) const;
3737
};
3838
}
3939

Test/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
cmake_minimum_required(VERSION 3.2)
2+
project(cldeparser)
3+
4+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
5+
6+

Test/JsonParserInstance.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//
2+
// Created by LE, Duc Anh on 8/25/15.
3+
//
4+
5+
#include "JsonParserInstance.h"
6+
7+
namespace CLDEParser {
8+
namespace Test {
9+
10+
JsonParserInstance::JsonParserInstance()
11+
: _scanner{}, _parser{Parsing::ParserFactory::CreateJsonDerivative()} {
12+
//
13+
init();
14+
}
15+
16+
void JsonParserInstance::init() {
17+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateSpace());
18+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateTab());
19+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateNull());
20+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateBoolTrue());
21+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateBoolFalse());
22+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateNumberInteger());
23+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateNumber());
24+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateId());
25+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateString());
26+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateColon());
27+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateComma());
28+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateCurlyBraceOpen());
29+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateCurlyBraceClosing());
30+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateBracketOpen());
31+
_scanner.Tokenizers().push_back(Scanning::TokenizerFactory::CreateBracketClosing());
32+
}
33+
34+
Parsing::Json::SPtrJsonEntity JsonParserInstance::Parse(std::string const &json) const {
35+
36+
// Scanning
37+
auto tokens = _scanner.Scan(json);
38+
auto filteredCodes = Scanning::TokenHelper::DefaultFilterCodes();
39+
auto filteredTokens = Scanning::TokenHelper::Filter(filteredCodes, tokens);
40+
41+
// Parsing
42+
auto sptrSyntaxModel = _parser.ParseCast<Parsing::Json::JsonSyntaxModel>(filteredTokens);
43+
auto sptrJsonEntity = sptrSyntaxModel->CreateSPtrJsonEnity();
44+
45+
return sptrJsonEntity;
46+
}
47+
}
48+
}
49+
50+

0 commit comments

Comments
 (0)