working tree thing
This commit is contained in:
parent
e2e7d8ed13
commit
73b9f4c81d
6 changed files with 93 additions and 52 deletions
|
@ -4,7 +4,7 @@
|
||||||
"name": "x64-Debug",
|
"name": "x64-Debug",
|
||||||
"generator": "Ninja",
|
"generator": "Ninja",
|
||||||
"configurationType": "Debug",
|
"configurationType": "Debug",
|
||||||
"inheritEnvironments": [ "clang_cl_x64_x64" ],
|
"inheritEnvironments": [ "msvc_x64_x64" ],
|
||||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||||
"cmakeCommandArgs": "",
|
"cmakeCommandArgs": "",
|
||||||
|
|
|
@ -34,11 +34,19 @@ namespace {
|
||||||
|
|
||||||
while (!current_scope.Scope.empty()) {
|
while (!current_scope.Scope.empty()) {
|
||||||
stream.get(c);
|
stream.get(c);
|
||||||
for (auto const& x : SCOPER_MAP)
|
|
||||||
{
|
bool no_more_nesting_quotes = false;
|
||||||
if (c == x.first) {
|
for (auto const& x : current_scope.Scope)
|
||||||
current_scope.Scope.push_back(c);
|
if (x == '\'' || x == '\"')
|
||||||
break;
|
no_more_nesting_quotes = true;
|
||||||
|
|
||||||
|
if (!no_more_nesting_quotes) {
|
||||||
|
for (auto const& x : SCOPER_MAP)
|
||||||
|
{
|
||||||
|
if (c == x.first) {
|
||||||
|
current_scope.Scope.push_back(c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +82,7 @@ namespace {
|
||||||
char c;
|
char c;
|
||||||
while (nvl.get(c))
|
while (nvl.get(c))
|
||||||
{
|
{
|
||||||
if (c == ' ' || c == '{')
|
if (c == ' ' || c == '{' || c == '\n')
|
||||||
{
|
{
|
||||||
nvl.putback(c);
|
nvl.putback(c);
|
||||||
break;
|
break;
|
||||||
|
@ -89,7 +97,7 @@ namespace {
|
||||||
|
|
||||||
namespace NVL
|
namespace NVL
|
||||||
{
|
{
|
||||||
template <bool is_parent_call, bool is_token>
|
template <bool is_parent_call, bool is_symbol>
|
||||||
void parse_Object(Context parent_context, std::ifstream& nvl)
|
void parse_Object(Context parent_context, std::ifstream& nvl)
|
||||||
{
|
{
|
||||||
Object this_object;
|
Object this_object;
|
||||||
|
@ -102,24 +110,25 @@ namespace NVL
|
||||||
|
|
||||||
std::streampos end; // unused if object is not scoped
|
std::streampos end; // unused if object is not scoped
|
||||||
|
|
||||||
std::variant<std::string, std::vector<Object>> content;
|
std::variant<std::string, std::vector<Object>> content = "";
|
||||||
char c{};
|
char c{};
|
||||||
switch (nvl.peek())
|
switch (nvl.peek())
|
||||||
{
|
{
|
||||||
case '[': // List, fucked
|
case '[': // List, fucked
|
||||||
|
nvl.get(c); // do not exchange this line with the next one
|
||||||
end = scope_cope('[', nvl);
|
end = scope_cope('[', nvl);
|
||||||
nvl.get(c);
|
while (nvl.tellg() < end - static_cast<std::streampos>(1))
|
||||||
while (nvl.peek() != ']')
|
|
||||||
{
|
{
|
||||||
parse_Object<false, false>(this_context, nvl);
|
parse_Object<false, false>(this_context, nvl);
|
||||||
nvl >> std::ws;
|
nvl >> std::ws;
|
||||||
}
|
}
|
||||||
nvl.get(c);
|
nvl.get(c);
|
||||||
break;
|
break;
|
||||||
case '<': // Dialogue, not yet done
|
case '<': // Dialogue, not yet implemented
|
||||||
end = scope_cope('<', nvl);
|
end = scope_cope('<', nvl);
|
||||||
break;
|
break;
|
||||||
case '\"': // String, this is also fucked
|
case '\"': // String
|
||||||
|
nvl.get(c);
|
||||||
end = scope_cope('\"', nvl);
|
end = scope_cope('\"', nvl);
|
||||||
while (nvl.tellg() < end - static_cast<std::streampos>(1))
|
while (nvl.tellg() < end - static_cast<std::streampos>(1))
|
||||||
{
|
{
|
||||||
|
@ -127,26 +136,53 @@ namespace NVL
|
||||||
content = std::get<std::string>(content) + c;
|
content = std::get<std::string>(content) + c;
|
||||||
}
|
}
|
||||||
nvl.get(c); // rid of final scoper
|
nvl.get(c); // rid of final scoper
|
||||||
|
|
||||||
this_object.Value = std::get<std::string>(content);
|
this_object.Value = std::get<std::string>(content);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
for (nvl.get(c);!(c == ' ' || c == '\n' || c == '}' || c == ']' || c == ',');nvl.get(c))
|
for (nvl.get(c); !(c == ' ' || c == '\n' || c == '}' || c == ']' || c == ','); nvl.get(c))
|
||||||
{
|
{
|
||||||
content = std::get<std::string>(content) + c;
|
content = std::get<std::string>(content) + c;
|
||||||
}
|
}
|
||||||
if (c == ']' || c == ',' || c == '}')
|
if (c == ']' || c == ',' || c == '}')
|
||||||
nvl.putback(c);
|
nvl.putback(c);
|
||||||
this_object.Value = std::get<std::string>(content);
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this_object.Value = std::stof(std::get<std::string>(content));
|
||||||
|
}
|
||||||
|
catch (std::exception)
|
||||||
|
{
|
||||||
|
if (std::get<std::string>(content) == "true")
|
||||||
|
{
|
||||||
|
this_object.Value = true;
|
||||||
|
}
|
||||||
|
else if (std::get<std::string>(content) == "false") {
|
||||||
|
this_object.Value = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this_object.Value = std::get<std::string>(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
this_object.Is_Token = is_token;
|
this_object.Is_Symbol = is_symbol;
|
||||||
|
|
||||||
|
nvl >> std::ws;
|
||||||
|
|
||||||
if (is_parent_call)
|
if (is_parent_call)
|
||||||
(std::get<std::reference_wrapper<Call>>(parent_context.Scope_Hierarchy.back())).get().Objects.push_back(this_object);
|
(std::get<std::reference_wrapper<Call>>(parent_context.Scope_Hierarchy.back())).get().Objects.push_back(this_object);
|
||||||
else
|
else if ((std::get<std::reference_wrapper<Object>>(parent_context.Scope_Hierarchy.back())).get().Value.index() == 4) { // 4 for list
|
||||||
std::get<std::vector<NVL::Object>>((std::get<std::reference_wrapper<Object>>(parent_context.Scope_Hierarchy.back())).get().Value).push_back(this_object);
|
;
|
||||||
|
std::get<std::vector<Object>>((std::get<std::reference_wrapper<Object>>(parent_context.Scope_Hierarchy.back())).get().Value).push_back(this_object);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
;
|
||||||
|
(std::get<std::reference_wrapper<Object>>(parent_context.Scope_Hierarchy.back())).get().Value = std::vector<Object> { this_object };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -234,21 +270,30 @@ namespace NVL
|
||||||
switch (Value.index())
|
switch (Value.index())
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
std::cout << "float: " << std::get<float>(Value) << std::endl;
|
std::cout << "Nil" << std::endl;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
std::cout << "string: " << std::get<std::string>(Value) << std::endl;
|
std::cout << "float: " << std::get<float>(Value) << std::endl;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
std::cout << "bool: " << std::get<bool>(Value) << std::endl;
|
if (Is_Symbol)
|
||||||
|
std::cout << "symbol: " << std::get<std::string>(Value) << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "string: " << std::get<std::string>(Value) << std::endl;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
std::cout << "bool: " << std::boolalpha << std::get<bool>(Value) << std::endl;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
std::cout << "List:" << std::endl;
|
std::cout << "List:" << std::endl;
|
||||||
for (auto& x : std::get<std::vector<Object>>(Value))
|
for (auto& x : std::get<std::vector<Object>>(Value))
|
||||||
{
|
{
|
||||||
x.Print(indent + 1);
|
x.Print(indent + 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 5:
|
||||||
|
std::cout << "Nil" << std::endl;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Call::Print(int indent)
|
void Call::Print(int indent)
|
||||||
|
|
14
NouVeL/NVL.h
14
NouVeL/NVL.h
|
@ -10,19 +10,24 @@
|
||||||
|
|
||||||
namespace NVL
|
namespace NVL
|
||||||
{
|
{
|
||||||
|
struct Nil
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
struct Object
|
struct Object
|
||||||
{
|
{
|
||||||
std::variant<
|
std::variant<
|
||||||
|
std::monostate,
|
||||||
float,
|
float,
|
||||||
std::string,
|
std::string,
|
||||||
bool,
|
bool,
|
||||||
std::vector<Object> // Implies Object can be an array of other Object
|
std::vector<Object>, // Implies Object can be an array of other Object
|
||||||
|
Nil
|
||||||
> Value;
|
> Value;
|
||||||
|
|
||||||
bool Is_Token = false;
|
bool Is_Symbol = false;
|
||||||
|
|
||||||
void Print(int indent);
|
void Print(int indent);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Call
|
struct Call
|
||||||
|
@ -63,5 +68,6 @@ namespace NVL
|
||||||
|
|
||||||
void parse_Call(Context parent_context, std::ifstream& nvl);
|
void parse_Call(Context parent_context, std::ifstream& nvl);
|
||||||
|
|
||||||
void parse_Object(Context parent_context, std::ifstream& nvl, bool is_token);
|
template <bool is_parent_call, bool is_symbol>
|
||||||
|
void parse_Object(Context parent_context, std::ifstream& nvl);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ int main()
|
||||||
const std::string PJ_DIR = "E:\\Archive\\Projects\\NouVeL\\";
|
const std::string PJ_DIR = "E:\\Archive\\Projects\\NouVeL\\";
|
||||||
|
|
||||||
NVL::Tree tree;
|
NVL::Tree tree;
|
||||||
NVL::parse_NVL(tree, PJ_DIR + "myfile.txt");
|
NVL::parse_NVL(tree, PJ_DIR + "test.nvl");
|
||||||
|
|
||||||
tree.Print(0);
|
tree.Print(0);
|
||||||
|
|
||||||
|
|
20
myfile.txt
20
myfile.txt
|
@ -1,20 +0,0 @@
|
||||||
dsahd {
|
|
||||||
dasjkhdakjsdasddsmnfdsf
|
|
||||||
asdkashjdsad
|
|
||||||
asdasd\\"fdoy893eryh
|
|
||||||
:awesome:
|
|
||||||
}
|
|
||||||
|
|
||||||
twrgfgdfg {
|
|
||||||
fsgsfg}
|
|
||||||
|
|
||||||
tsr4t4t
|
|
||||||
{
|
|
||||||
dasjkhdakjs
|
|
||||||
}
|
|
||||||
|
|
||||||
65e
|
|
||||||
{
|
|
||||||
afwet4}
|
|
||||||
|
|
||||||
asdjnasd{das;ldmad}
|
|
10
test.nvl
Normal file
10
test.nvl
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
mmawesome
|
||||||
|
{
|
||||||
|
mmawesome mmaji awesome asduhjaiodhj kl;d 3434.3434 true false
|
||||||
|
}
|
||||||
|
|
||||||
|
dasijhdoisaj {}
|
||||||
|
|
||||||
|
uihf98 {
|
||||||
|
dasdj [39439048 jidjao] [] [] [] [[][[][[[[[] hi [2323 d]]]]]]]
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue