mirror of
https://onedev.site.tesses.net/crosslang/better-crosslang
synced 2026-02-08 10:15:45 +00:00
First commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
build
|
||||||
34
.vscode/launch.json
vendored
Normal file
34
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "(gdb) Launch",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/bcrossc",
|
||||||
|
"args": [],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"cwd": "${workspaceFolder}/build",
|
||||||
|
"environment": [],
|
||||||
|
"externalConsole": false,
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing for gdb",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Set Disassembly Flavor to Intel",
|
||||||
|
"text": "-gdb-set disassembly-flavor intel",
|
||||||
|
"ignoreFailures": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
14
CMakeLists.txt
Normal file
14
CMakeLists.txt
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
|
|
||||||
|
project(BetterCrossLangCompiler)
|
||||||
|
|
||||||
|
find_package(TessesCrossLang REQUIRED)
|
||||||
|
|
||||||
|
add_executable(bcrossc
|
||||||
|
src/bcrossc.cpp
|
||||||
|
src/node.cpp
|
||||||
|
src/parser.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(bcrossc PUBLIC TessesCrossLang::crosslang_shared)
|
||||||
0
result.json
Normal file
0
result.json
Normal file
120
sourceCode.btcross
Normal file
120
sourceCode.btcross
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/*var mylist : List<of Long>?;
|
||||||
|
var str : String = "My Text" + "is" + "Demi Lovato";
|
||||||
|
var myLs : List<of List<of String>>?;
|
||||||
|
var nl : Char = '\n';
|
||||||
|
|
||||||
|
delegate Action<of T>(a: T);
|
||||||
|
delegate Func<of T, TResult>(a: T): TResult;
|
||||||
|
|
||||||
|
var a = 42;
|
||||||
|
var p : Path = "";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func main(args: List<of String>): Long
|
||||||
|
{
|
||||||
|
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
|
||||||
|
func times<of T>(a: T, b: T, typ: Type): T
|
||||||
|
{
|
||||||
|
return a * b;
|
||||||
|
}
|
||||||
|
/^
|
||||||
|
my doc
|
||||||
|
^/
|
||||||
|
func a(arg: String)
|
||||||
|
{
|
||||||
|
if(times<of Long>(6,7) == 42)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"It is the meaning of life {arg}");
|
||||||
|
|
||||||
|
var fs : LocalFilesystem = FS.Local;
|
||||||
|
var path: Path = "/mypath";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
each(var v : Char in "Demi Lovato")
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i : Long = 0; i < 42; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func b(a,b)
|
||||||
|
{
|
||||||
|
var c = 52;
|
||||||
|
c += a;
|
||||||
|
c += b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
func c(a: Long, b: Long): Long
|
||||||
|
{
|
||||||
|
var c : Long = 52;
|
||||||
|
c += a;
|
||||||
|
c += b;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
func d()
|
||||||
|
{
|
||||||
|
var e : Func<of Long, Long, Long> = (a: Long, b: Long) => : Long {
|
||||||
|
Console.WriteLine(a + b);
|
||||||
|
return 42;
|
||||||
|
};
|
||||||
|
|
||||||
|
var file: ByteArray = embed("demi.bin");
|
||||||
|
}
|
||||||
|
namespace FS {
|
||||||
|
extern var Local: LocalFilesystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
use FS;
|
||||||
|
|
||||||
|
interface IAddable<of T> {
|
||||||
|
func add(val: T): T;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Add : IAddable<of Long> {
|
||||||
|
private val: Long
|
||||||
|
public func Add(a: Long)
|
||||||
|
{
|
||||||
|
this.val = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
public func add(a: Long): Long
|
||||||
|
{
|
||||||
|
return this.val + a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
/^
|
||||||
|
The filesystem API
|
||||||
|
^/
|
||||||
|
namespace FS {
|
||||||
|
/^
|
||||||
|
The local filesystem
|
||||||
|
^/
|
||||||
|
extern var Local: LocalFilesystem;
|
||||||
|
}
|
||||||
|
/^
|
||||||
|
My interface
|
||||||
|
^/
|
||||||
|
interface MyInterface<of T> : IOtherInterface<of T, String>, IAN {
|
||||||
|
/^
|
||||||
|
Me
|
||||||
|
@name "Steve"
|
||||||
|
^/
|
||||||
|
func doThing(a: T): Long;
|
||||||
|
}
|
||||||
19
src/bcrossc.cpp
Normal file
19
src/bcrossc.cpp
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#include "bcrossc.hpp"
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
using namespace Tesses::Framework;
|
||||||
|
using namespace Tesses::CrossLang;
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
TF_Init();
|
||||||
|
std::ifstream strm("../sourceCode.btcross",std::ios_base::binary);
|
||||||
|
std::vector<LexToken> tokens;
|
||||||
|
|
||||||
|
Lex("sourceCode.btcross",strm, tokens);
|
||||||
|
BCParser parser(tokens);
|
||||||
|
auto node = parser.ParseRoot();
|
||||||
|
auto json = node->ToJsonObject();
|
||||||
|
std::cout << Tesses::Framework::Serialization::Json::Json::Encode(json) << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
296
src/bcrossc.hpp
Normal file
296
src/bcrossc.hpp
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
#include <CrossLang.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Tesses::CrossLang {
|
||||||
|
using TF_JToken = Tesses::Framework::Serialization::Json::JToken;
|
||||||
|
class BNode {
|
||||||
|
public:
|
||||||
|
virtual bool IsExpression() = 0;
|
||||||
|
virtual ~BNode() = default;
|
||||||
|
virtual TF_JToken ToJsonObject() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
using BSyntaxNode = std::shared_ptr<BNode>;
|
||||||
|
|
||||||
|
struct BType {
|
||||||
|
std::vector<std::string> nameParts;
|
||||||
|
std::vector<BType> generics;
|
||||||
|
bool nullable=false;
|
||||||
|
std::string Stringify();
|
||||||
|
};
|
||||||
|
class BUndefined : public BNode {
|
||||||
|
public:
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
};
|
||||||
|
class BNull : public BNode {
|
||||||
|
public:
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
};
|
||||||
|
class BString : public BNode {
|
||||||
|
public:
|
||||||
|
BString(std::string text);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
std::string text;
|
||||||
|
};
|
||||||
|
class BChar : public BNode {
|
||||||
|
public:
|
||||||
|
BChar(char value);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
char value;
|
||||||
|
};
|
||||||
|
class BBoolean : public BNode {
|
||||||
|
public:
|
||||||
|
BBoolean(bool text);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
bool value;
|
||||||
|
};
|
||||||
|
class BLong : public BNode {
|
||||||
|
public:
|
||||||
|
BLong(int64_t text);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
int64_t value;
|
||||||
|
};
|
||||||
|
class BDouble : public BNode {
|
||||||
|
public:
|
||||||
|
BDouble(double text);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
double value;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BUnaryExpression : public BNode {
|
||||||
|
public:
|
||||||
|
BUnaryExpression(std::string_view type, BSyntaxNode val);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
std::string_view type;
|
||||||
|
BSyntaxNode value;
|
||||||
|
};
|
||||||
|
class BBinaryExpression : public BNode {
|
||||||
|
public:
|
||||||
|
BBinaryExpression(std::string_view type, BSyntaxNode left, BSyntaxNode right);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
std::string_view type;
|
||||||
|
BSyntaxNode left;
|
||||||
|
BSyntaxNode right;
|
||||||
|
};
|
||||||
|
class BTernaryExpression : public BNode {
|
||||||
|
public:
|
||||||
|
BTernaryExpression(BSyntaxNode cond, BSyntaxNode yes, BSyntaxNode no);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
BSyntaxNode cond;
|
||||||
|
BSyntaxNode yes;
|
||||||
|
BSyntaxNode no;
|
||||||
|
};
|
||||||
|
class BIfStatement : public BNode {
|
||||||
|
public:
|
||||||
|
BIfStatement(BSyntaxNode cond, BSyntaxNode yes, BSyntaxNode no);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
BSyntaxNode cond;
|
||||||
|
BSyntaxNode yes;
|
||||||
|
BSyntaxNode no;
|
||||||
|
};
|
||||||
|
class BEachStatement : public BNode {
|
||||||
|
public:
|
||||||
|
BEachStatement(BSyntaxNode var, BSyntaxNode list, BSyntaxNode body);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
BSyntaxNode var;
|
||||||
|
BSyntaxNode list;
|
||||||
|
BSyntaxNode body;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BExternVariableNode : public BNode {
|
||||||
|
public:
|
||||||
|
BExternVariableNode(std::string documentation,std::string name, BType type);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
std::string documentation;
|
||||||
|
std::string name;
|
||||||
|
BType type;
|
||||||
|
};
|
||||||
|
class BExternFuncNode : public BNode {
|
||||||
|
public:
|
||||||
|
BExternFuncNode(std::string documentation,BType returnType, BType name, BSyntaxNode args);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
std::string documentation;
|
||||||
|
BType returnType;
|
||||||
|
BType name;
|
||||||
|
BSyntaxNode args;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BNamespaceNode : public BNode {
|
||||||
|
public:
|
||||||
|
BNamespaceNode(BType name, BSyntaxNode body);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
BType name;
|
||||||
|
BSyntaxNode body;
|
||||||
|
};
|
||||||
|
class BUsingType : public BNode {
|
||||||
|
public:
|
||||||
|
BUsingType(BType name, BType type);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
BType name;
|
||||||
|
BType type;
|
||||||
|
};
|
||||||
|
class BUsingNamespace : public BNode {
|
||||||
|
public:
|
||||||
|
BUsingNamespace(BType name);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
BType name;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BVariableDeclarationNode : public BNode {
|
||||||
|
public:
|
||||||
|
BVariableDeclarationNode(std::string documetnation,std::string name, BType type, BSyntaxNode value);
|
||||||
|
std::string documentation;
|
||||||
|
std::string name;
|
||||||
|
BType type;
|
||||||
|
BSyntaxNode value;
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
};
|
||||||
|
|
||||||
|
class BArgumentNode : public BNode {
|
||||||
|
public:
|
||||||
|
BArgumentNode(std::string name, BType type);
|
||||||
|
std::string name;
|
||||||
|
BType type;
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
};
|
||||||
|
class BGetVariableExpression : public BNode {
|
||||||
|
public:
|
||||||
|
BGetVariableExpression(std::string name);
|
||||||
|
std::string name;
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
};
|
||||||
|
|
||||||
|
class BScopeNode : public BNode {
|
||||||
|
bool isExpression;
|
||||||
|
bool isRoot;
|
||||||
|
public:
|
||||||
|
BScopeNode(bool isRoot=false,bool isExpression=false);
|
||||||
|
bool IsRoot();
|
||||||
|
bool IsExpression();
|
||||||
|
std::vector<BSyntaxNode> childern;
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class BFunctionNode : public BNode {
|
||||||
|
public:
|
||||||
|
BFunctionNode(std::string documentation,BType returnType, BType name, BSyntaxNode args, BSyntaxNode body);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
std::string documentation;
|
||||||
|
BType returnType;
|
||||||
|
BType name;
|
||||||
|
BSyntaxNode args;
|
||||||
|
BSyntaxNode body;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BClosureExpression : public BNode {
|
||||||
|
public:
|
||||||
|
BClosureExpression(BType returnType, BSyntaxNode args, BSyntaxNode body);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
BType returnType;
|
||||||
|
BSyntaxNode args;
|
||||||
|
BSyntaxNode body;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BFunctionCallExpression : public BNode {
|
||||||
|
public:
|
||||||
|
BFunctionCallExpression(BSyntaxNode fun, BSyntaxNode args, std::vector<BType> generics);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
BSyntaxNode fun;
|
||||||
|
BSyntaxNode args;
|
||||||
|
std::vector<BType> generics;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class BDelegateNode : public BNode {
|
||||||
|
public:
|
||||||
|
BDelegateNode(std::string documentation,BType returnType, BType name, BSyntaxNode args);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
std::string documentation;
|
||||||
|
BType returnType;
|
||||||
|
BType name;
|
||||||
|
BSyntaxNode args;
|
||||||
|
};
|
||||||
|
class BInterfaceNode : public BNode {
|
||||||
|
public:
|
||||||
|
BInterfaceNode(std::string documentation, BType name);
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
std::string documentation;
|
||||||
|
BType name;
|
||||||
|
std::vector<BType> inherits;
|
||||||
|
std::vector<BFunctionNode> funs;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BReturnNode : public BNode {
|
||||||
|
public:
|
||||||
|
BReturnNode(BSyntaxNode retVal);
|
||||||
|
BSyntaxNode retVal;
|
||||||
|
bool IsExpression();
|
||||||
|
TF_JToken ToJsonObject();
|
||||||
|
};
|
||||||
|
|
||||||
|
class BCParser {
|
||||||
|
size_t i = 0;
|
||||||
|
std::vector<LexToken> tokens;
|
||||||
|
BSyntaxNode ParseNode(bool isRoot=false);
|
||||||
|
LexToken tkn;
|
||||||
|
void EnsureSymbol(std::string txt);
|
||||||
|
bool IsIdentifier(std::string txt,bool pop=true);
|
||||||
|
bool IsAnyIdentifier(std::initializer_list<std::string> idents, bool pop=true);
|
||||||
|
bool IsSymbol(std::string txt,bool pop=true);
|
||||||
|
bool IsAnySymbol(std::initializer_list<std::string> idents, bool pop=true);
|
||||||
|
std::string ReadIdentifier();
|
||||||
|
BType ReadType();
|
||||||
|
bool IsGeneric();
|
||||||
|
void ReadGenerics(std::vector<BType>& generics);
|
||||||
|
BSyntaxNode ParseParenElement();
|
||||||
|
BSyntaxNode ParseParen();
|
||||||
|
BSyntaxNode ParseAssignment();
|
||||||
|
BSyntaxNode ParseSum();
|
||||||
|
BSyntaxNode ParseNullCoalescing();
|
||||||
|
BSyntaxNode ParseTernary();
|
||||||
|
BSyntaxNode ParseShift();
|
||||||
|
BSyntaxNode ParseRel();
|
||||||
|
BSyntaxNode ParseEq();
|
||||||
|
BSyntaxNode ParseBAnd();
|
||||||
|
BSyntaxNode ParseExpression();
|
||||||
|
BSyntaxNode ParseXOr();
|
||||||
|
BSyntaxNode ParseBOr();
|
||||||
|
BSyntaxNode ParseLAnd();
|
||||||
|
BSyntaxNode ParseLOr();
|
||||||
|
BSyntaxNode ParseFactor();
|
||||||
|
BSyntaxNode ParseUnary();
|
||||||
|
BSyntaxNode ParseValue();
|
||||||
|
|
||||||
|
public:
|
||||||
|
BCParser(const std::vector<LexToken>& tokens);
|
||||||
|
BSyntaxNode ParseRoot();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
513
src/node.cpp
Normal file
513
src/node.cpp
Normal file
@@ -0,0 +1,513 @@
|
|||||||
|
#include "bcrossc.hpp"
|
||||||
|
using namespace Tesses::Framework::Serialization::Json;
|
||||||
|
namespace Tesses::CrossLang {
|
||||||
|
BScopeNode::BScopeNode(bool isRoot,bool isExpression) : isRoot(isRoot), isExpression(isExpression)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BScopeNode::IsRoot()
|
||||||
|
{
|
||||||
|
return isRoot;
|
||||||
|
}
|
||||||
|
bool BScopeNode::IsExpression()
|
||||||
|
{
|
||||||
|
return isExpression;
|
||||||
|
}
|
||||||
|
TF_JToken BScopeNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type", "ScopeNode");
|
||||||
|
o.SetValue("IsRoot", isRoot);
|
||||||
|
o.SetValue("IsExpression", isExpression);
|
||||||
|
|
||||||
|
JArray a;
|
||||||
|
for(auto& item : this->childern)
|
||||||
|
{
|
||||||
|
a.Add(item->ToJsonObject());
|
||||||
|
}
|
||||||
|
o.SetValue("Childern",a);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool BNull::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
TF_JToken BNull::ToJsonObject()
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
BVariableDeclarationNode::BVariableDeclarationNode(std::string documentation,std::string name, BType type, BSyntaxNode value)
|
||||||
|
: documentation(documentation), name(name), type(type), value(value)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BVariableDeclarationNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BVariableDeclarationNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type", "VariableDeclarationNode");
|
||||||
|
o.SetValue("TypeString", this->type.Stringify());
|
||||||
|
o.SetValue("Name", this->name);
|
||||||
|
o.SetValue("Documentation",this->documentation);
|
||||||
|
if(this->value)
|
||||||
|
o.SetValue("Value", this->value->ToJsonObject());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BBinaryExpression::BBinaryExpression(std::string_view type, BSyntaxNode left, BSyntaxNode right) : type(type), left(left), right(right)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BBinaryExpression::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BBinaryExpression::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type",(std::string)this->type);
|
||||||
|
if(this->left)
|
||||||
|
o.SetValue("Left", this->left->ToJsonObject());
|
||||||
|
|
||||||
|
if(this->right)
|
||||||
|
o.SetValue("Right", this->right->ToJsonObject());
|
||||||
|
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BUnaryExpression::BUnaryExpression(std::string_view type, BSyntaxNode value) : type(type), value(value)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BUnaryExpression::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BUnaryExpression::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type",(std::string)this->type);
|
||||||
|
if(this->value)
|
||||||
|
o.SetValue("Value", this->value->ToJsonObject());
|
||||||
|
|
||||||
|
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BTernaryExpression::BTernaryExpression(BSyntaxNode cond, BSyntaxNode yes, BSyntaxNode no): cond(cond), yes(yes), no(no)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BTernaryExpression::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BTernaryExpression::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","TernaryExpression");
|
||||||
|
if(this->cond)
|
||||||
|
o.SetValue("Condition", this->cond->ToJsonObject());
|
||||||
|
|
||||||
|
if(this->yes)
|
||||||
|
o.SetValue("True", this->yes->ToJsonObject());
|
||||||
|
|
||||||
|
|
||||||
|
if(this->no)
|
||||||
|
o.SetValue("False", this->no->ToJsonObject());
|
||||||
|
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BIfStatement::BIfStatement(BSyntaxNode cond, BSyntaxNode yes, BSyntaxNode no): cond(cond), yes(yes), no(no)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BIfStatement::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BIfStatement::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","IfStatement");
|
||||||
|
if(this->cond)
|
||||||
|
o.SetValue("Condition", this->cond->ToJsonObject());
|
||||||
|
|
||||||
|
if(this->yes)
|
||||||
|
o.SetValue("True", this->yes->ToJsonObject());
|
||||||
|
|
||||||
|
|
||||||
|
if(this->no)
|
||||||
|
o.SetValue("False", this->no->ToJsonObject());
|
||||||
|
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BString::BString(std::string text) : text(text)
|
||||||
|
{}
|
||||||
|
bool BString::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BString::ToJsonObject()
|
||||||
|
{
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BChar::BChar(char value) : value(value)
|
||||||
|
{}
|
||||||
|
bool BChar::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BChar::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","Char");
|
||||||
|
o.SetValue("Value", std::string{value});
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BLong::BLong(int64_t value) : value(value)
|
||||||
|
{}
|
||||||
|
bool BLong::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BLong::ToJsonObject()
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
BDouble::BDouble(double value) : value(value)
|
||||||
|
{}
|
||||||
|
bool BDouble::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BDouble::ToJsonObject()
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
BBoolean::BBoolean(bool value) : value(value)
|
||||||
|
{}
|
||||||
|
bool BBoolean::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BBoolean::ToJsonObject()
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
BArgumentNode::BArgumentNode(std::string name, BType type): name(name), type(type)
|
||||||
|
{}
|
||||||
|
bool BArgumentNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BArgumentNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","ArgumentNode");
|
||||||
|
o.SetValue("Name",this->name);
|
||||||
|
o.SetValue("TypeString",this->type.Stringify());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BGetVariableExpression::BGetVariableExpression(std::string name) : name(name)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BGetVariableExpression::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BGetVariableExpression::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","GetVariableExpression");
|
||||||
|
o.SetValue("Name",this->name);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BUndefined::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BUndefined::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","Undefined");
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BFunctionNode::BFunctionNode(std::string documentation,BType returnType, BType name, BSyntaxNode args, BSyntaxNode body): documentation(documentation), returnType(returnType), name(name), args(args), body(body)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BFunctionNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BFunctionNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","FunctionNode");
|
||||||
|
o.SetValue("ReturnType", this->returnType.Stringify());
|
||||||
|
o.SetValue("Name", this->name.Stringify());
|
||||||
|
o.SetValue("Documentation",this->documentation);
|
||||||
|
if(this->args)
|
||||||
|
o.SetValue("Arguments", this->args->ToJsonObject());
|
||||||
|
if(this->body)
|
||||||
|
o.SetValue("Body",this->body->ToJsonObject());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BClosureExpression::BClosureExpression(BType returnType, BSyntaxNode args, BSyntaxNode body): returnType(returnType), args(args), body(body)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BClosureExpression::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BClosureExpression::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","ClosureExpression");
|
||||||
|
o.SetValue("ReturnType", this->returnType.Stringify());
|
||||||
|
|
||||||
|
if(this->args)
|
||||||
|
o.SetValue("Arguments", this->args->ToJsonObject());
|
||||||
|
if(this->body)
|
||||||
|
o.SetValue("Body",this->body->ToJsonObject());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
BDelegateNode::BDelegateNode(std::string documentation,BType returnType, BType name, BSyntaxNode args): documentation(documentation),returnType(returnType), name(name), args(args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BDelegateNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BDelegateNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","DelegateNode");
|
||||||
|
o.SetValue("ReturnType", this->returnType.Stringify());
|
||||||
|
o.SetValue("Name", this->name.Stringify());
|
||||||
|
if(this->args)
|
||||||
|
o.SetValue("Arguments", this->args->ToJsonObject());
|
||||||
|
o.SetValue("Documentation",this->documentation);
|
||||||
|
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BReturnNode::BReturnNode(BSyntaxNode retVal): retVal(retVal)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BReturnNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BReturnNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","ReturnNode");
|
||||||
|
if(this->retVal)
|
||||||
|
o.SetValue("Value",this->retVal->ToJsonObject());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BFunctionCallExpression::BFunctionCallExpression(BSyntaxNode fun, BSyntaxNode args, std::vector<BType> generics)
|
||||||
|
:fun(fun), args(args), generics(generics)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BFunctionCallExpression::IsExpression()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
TF_JToken BFunctionCallExpression::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","FunctionCallExpression");
|
||||||
|
if(this->args)
|
||||||
|
o.SetValue("Arguments",this->args->ToJsonObject());
|
||||||
|
if(this->fun)
|
||||||
|
o.SetValue("Function", this->fun->ToJsonObject());
|
||||||
|
if(!this->generics.empty())
|
||||||
|
{
|
||||||
|
JArray a;
|
||||||
|
for(auto& item : this->generics)
|
||||||
|
{
|
||||||
|
a.Add(item.Stringify());
|
||||||
|
}
|
||||||
|
o.SetValue("Generics",a);
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEachStatement::BEachStatement(BSyntaxNode var, BSyntaxNode list, BSyntaxNode body)
|
||||||
|
:var(var), list(list), body(body)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BEachStatement::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BEachStatement::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","EachStatement");
|
||||||
|
if(this->var)
|
||||||
|
o.SetValue("Variable", this->var->ToJsonObject());
|
||||||
|
if(this->list)
|
||||||
|
o.SetValue("List",this->list->ToJsonObject());
|
||||||
|
if(this->body)
|
||||||
|
o.SetValue("Body", this->body->ToJsonObject());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BExternFuncNode::BExternFuncNode(std::string documentation,BType returnType, BType name, BSyntaxNode args): documentation(documentation),
|
||||||
|
returnType(returnType), name(name), args(args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BExternFuncNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TF_JToken BExternFuncNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","ExternFuncNode");
|
||||||
|
if(this->args)
|
||||||
|
o.SetValue("Arguments",this->args->ToJsonObject());
|
||||||
|
o.SetValue("Name",this->name.Stringify());
|
||||||
|
o.SetValue("ReturnType",this->returnType.Stringify());
|
||||||
|
o.SetValue("Documentation",this->documentation);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BExternVariableNode::BExternVariableNode(std::string documentation,std::string name, BType type) : documentation(documentation), name(name), type(type)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BExternVariableNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BExternVariableNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","ExternVariableNode");
|
||||||
|
o.SetValue("Name",this->name);
|
||||||
|
o.SetValue("Documentation",this->documentation);
|
||||||
|
o.SetValue("TypeString", this->type.Stringify());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BNamespaceNode::BNamespaceNode(BType name, BSyntaxNode body):
|
||||||
|
name(name), body(body)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BNamespaceNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TF_JToken BNamespaceNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","NamespaceNode");
|
||||||
|
o.SetValue("Name",this->name.Stringify());
|
||||||
|
if(this->body)
|
||||||
|
o.SetValue("Body",this->body->ToJsonObject());
|
||||||
|
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BUsingType::BUsingType(BType name, BType type):
|
||||||
|
name(name), type(type)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BUsingType::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BUsingType::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","UsingType");
|
||||||
|
o.SetValue("Name",this->name.Stringify());
|
||||||
|
o.SetValue("TypeString",this->type.Stringify());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BUsingNamespace::BUsingNamespace(BType name): name(name)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BUsingNamespace::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TF_JToken BUsingNamespace::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type", "UsingNamespace");
|
||||||
|
o.SetValue("Name",this->name.Stringify());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
BInterfaceNode::BInterfaceNode(std::string documentation, BType name):
|
||||||
|
documentation(documentation), name(name)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
bool BInterfaceNode::IsExpression()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TF_JToken BInterfaceNode::ToJsonObject()
|
||||||
|
{
|
||||||
|
JObject o;
|
||||||
|
o.SetValue("Type","InterfaceNode");
|
||||||
|
o.SetValue("Documentation",this->documentation);
|
||||||
|
o.SetValue("Name",this->name.Stringify());
|
||||||
|
JArray a;
|
||||||
|
for(auto& item : this->inherits)
|
||||||
|
{
|
||||||
|
a.Add(item.Stringify());
|
||||||
|
}
|
||||||
|
o.SetValue("Inherits", a);
|
||||||
|
a.Clear();
|
||||||
|
for(auto& item : this->funs)
|
||||||
|
{
|
||||||
|
a.Add(item.ToJsonObject());
|
||||||
|
}
|
||||||
|
o.SetValue("Functions",a);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
}
|
||||||
1087
src/parser.cpp
Normal file
1087
src/parser.cpp
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user