Page Menu
Home
Xreate
Search
Configure Global Search
Log In
Docs
Questions
Repository
Issues
Patches
Internal API
Files
F3995729
ast.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Jul 7, 11:51 PM
Size
5 KB
Mime Type
text/x-c++
Expires
Thu, Jul 9, 11:51 PM (1 d, 12 h)
Engine
blob
Format
Raw Data
Handle
271327
Attached To
rXR Xreate
ast.h
View Options
#ifndef AST_H
#define AST_H
#include <vector>
#include <stdlib.h>
#include <string>
#include "llvmlayer.h"
struct Identifier_t {};
struct Number_t {};
struct Type_t {};
template<typename A>
class Atom{
};
template<> class Atom<Identifier_t>
{
public:
Atom(const std::wstring& value)
{
char buffer[1000];
wcstombs(buffer, value.c_str(), 1000);
__value = buffer;
}
const std::string& get() const{return __value; }
private:
std::string __value;
};
template<> class Atom<Number_t>
{
public:
Atom(wchar_t* value)
{
__value = wcstol(value, 0, 10);
}
int get()const {return __value; }
private:
double __value;
};
enum TimePrimitive {Bool, Int, Float, Num, String};
template<> class Atom<Type_t>
{
public:
Atom(wchar_t* value)
{
char buffer_[1000];
wcstombs(buffer_, value, 1000);
std::string buffer(buffer_);
if (buffer=="bool"){
__value = Bool;
} else if (buffer=="int") {
__value = Int;
} else if (buffer=="float") {
__value = Float;
} else if (buffer=="num") {
__value = Num;
} else if (buffer=="string") {
__value = String;
}
}
Atom ()
{
}
TimePrimitive get() const
{
return __value;
}
private:
TimePrimitive __value;
};
typedef Atom<Type_t> TypeAtom;
enum class TypeOperator{LIST};
class TypeAnnotation
{
public:
TypeAnnotation (const Atom<Type_t>& typ);
TypeAnnotation (const TypeOperator& op, const TypeAnnotation& typ);
TypeAnnotation();
llvm::Type* toLLVMType();
private:
TimePrimitive __value;
};
enum class Operator
{
ADD, SUB, MUL, DIV, EQU, LSS, GTR, NEG, LIST, CALL, NONE, IMPL/* implication */
};
class Function;
class AST;
class Expression
{
public:
Expression(const Operator &op, std::initializer_list<Expression> params);
Expression(const Atom<Identifier_t>& ident);
Expression(const Atom<Number_t>& number);
Expression();
void setOp(Operator op);
void addArg(Expression&& arg);
protected:
Operator __op;
std::vector<Expression> operands;
std::string __valueS;
double __valueD;
enum {INVALID, COMPOUND, IDENT, NUMBER, STRING} __state;
};
enum class AnnotationModifier
{NONE, ASSERT, REQUIRE};
enum class DomainAnnotation
{FUNCTION, VARIABLE};
class RuleArguments: public std::vector<std::pair<std::string, DomainAnnotation>>
{
public:
void add(std::string&& name, DomainAnnotation typ);
};
class RuleGuards: public std::vector<Expression>
{
public:
void add(Expression&& e);
};
class MetaRuleAbstract
{
protected:
RuleArguments __args;
RuleGuards __guards;
};
class ClaspLayer;
class RuleWarning: public MetaRuleAbstract
{
friend class ClaspLayer;
public:
void compile(ClaspLayer& layer);
private:
std::string __message;
Expression __condition;
};
typedef unsigned int VID;
/*
class Expression: ExpressionAbstract
{
friend class CFGPass;
public:
llvm::Value* compile(LLVMLayer& l, Function* f, std::string* hintRetVar=0) const;
};
*/
typedef std::pair<VID, TypeAnnotation> VariableDefinition;
typedef std::pair<VID, Expression> VariableDeclaration;
class Function
{
friend class Expression;
friend class CFGPass;
public:
Function(const std::wstring& name);
void setReturnType(const TypeAnnotation& rtyp);
void addArg(const std::wstring& vname, const TypeAnnotation& typ);
void setBody(const Expression& body);
void addAnnotation(const std::wstring& aname, const AnnotationModifier amod);
const std::vector<std::pair<std::string, AnnotationModifier>>& getAnnotations() const;
void addDeclaration(const std::wstring& vname, const TypeAnnotation& typ, const Expression& e);
void addListDeclaration(const std::wstring& vname, const TypeAnnotation& typ, const Expression& e);
const std::string& getName() const;
llvm::Function* compile(LLVMLayer& l);
AST* root;
private:
std::string __name;
TypeAnnotation __retType;
std::vector<std::string> __args;
std::vector<std::pair<std::string, AnnotationModifier>> __tags;
std::map<VariableDefinition::first_type, VariableDefinition::second_type> __definitions;
std::map<VariableDeclaration::first_type, VariableDeclaration::second_type> __declarations;
std::map<std::string, VID> __vartable;
Expression __body;
llvm::Function* __raw;
std::map<VID,llvm::Value*> __rawVars;
VID __vCounter;
VID registerVar(const std::string& vname);
llvm::Value* compileExpression(Expression& expr, LLVMLayer& l, std::string* hintRetVar) const;
};
typedef unsigned int FID;
class AST
{
friend class Expression;
friend class CFGPass;
public:
AST();
void add(Function& f);
void compile(LLVMLayer& l);
void run(LLVMLayer& l);
std::string getModuleName();
FID getFunctionsCount() const;
const Function& getFunctionById(FID id) const;
private:
std::vector<Function> __functions;
std::map<std::string, FID> __indexFunctions;
};
#endif // AST_H
Event Timeline
Log In to Comment