Merge pull request #20 from rafalgrodzinski/14-handle-types-through-a-single-class
Handle types through a single class
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
#include "ModuleBuilder.h"
|
#include "ModuleBuilder.h"
|
||||||
|
|
||||||
|
#include "Parser/ValueType.h"
|
||||||
|
|
||||||
#include "Parser/Expression/ExpressionGrouping.h"
|
#include "Parser/Expression/ExpressionGrouping.h"
|
||||||
#include "Parser/Expression/ExpressionLiteral.h"
|
#include "Parser/Expression/ExpressionLiteral.h"
|
||||||
#include "Parser/Expression/ExpressionVariable.h"
|
#include "Parser/Expression/ExpressionVariable.h"
|
||||||
@@ -71,7 +73,7 @@ void ModuleBuilder::buildStatement(shared_ptr<Statement> statement) {
|
|||||||
void ModuleBuilder::buildFunctionDeclaration(shared_ptr<StatementFunction> statement) {
|
void ModuleBuilder::buildFunctionDeclaration(shared_ptr<StatementFunction> statement) {
|
||||||
// get argument types
|
// get argument types
|
||||||
vector<llvm::Type *> types;
|
vector<llvm::Type *> types;
|
||||||
for (pair<string, ValueType> &arg : statement->getArguments()) {
|
for (pair<string, shared_ptr<ValueType>> &arg : statement->getArguments()) {
|
||||||
types.push_back(typeForValueType(arg.second));
|
types.push_back(typeForValueType(arg.second));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +186,7 @@ void ModuleBuilder::buildLoop(shared_ptr<StatementRepeat> statement) {
|
|||||||
void ModuleBuilder::buildMetaExternFunction(shared_ptr<StatementMetaExternFunction> statement) {
|
void ModuleBuilder::buildMetaExternFunction(shared_ptr<StatementMetaExternFunction> statement) {
|
||||||
// get argument types
|
// get argument types
|
||||||
vector<llvm::Type *> types;
|
vector<llvm::Type *> types;
|
||||||
for (pair<string, ValueType> &arg : statement->getArguments()) {
|
for (pair<string, shared_ptr<ValueType>> &arg : statement->getArguments()) {
|
||||||
types.push_back(typeForValueType(arg.second));
|
types.push_back(typeForValueType(arg.second));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,14 +228,14 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr<Expression> expression
|
|||||||
}
|
}
|
||||||
|
|
||||||
llvm::Value *ModuleBuilder::valueForLiteral(shared_ptr<ExpressionLiteral> expression) {
|
llvm::Value *ModuleBuilder::valueForLiteral(shared_ptr<ExpressionLiteral> expression) {
|
||||||
switch (expression->getValueType()) {
|
switch (expression->getValueType()->getKind()) {
|
||||||
case ValueType::NONE:
|
case ValueTypeKind::NONE:
|
||||||
return llvm::UndefValue::get(typeVoid);
|
return llvm::UndefValue::get(typeVoid);
|
||||||
case ValueType::BOOL:
|
case ValueTypeKind::BOOL:
|
||||||
return llvm::ConstantInt::get(typeBool, expression->getBoolValue(), true);
|
return llvm::ConstantInt::get(typeBool, expression->getBoolValue(), true);
|
||||||
case ValueType::SINT32:
|
case ValueTypeKind::SINT32:
|
||||||
return llvm::ConstantInt::get(typeSint32, expression->getSint32Value(), true);
|
return llvm::ConstantInt::get(typeSint32, expression->getSint32Value(), true);
|
||||||
case ValueType::REAL32:
|
case ValueTypeKind::REAL32:
|
||||||
return llvm::ConstantInt::get(typeReal32, expression->getReal32Value(), true);
|
return llvm::ConstantInt::get(typeReal32, expression->getReal32Value(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -393,15 +395,15 @@ llvm::Value *ModuleBuilder::valueForCall(shared_ptr<ExpressionCall> expression)
|
|||||||
return builder->CreateCall(funType, fun, llvm::ArrayRef(argValues));
|
return builder->CreateCall(funType, fun, llvm::ArrayRef(argValues));
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Type *ModuleBuilder::typeForValueType(ValueType valueType) {
|
llvm::Type *ModuleBuilder::typeForValueType(shared_ptr<ValueType> valueType) {
|
||||||
switch (valueType) {
|
switch (valueType->getKind()) {
|
||||||
case ValueType::NONE:
|
case ValueTypeKind::NONE:
|
||||||
return typeVoid;
|
return typeVoid;
|
||||||
case ValueType::BOOL:
|
case ValueTypeKind::BOOL:
|
||||||
return typeBool;
|
return typeBool;
|
||||||
case ValueType::SINT32:
|
case ValueTypeKind::SINT32:
|
||||||
return typeSint32;
|
return typeSint32;
|
||||||
case ValueType::REAL32:
|
case ValueTypeKind::REAL32:
|
||||||
return typeReal32;
|
return typeReal32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#include <llvm/Support/raw_ostream.h>
|
#include <llvm/Support/raw_ostream.h>
|
||||||
#include <llvm/IR/Verifier.h>
|
#include <llvm/IR/Verifier.h>
|
||||||
|
|
||||||
#include "Types.h"
|
class ValueType;
|
||||||
|
|
||||||
class Expression;
|
class Expression;
|
||||||
class ExpressionGrouping;
|
class ExpressionGrouping;
|
||||||
@@ -72,7 +72,7 @@ private:
|
|||||||
llvm::Value *valueForVar(shared_ptr<ExpressionVariable> expression);
|
llvm::Value *valueForVar(shared_ptr<ExpressionVariable> expression);
|
||||||
llvm::Value *valueForCall(shared_ptr<ExpressionCall> expression);
|
llvm::Value *valueForCall(shared_ptr<ExpressionCall> expression);
|
||||||
|
|
||||||
llvm::Type *typeForValueType(ValueType valueType);
|
llvm::Type *typeForValueType(shared_ptr<ValueType> valueType);
|
||||||
void failWithMessage(string message);
|
void failWithMessage(string message);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
#include "Error.h"
|
#include "Error.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
Lexer::Lexer(string source): source(source) {
|
Lexer::Lexer(string source):
|
||||||
}
|
source(source) { }
|
||||||
|
|
||||||
vector<shared_ptr<Token>> Lexer::getTokens() {
|
vector<shared_ptr<Token>> Lexer::getTokens() {
|
||||||
currentIndex = 0;
|
currentIndex = 0;
|
||||||
|
|||||||
@@ -45,8 +45,7 @@ vector<TokenKind> Token::tokensLiteral = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Token::Token(TokenKind kind, string lexme, int line, int column):
|
Token::Token(TokenKind kind, string lexme, int line, int column):
|
||||||
kind(kind), lexme(lexme), line(line), column(column) {
|
kind(kind), lexme(lexme), line(line), column(column) { }
|
||||||
}
|
|
||||||
|
|
||||||
TokenKind Token::getKind() {
|
TokenKind Token::getKind() {
|
||||||
return kind;
|
return kind;
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "Types.h"
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
enum class TokenKind {
|
enum class TokenKind {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "Lexer/Token.h"
|
#include "Lexer/Token.h"
|
||||||
|
#include "Parser/ValueType.h"
|
||||||
|
|
||||||
#include "Parser/Statement/Statement.h"
|
#include "Parser/Statement/Statement.h"
|
||||||
#include "Parser/Statement/StatementMetaExternFunction.h"
|
#include "Parser/Statement/StatementMetaExternFunction.h"
|
||||||
@@ -150,6 +151,7 @@ string Logger::toString(TokenKind tokenKind) {
|
|||||||
case TokenKind::INTEGER_DEC:
|
case TokenKind::INTEGER_DEC:
|
||||||
case TokenKind::INTEGER_HEX:
|
case TokenKind::INTEGER_HEX:
|
||||||
case TokenKind::INTEGER_BIN:
|
case TokenKind::INTEGER_BIN:
|
||||||
|
case TokenKind::INTEGER_CHAR:
|
||||||
return "LITERAL(INTEGER)";
|
return "LITERAL(INTEGER)";
|
||||||
case TokenKind::REAL:
|
case TokenKind::REAL:
|
||||||
return "LITERAL(REAL)";
|
return "LITERAL(REAL)";
|
||||||
@@ -179,6 +181,19 @@ string Logger::toString(TokenKind tokenKind) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string Logger::toString(shared_ptr<ValueType> valueType) {
|
||||||
|
switch (valueType->getKind()) {
|
||||||
|
case ValueTypeKind::NONE:
|
||||||
|
return "NONE";
|
||||||
|
case ValueTypeKind::BOOL:
|
||||||
|
return "BOOL";
|
||||||
|
case ValueTypeKind::SINT32:
|
||||||
|
return "SINT32";
|
||||||
|
case ValueTypeKind::REAL32:
|
||||||
|
return "REAL32";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
string Logger::toString(shared_ptr<Statement> statement) {
|
string Logger::toString(shared_ptr<Statement> statement) {
|
||||||
switch (statement->getKind()) {
|
switch (statement->getKind()) {
|
||||||
case StatementKind::META_EXTERN_FUNCTION:
|
case StatementKind::META_EXTERN_FUNCTION:
|
||||||
@@ -281,19 +296,6 @@ string Logger::toString(shared_ptr<StatementExpression> statement) {
|
|||||||
return format("EXPR({})", toString(statement->getExpression()));
|
return format("EXPR({})", toString(statement->getExpression()));
|
||||||
}
|
}
|
||||||
|
|
||||||
string Logger::toString(ValueType valueType) {
|
|
||||||
switch (valueType) {
|
|
||||||
case ValueType::NONE:
|
|
||||||
return "NONE";
|
|
||||||
case ValueType::BOOL:
|
|
||||||
return "BOOL";
|
|
||||||
case ValueType::SINT32:
|
|
||||||
return "SINT32";
|
|
||||||
case ValueType::REAL32:
|
|
||||||
return "REAL32";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
string Logger::toString(shared_ptr<Expression> expression) {
|
string Logger::toString(shared_ptr<Expression> expression) {
|
||||||
switch (expression->getKind()) {
|
switch (expression->getKind()) {
|
||||||
case ExpressionKind::BINARY:
|
case ExpressionKind::BINARY:
|
||||||
@@ -337,6 +339,8 @@ string Logger::toString(shared_ptr<ExpressionBinary> expression) {
|
|||||||
return "{/ " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}";
|
return "{/ " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}";
|
||||||
case ExpressionBinaryOperation::MOD:
|
case ExpressionBinaryOperation::MOD:
|
||||||
return "{% " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}";
|
return "{% " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}";
|
||||||
|
case ExpressionBinaryOperation::INVALID:
|
||||||
|
return "{INVALID}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,14 +367,14 @@ string Logger::toString(shared_ptr<ExpressionGrouping> expression) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
string Logger::toString(shared_ptr<ExpressionLiteral> expression) {
|
string Logger::toString(shared_ptr<ExpressionLiteral> expression) {
|
||||||
switch (expression->getValueType()) {
|
switch (expression->getValueType()->getKind()) {
|
||||||
case ValueType::NONE:
|
case ValueTypeKind::NONE:
|
||||||
return "NONE";
|
return "NONE";
|
||||||
case ValueType::BOOL:
|
case ValueTypeKind::BOOL:
|
||||||
return expression->getBoolValue() ? "true" : "false";
|
return expression->getBoolValue() ? "true" : "false";
|
||||||
case ValueType::SINT32:
|
case ValueTypeKind::SINT32:
|
||||||
return to_string(expression->getSint32Value());
|
return to_string(expression->getSint32Value());
|
||||||
case ValueType::REAL32:
|
case ValueTypeKind::REAL32:
|
||||||
return to_string(expression->getReal32Value());
|
return to_string(expression->getReal32Value());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
class Token;
|
class Token;
|
||||||
enum class TokenKind;
|
enum class TokenKind;
|
||||||
|
class ValueType;
|
||||||
|
|
||||||
class Statement;
|
class Statement;
|
||||||
class StatementMetaExternFunction;
|
class StatementMetaExternFunction;
|
||||||
class StatementVariable;
|
class StatementVariable;
|
||||||
@@ -24,8 +26,6 @@ class ExpressionLiteral;
|
|||||||
class ExpressionCall;
|
class ExpressionCall;
|
||||||
class ExpressionBlock;
|
class ExpressionBlock;
|
||||||
|
|
||||||
enum class ValueType;
|
|
||||||
|
|
||||||
class Error;
|
class Error;
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@@ -34,6 +34,7 @@ class Logger {
|
|||||||
private:
|
private:
|
||||||
static string toString(shared_ptr<Token> token);
|
static string toString(shared_ptr<Token> token);
|
||||||
static string toString(TokenKind tokenKind);
|
static string toString(TokenKind tokenKind);
|
||||||
|
static string toString(shared_ptr<ValueType> valueType);
|
||||||
|
|
||||||
static string toString(shared_ptr<Statement> statement);
|
static string toString(shared_ptr<Statement> statement);
|
||||||
static string toString(shared_ptr<StatementMetaExternFunction> statement);
|
static string toString(shared_ptr<StatementMetaExternFunction> statement);
|
||||||
@@ -54,8 +55,6 @@ private:
|
|||||||
static string toString(shared_ptr<ExpressionCall> expression);
|
static string toString(shared_ptr<ExpressionCall> expression);
|
||||||
static string toString(shared_ptr<ExpressionBlock> expression);
|
static string toString(shared_ptr<ExpressionBlock> expression);
|
||||||
|
|
||||||
static string toString(ValueType valueType);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void print(vector<shared_ptr<Token>> tokens);
|
static void print(vector<shared_ptr<Token>> tokens);
|
||||||
static void print(vector<shared_ptr<Statement>> statements);
|
static void print(vector<shared_ptr<Statement>> statements);
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
#include "Expression.h"
|
#include "Expression.h"
|
||||||
|
|
||||||
Expression::Expression(ExpressionKind kind, ValueType valueType):
|
Expression::Expression(ExpressionKind kind, shared_ptr<ValueType> valueType):
|
||||||
kind(kind), valueType(valueType) {
|
kind(kind), valueType(valueType) { }
|
||||||
}
|
|
||||||
|
|
||||||
ExpressionKind Expression::getKind() {
|
ExpressionKind Expression::getKind() {
|
||||||
return kind;
|
return kind;
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueType Expression::getValueType() {
|
shared_ptr<ValueType> Expression::getValueType() {
|
||||||
return valueType;
|
return valueType;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "Lexer/Token.h"
|
class Token;
|
||||||
#include "Types.h"
|
class ValueType;
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@@ -23,13 +23,13 @@ private:
|
|||||||
ExpressionKind kind;
|
ExpressionKind kind;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ValueType valueType;
|
shared_ptr<ValueType> valueType;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Expression(ExpressionKind kind, ValueType valueType);
|
Expression(ExpressionKind kind, shared_ptr<ValueType> valueType);
|
||||||
virtual ~Expression() { }
|
virtual ~Expression() { }
|
||||||
ExpressionKind getKind();
|
ExpressionKind getKind();
|
||||||
ValueType getValueType();
|
shared_ptr<ValueType> getValueType();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
#include "ExpressionBinary.h"
|
#include "ExpressionBinary.h"
|
||||||
|
|
||||||
|
#include "Lexer/Token.h"
|
||||||
|
#include "Parser/ValueType.h"
|
||||||
|
|
||||||
ExpressionBinary::ExpressionBinary(shared_ptr<Token> token, shared_ptr<Expression> left, shared_ptr<Expression> right):
|
ExpressionBinary::ExpressionBinary(shared_ptr<Token> token, shared_ptr<Expression> left, shared_ptr<Expression> right):
|
||||||
Expression(ExpressionKind::BINARY, ValueType::NONE), operation(ExpressionBinaryOperation::INVALID), left(left), right(right) {
|
Expression(ExpressionKind::BINARY, nullptr), operation(ExpressionBinaryOperation::INVALID), left(left), right(right) {
|
||||||
switch (token->getKind()) {
|
switch (token->getKind()) {
|
||||||
case TokenKind::EQUAL:
|
case TokenKind::EQUAL:
|
||||||
operation = ExpressionBinaryOperation::EQUAL;
|
operation = ExpressionBinaryOperation::EQUAL;
|
||||||
@@ -56,7 +59,7 @@ Expression(ExpressionKind::BINARY, ValueType::NONE), operation(ExpressionBinaryO
|
|||||||
valueType = ValueType::NONE;
|
valueType = ValueType::NONE;
|
||||||
|
|
||||||
// Booleans can only do = or !=
|
// Booleans can only do = or !=
|
||||||
if (valueType == ValueType::BOOL && (token->getKind() != TokenKind::EQUAL || token->getKind() != TokenKind::NOT_EQUAL))
|
if (valueType->getKind() == ValueTypeKind::BOOL && (token->getKind() != TokenKind::EQUAL || token->getKind() != TokenKind::NOT_EQUAL))
|
||||||
valueType = ValueType::NONE;
|
valueType = ValueType::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "Parser/Statement/StatementBlock.h"
|
#include "Parser/Statement/StatementBlock.h"
|
||||||
|
|
||||||
ExpressionBlock::ExpressionBlock(vector<shared_ptr<Statement>> statements):
|
ExpressionBlock::ExpressionBlock(vector<shared_ptr<Statement>> statements):
|
||||||
Expression(ExpressionKind::BLOCK, ValueType::NONE) {
|
Expression(ExpressionKind::BLOCK, nullptr) {
|
||||||
if (!statements.empty() && statements.back()->getKind() == StatementKind::EXPRESSION) {
|
if (!statements.empty() && statements.back()->getKind() == StatementKind::EXPRESSION) {
|
||||||
resultStatementExpression = dynamic_pointer_cast<StatementExpression>(statements.back());
|
resultStatementExpression = dynamic_pointer_cast<StatementExpression>(statements.back());
|
||||||
valueType = resultStatementExpression->getExpression()->getValueType();
|
valueType = resultStatementExpression->getExpression()->getValueType();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "ExpressionCall.h"
|
#include "ExpressionCall.h"
|
||||||
|
|
||||||
ExpressionCall::ExpressionCall(string name, vector<shared_ptr<Expression>> argumentExpressions):
|
ExpressionCall::ExpressionCall(string name, vector<shared_ptr<Expression>> argumentExpressions):
|
||||||
Expression(ExpressionKind::CALL, ValueType::NONE), name(name), argumentExpressions(argumentExpressions) { }
|
Expression(ExpressionKind::CALL, nullptr), name(name), argumentExpressions(argumentExpressions) { }
|
||||||
|
|
||||||
string ExpressionCall::getName() {
|
string ExpressionCall::getName() {
|
||||||
return name;
|
return name;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include "Parser/Expression/ExpressionBlock.h"
|
#include "Parser/Expression/ExpressionBlock.h"
|
||||||
|
|
||||||
ExpressionIfElse::ExpressionIfElse(shared_ptr<Expression> condition, shared_ptr<ExpressionBlock> thenBlock, shared_ptr<ExpressionBlock> elseBlock):
|
ExpressionIfElse::ExpressionIfElse(shared_ptr<Expression> condition, shared_ptr<ExpressionBlock> thenBlock, shared_ptr<ExpressionBlock> elseBlock):
|
||||||
Expression(ExpressionKind::IF_ELSE, ValueType::NONE), condition(condition), thenBlock(thenBlock), elseBlock(elseBlock) {
|
Expression(ExpressionKind::IF_ELSE, nullptr), condition(condition), thenBlock(thenBlock), elseBlock(elseBlock) {
|
||||||
// Figure out resulting type
|
// Figure out resulting type
|
||||||
if (elseBlock == nullptr || thenBlock->getValueType() == elseBlock->getValueType())
|
if (elseBlock == nullptr || thenBlock->getValueType() == elseBlock->getValueType())
|
||||||
valueType = thenBlock->getValueType();
|
valueType = thenBlock->getValueType();
|
||||||
|
|||||||
@@ -1,27 +1,30 @@
|
|||||||
#include "ExpressionLiteral.h"
|
#include "ExpressionLiteral.h"
|
||||||
|
|
||||||
|
#include "Lexer/Token.h"
|
||||||
|
#include "Parser/ValueType.h"
|
||||||
|
|
||||||
ExpressionLiteral::ExpressionLiteral():
|
ExpressionLiteral::ExpressionLiteral():
|
||||||
Expression(ExpressionKind::LITERAL, ValueType::NONE) { }
|
Expression(ExpressionKind::LITERAL, nullptr) { }
|
||||||
|
|
||||||
ExpressionLiteral::ExpressionLiteral(shared_ptr<Token> token):
|
ExpressionLiteral::ExpressionLiteral(shared_ptr<Token> token):
|
||||||
Expression(ExpressionKind::LITERAL, ValueType::NONE) {
|
Expression(ExpressionKind::LITERAL, nullptr) {
|
||||||
switch (token->getKind()) {
|
switch (token->getKind()) {
|
||||||
case TokenKind::BOOL:
|
case TokenKind::BOOL:
|
||||||
boolValue = token->getLexme().compare("true") == 0;
|
boolValue = token->getLexme().compare("true") == 0;
|
||||||
valueType = ValueType::BOOL;
|
valueType = ValueType::valueTypeForToken(token);
|
||||||
break;
|
break;
|
||||||
case TokenKind::INTEGER_DEC: {
|
case TokenKind::INTEGER_DEC: {
|
||||||
string numString = token->getLexme();
|
string numString = token->getLexme();
|
||||||
erase(numString, '_');
|
erase(numString, '_');
|
||||||
sint32Value = stoi(numString, nullptr, 10);
|
sint32Value = stoi(numString, nullptr, 10);
|
||||||
valueType = ValueType::SINT32;
|
valueType = ValueType::valueTypeForToken(token);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TokenKind::INTEGER_HEX: {
|
case TokenKind::INTEGER_HEX: {
|
||||||
string numString = token->getLexme();
|
string numString = token->getLexme();
|
||||||
erase(numString, '_');
|
erase(numString, '_');
|
||||||
sint32Value = stoi(numString, nullptr, 16);
|
sint32Value = stoi(numString, nullptr, 16);
|
||||||
valueType = ValueType::SINT32;
|
valueType = ValueType::valueTypeForToken(token);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TokenKind::INTEGER_BIN: {
|
case TokenKind::INTEGER_BIN: {
|
||||||
@@ -29,13 +32,13 @@ Expression(ExpressionKind::LITERAL, ValueType::NONE) {
|
|||||||
erase(numString, '_');
|
erase(numString, '_');
|
||||||
numString = numString.substr(2, numString.size()-1);
|
numString = numString.substr(2, numString.size()-1);
|
||||||
sint32Value = stoi(numString, nullptr, 2);
|
sint32Value = stoi(numString, nullptr, 2);
|
||||||
valueType = ValueType::SINT32;
|
valueType = ValueType::valueTypeForToken(token);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TokenKind::INTEGER_CHAR: {
|
case TokenKind::INTEGER_CHAR: {
|
||||||
string charString = token->getLexme();
|
string charString = token->getLexme();
|
||||||
|
|
||||||
valueType = ValueType::SINT32;
|
valueType = ValueType::valueTypeForToken(token);
|
||||||
if (charString.length() == 3) {
|
if (charString.length() == 3) {
|
||||||
sint32Value = charString[1];
|
sint32Value = charString[1];
|
||||||
} else if (charString.length() == 4 && charString[1] == '\\') {
|
} else if (charString.length() == 4 && charString[1] == '\\') {
|
||||||
@@ -64,7 +67,7 @@ Expression(ExpressionKind::LITERAL, ValueType::NONE) {
|
|||||||
}
|
}
|
||||||
case TokenKind::REAL:
|
case TokenKind::REAL:
|
||||||
real32Value = stof(token->getLexme());
|
real32Value = stof(token->getLexme());
|
||||||
valueType = ValueType::REAL32;
|
valueType = ValueType::valueTypeForToken(token);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ private:
|
|||||||
bool boolValue;
|
bool boolValue;
|
||||||
int32_t sint32Value;
|
int32_t sint32Value;
|
||||||
float real32Value;
|
float real32Value;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ExpressionLiteral(shared_ptr<Token> token);
|
ExpressionLiteral(shared_ptr<Token> token);
|
||||||
ExpressionLiteral();
|
ExpressionLiteral();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "ExpressionVariable.h"
|
#include "ExpressionVariable.h"
|
||||||
|
|
||||||
ExpressionVariable::ExpressionVariable(string name):
|
ExpressionVariable::ExpressionVariable(string name):
|
||||||
Expression(ExpressionKind::VAR, ValueType::NONE), name(name) { }
|
Expression(ExpressionKind::VAR, nullptr), name(name) { }
|
||||||
|
|
||||||
string ExpressionVariable::getName() {
|
string ExpressionVariable::getName() {
|
||||||
return name;
|
return name;
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
#include "Error.h"
|
#include "Error.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
|
|
||||||
|
#include "Lexer/Token.h"
|
||||||
|
#include "Parser/ValueType.h"
|
||||||
|
|
||||||
#include "Parser/Expression/ExpressionGrouping.h"
|
#include "Parser/Expression/ExpressionGrouping.h"
|
||||||
#include "Parser/Expression/ExpressionLiteral.h"
|
#include "Parser/Expression/ExpressionLiteral.h"
|
||||||
#include "Parser/Expression/ExpressionVariable.h"
|
#include "Parser/Expression/ExpressionVariable.h"
|
||||||
@@ -20,8 +23,8 @@
|
|||||||
#include "Parser/Statement/StatementBlock.h"
|
#include "Parser/Statement/StatementBlock.h"
|
||||||
#include "Parser/Statement/StatementRepeat.h"
|
#include "Parser/Statement/StatementRepeat.h"
|
||||||
|
|
||||||
Parser::Parser(vector<shared_ptr<Token>> tokens): tokens(tokens) {
|
Parser::Parser(vector<shared_ptr<Token>> tokens) :
|
||||||
}
|
tokens(tokens) { }
|
||||||
|
|
||||||
vector<shared_ptr<Statement>> Parser::getStatements() {
|
vector<shared_ptr<Statement>> Parser::getStatements() {
|
||||||
vector<shared_ptr<Statement>> statements;
|
vector<shared_ptr<Statement>> statements;
|
||||||
@@ -102,8 +105,8 @@ shared_ptr<Statement> Parser::matchStatementMetaExternFunction() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
string name;
|
string name;
|
||||||
vector<pair<string, ValueType>> arguments;
|
vector<pair<string, shared_ptr<ValueType>>> arguments;
|
||||||
ValueType returnType = ValueType::NONE;
|
shared_ptr<ValueType> returnType = ValueType::NONE;
|
||||||
|
|
||||||
currentIndex++; // skip meta
|
currentIndex++; // skip meta
|
||||||
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
|
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
|
||||||
@@ -118,14 +121,14 @@ shared_ptr<Statement> Parser::matchStatementMetaExternFunction() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
|
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
|
||||||
shared_ptr<Token> typeToken = tokens.at(currentIndex++);
|
shared_ptr<Token> argumentTypeToken = tokens.at(currentIndex++);
|
||||||
optional<ValueType> argumentType = valueTypeForToken(typeToken);
|
shared_ptr<ValueType> argumentType = ValueType::valueTypeForToken(argumentTypeToken);
|
||||||
if (!argumentType) {
|
if (argumentType == nullptr) {
|
||||||
markError(TokenKind::TYPE, {});
|
markError(TokenKind::TYPE, {});
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
arguments.push_back(pair<string, ValueType>(identifierToken->getLexme(), *argumentType));
|
arguments.push_back(pair<string, shared_ptr<ValueType>>(identifierToken->getLexme(), argumentType));
|
||||||
} while (tryMatchingTokenKinds({TokenKind::COMMA}, true, true));
|
} while (tryMatchingTokenKinds({TokenKind::COMMA}, true, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,13 +136,12 @@ shared_ptr<Statement> Parser::matchStatementMetaExternFunction() {
|
|||||||
if (tryMatchingTokenKinds({TokenKind::RIGHT_ARROW}, true, true)) {
|
if (tryMatchingTokenKinds({TokenKind::RIGHT_ARROW}, true, true)) {
|
||||||
tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // skip new line
|
tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // skip new line
|
||||||
|
|
||||||
shared_ptr<Token> typeToken = tokens.at(currentIndex);
|
shared_ptr<Token> returnTypeToken = tokens.at(currentIndex);
|
||||||
optional<ValueType> type = valueTypeForToken(typeToken);
|
returnType = ValueType::valueTypeForToken(returnTypeToken);
|
||||||
if (!type) {
|
if (returnType == nullptr) {
|
||||||
markError(TokenKind::TYPE, {});
|
markError(TokenKind::TYPE, {});
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
returnType = *type;
|
|
||||||
|
|
||||||
currentIndex++; // type
|
currentIndex++; // type
|
||||||
}
|
}
|
||||||
@@ -154,7 +156,7 @@ shared_ptr<Statement> Parser::matchStatementVariable() {
|
|||||||
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
|
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
|
||||||
shared_ptr<Token> valueTypeToken = tokens.at(currentIndex);
|
shared_ptr<Token> valueTypeToken = tokens.at(currentIndex);
|
||||||
|
|
||||||
ValueType valueType;
|
shared_ptr<ValueType> valueType;
|
||||||
if (valueTypeToken->getLexme().compare("bool") == 0)
|
if (valueTypeToken->getLexme().compare("bool") == 0)
|
||||||
valueType = ValueType::BOOL;
|
valueType = ValueType::BOOL;
|
||||||
else if (valueTypeToken->getLexme().compare("sint32") == 0)
|
else if (valueTypeToken->getLexme().compare("sint32") == 0)
|
||||||
@@ -186,8 +188,8 @@ shared_ptr<Statement> Parser::matchStatementFunction() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
string name;
|
string name;
|
||||||
vector<pair<string, ValueType>> arguments;
|
vector<pair<string, shared_ptr<ValueType>>> arguments;
|
||||||
ValueType returnType = ValueType::NONE;
|
shared_ptr<ValueType> returnType = ValueType::NONE;
|
||||||
shared_ptr<Statement> statementBlock;
|
shared_ptr<Statement> statementBlock;
|
||||||
|
|
||||||
// name
|
// name
|
||||||
@@ -203,14 +205,14 @@ shared_ptr<Statement> Parser::matchStatementFunction() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
|
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
|
||||||
shared_ptr<Token> typeToken = tokens.at(currentIndex++);
|
shared_ptr<Token> argumentTypeToken = tokens.at(currentIndex++);
|
||||||
optional<ValueType> argumentType = valueTypeForToken(typeToken);
|
shared_ptr<ValueType> argumentType = ValueType::valueTypeForToken(argumentTypeToken);
|
||||||
if (!argumentType) {
|
if (argumentType == nullptr) {
|
||||||
markError(TokenKind::TYPE, {});
|
markError(TokenKind::TYPE, {});
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
arguments.push_back(pair<string, ValueType>(identifierToken->getLexme(), *argumentType));
|
arguments.push_back(pair<string, shared_ptr<ValueType>>(identifierToken->getLexme(), argumentType));
|
||||||
} while (tryMatchingTokenKinds({TokenKind::COMMA}, true, true));
|
} while (tryMatchingTokenKinds({TokenKind::COMMA}, true, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,13 +220,12 @@ shared_ptr<Statement> Parser::matchStatementFunction() {
|
|||||||
if (tryMatchingTokenKinds({TokenKind::RIGHT_ARROW}, true, true)) {
|
if (tryMatchingTokenKinds({TokenKind::RIGHT_ARROW}, true, true)) {
|
||||||
tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // skip new line
|
tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // skip new line
|
||||||
|
|
||||||
shared_ptr<Token> typeToken = tokens.at(currentIndex);
|
shared_ptr<Token> returnTypeToken = tokens.at(currentIndex);
|
||||||
optional<ValueType> type = valueTypeForToken(typeToken);
|
returnType = ValueType::valueTypeForToken(returnTypeToken);
|
||||||
if (!type) {
|
if (returnType == nullptr) {
|
||||||
markError(TokenKind::TYPE, {});
|
markError(TokenKind::TYPE, {});
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
returnType = *type;
|
|
||||||
|
|
||||||
currentIndex++; // type
|
currentIndex++; // type
|
||||||
}
|
}
|
||||||
@@ -639,20 +640,6 @@ bool Parser::tryMatchingTokenKinds(vector<TokenKind> kinds, bool shouldMatchAll,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<ValueType> Parser::valueTypeForToken(shared_ptr<Token> token) {
|
|
||||||
if (token->getKind() != TokenKind::TYPE)
|
|
||||||
return {};
|
|
||||||
|
|
||||||
if (token->getLexme().compare("bool") == 0)
|
|
||||||
return ValueType::BOOL;
|
|
||||||
else if (token->getLexme().compare("sint32") == 0)
|
|
||||||
return ValueType::SINT32;
|
|
||||||
else if (token->getLexme().compare("real32") == 0)
|
|
||||||
return ValueType::REAL32;
|
|
||||||
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
void Parser::markError(optional<TokenKind> expectedTokenKind, optional<string> message) {
|
void Parser::markError(optional<TokenKind> expectedTokenKind, optional<string> message) {
|
||||||
shared_ptr<Token> actualToken = tokens.at(currentIndex);
|
shared_ptr<Token> actualToken = tokens.at(currentIndex);
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
#define PARSER_H
|
#define PARSER_H
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "Types.h"
|
|
||||||
|
|
||||||
class Token;
|
class Token;
|
||||||
enum class TokenKind;
|
enum class TokenKind;
|
||||||
@@ -48,7 +47,6 @@ private:
|
|||||||
shared_ptr<Expression> matchExpressionBlock(vector<TokenKind> terminalTokenKinds);
|
shared_ptr<Expression> matchExpressionBlock(vector<TokenKind> terminalTokenKinds);
|
||||||
|
|
||||||
bool tryMatchingTokenKinds(vector<TokenKind> kinds, bool shouldMatchAll, bool shouldAdvance);
|
bool tryMatchingTokenKinds(vector<TokenKind> kinds, bool shouldMatchAll, bool shouldAdvance);
|
||||||
optional<ValueType> valueTypeForToken(shared_ptr<Token> token);
|
|
||||||
|
|
||||||
void markError(optional<TokenKind> expectedTokenKind, optional<string> message);
|
void markError(optional<TokenKind> expectedTokenKind, optional<string> message);
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "Types.h"
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
enum class StatementKind {
|
enum class StatementKind {
|
||||||
|
|||||||
@@ -3,20 +3,7 @@
|
|||||||
#include "Parser/Statement/StatementBlock.h"
|
#include "Parser/Statement/StatementBlock.h"
|
||||||
#include "Parser/Statement/StatementReturn.h"
|
#include "Parser/Statement/StatementReturn.h"
|
||||||
|
|
||||||
static string valueTypeToString(ValueType valueType) {
|
StatementFunction::StatementFunction(string name, vector<pair<string, shared_ptr<ValueType>>> arguments, shared_ptr<ValueType> returnValueType, shared_ptr<StatementBlock> statementBlock):
|
||||||
switch (valueType) {
|
|
||||||
case ValueType::NONE:
|
|
||||||
return "NONE";
|
|
||||||
case ValueType::BOOL:
|
|
||||||
return "BOOL";
|
|
||||||
case ValueType::SINT32:
|
|
||||||
return "SINT32";
|
|
||||||
case ValueType::REAL32:
|
|
||||||
return "REAL32";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StatementFunction::StatementFunction(string name, vector<pair<string, ValueType>> arguments, ValueType returnValueType, shared_ptr<StatementBlock> statementBlock):
|
|
||||||
Statement(StatementKind::FUNCTION), name(name), arguments(arguments), returnValueType(returnValueType), statementBlock(statementBlock) {
|
Statement(StatementKind::FUNCTION), name(name), arguments(arguments), returnValueType(returnValueType), statementBlock(statementBlock) {
|
||||||
vector<shared_ptr<Statement>> statements = statementBlock->getStatements();
|
vector<shared_ptr<Statement>> statements = statementBlock->getStatements();
|
||||||
if (!statements.empty() && statements.back()->getKind() == StatementKind::RETURN)
|
if (!statements.empty() && statements.back()->getKind() == StatementKind::RETURN)
|
||||||
@@ -32,11 +19,11 @@ string StatementFunction::getName() {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<pair<string, ValueType>> StatementFunction::getArguments() {
|
vector<pair<string, shared_ptr<ValueType>>> StatementFunction::getArguments() {
|
||||||
return arguments;
|
return arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueType StatementFunction::getReturnValueType() {
|
shared_ptr<ValueType> StatementFunction::getReturnValueType() {
|
||||||
return returnValueType;
|
return returnValueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
#include "Parser/Statement/Statement.h"
|
#include "Parser/Statement/Statement.h"
|
||||||
|
|
||||||
class StatementBlock;
|
class StatementBlock;
|
||||||
|
class ValueType;
|
||||||
|
|
||||||
class StatementFunction: public Statement {
|
class StatementFunction: public Statement {
|
||||||
private:
|
private:
|
||||||
string name;
|
string name;
|
||||||
vector<pair<string, ValueType>> arguments;
|
vector<pair<string, shared_ptr<ValueType>>> arguments;
|
||||||
ValueType returnValueType;
|
shared_ptr<ValueType> returnValueType;
|
||||||
shared_ptr<StatementBlock> statementBlock;
|
shared_ptr<StatementBlock> statementBlock;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StatementFunction(string name, vector<pair<string, ValueType>> arguments, ValueType returnValueType, shared_ptr<StatementBlock> statementBlock);
|
StatementFunction(string name, vector<pair<string, shared_ptr<ValueType>>> arguments, shared_ptr<ValueType> returnValueType, shared_ptr<StatementBlock> statementBlock);
|
||||||
string getName();
|
string getName();
|
||||||
vector<pair<string, ValueType>> getArguments();
|
vector<pair<string, shared_ptr<ValueType>>> getArguments();
|
||||||
ValueType getReturnValueType();
|
shared_ptr<ValueType> getReturnValueType();
|
||||||
shared_ptr<StatementBlock> getStatementBlock();
|
shared_ptr<StatementBlock> getStatementBlock();
|
||||||
};
|
};
|
||||||
@@ -1,29 +1,16 @@
|
|||||||
#include "Parser/Statement/StatementMetaExternFunction.h"
|
#include "Parser/Statement/StatementMetaExternFunction.h"
|
||||||
|
|
||||||
static string valueTypeToString(ValueType valueType) {
|
StatementMetaExternFunction::StatementMetaExternFunction(string name, vector<pair<string, shared_ptr<ValueType>>> arguments, shared_ptr<ValueType> returnValueType):
|
||||||
switch (valueType) {
|
|
||||||
case ValueType::NONE:
|
|
||||||
return "NONE";
|
|
||||||
case ValueType::BOOL:
|
|
||||||
return "BOOL";
|
|
||||||
case ValueType::SINT32:
|
|
||||||
return "SINT32";
|
|
||||||
case ValueType::REAL32:
|
|
||||||
return "REAL32";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StatementMetaExternFunction::StatementMetaExternFunction(string name, vector<pair<string, ValueType>> arguments, ValueType returnValueType):
|
|
||||||
Statement(StatementKind::META_EXTERN_FUNCTION), name(name), arguments(arguments), returnValueType(returnValueType) { }
|
Statement(StatementKind::META_EXTERN_FUNCTION), name(name), arguments(arguments), returnValueType(returnValueType) { }
|
||||||
|
|
||||||
string StatementMetaExternFunction::getName() {
|
string StatementMetaExternFunction::getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<pair<string, ValueType>> StatementMetaExternFunction::getArguments() {
|
vector<pair<string, shared_ptr<ValueType>>> StatementMetaExternFunction::getArguments() {
|
||||||
return arguments;
|
return arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueType StatementMetaExternFunction::getReturnValueType() {
|
shared_ptr<ValueType> StatementMetaExternFunction::getReturnValueType() {
|
||||||
return returnValueType;
|
return returnValueType;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
#include "Parser/Statement/Statement.h"
|
#include "Parser/Statement/Statement.h"
|
||||||
|
|
||||||
|
class ValueType;
|
||||||
|
|
||||||
class StatementMetaExternFunction: public Statement {
|
class StatementMetaExternFunction: public Statement {
|
||||||
private:
|
private:
|
||||||
string name;
|
string name;
|
||||||
vector<pair<string, ValueType>> arguments;
|
vector<pair<string, shared_ptr<ValueType>>> arguments;
|
||||||
ValueType returnValueType;
|
shared_ptr<ValueType> returnValueType;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StatementMetaExternFunction(string name, vector<pair<string, ValueType>> arguments, ValueType returnValueType);
|
StatementMetaExternFunction(string name, vector<pair<string, shared_ptr<ValueType>>> arguments, shared_ptr<ValueType> returnValueType);
|
||||||
string getName();
|
string getName();
|
||||||
vector<pair<string, ValueType>> getArguments();
|
vector<pair<string, shared_ptr<ValueType>>> getArguments();
|
||||||
ValueType getReturnValueType();
|
shared_ptr<ValueType> getReturnValueType();
|
||||||
};
|
};
|
||||||
@@ -2,27 +2,14 @@
|
|||||||
|
|
||||||
#include "Parser/Expression/Expression.h"
|
#include "Parser/Expression/Expression.h"
|
||||||
|
|
||||||
static string valueTypeToString(ValueType valueType) {
|
StatementVariable::StatementVariable(string name, shared_ptr<ValueType> valueType, shared_ptr<Expression> expression):
|
||||||
switch (valueType) {
|
|
||||||
case ValueType::NONE:
|
|
||||||
return "NONE";
|
|
||||||
case ValueType::BOOL:
|
|
||||||
return "BOOL";
|
|
||||||
case ValueType::SINT32:
|
|
||||||
return "SINT32";
|
|
||||||
case ValueType::REAL32:
|
|
||||||
return "REAL32";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StatementVariable::StatementVariable(string name, ValueType valueType, shared_ptr<Expression> expression):
|
|
||||||
Statement(StatementKind::VARIABLE), name(name), valueType(valueType), expression(expression) { }
|
Statement(StatementKind::VARIABLE), name(name), valueType(valueType), expression(expression) { }
|
||||||
|
|
||||||
string StatementVariable::getName() {
|
string StatementVariable::getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueType StatementVariable::getValueType() {
|
shared_ptr<ValueType> StatementVariable::getValueType() {
|
||||||
return valueType;
|
return valueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
#include "Parser/Statement/Statement.h"
|
#include "Parser/Statement/Statement.h"
|
||||||
|
|
||||||
class Expression;
|
class Expression;
|
||||||
|
class ValueType;
|
||||||
|
|
||||||
class StatementVariable: public Statement {
|
class StatementVariable: public Statement {
|
||||||
private:
|
private:
|
||||||
string name;
|
string name;
|
||||||
ValueType valueType;
|
shared_ptr<ValueType> valueType;
|
||||||
shared_ptr<Expression> expression;
|
shared_ptr<Expression> expression;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StatementVariable(string name, ValueType valueType, shared_ptr<Expression> expression);
|
StatementVariable(string name, shared_ptr<ValueType> valueType, shared_ptr<Expression> expression);
|
||||||
string getName();
|
string getName();
|
||||||
ValueType getValueType();
|
shared_ptr<ValueType> getValueType();
|
||||||
shared_ptr<Expression> getExpression();
|
shared_ptr<Expression> getExpression();
|
||||||
};
|
};
|
||||||
42
src/Parser/ValueType.cpp
Normal file
42
src/Parser/ValueType.cpp
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#include "ValueType.h"
|
||||||
|
|
||||||
|
#include "Lexer/Token.h"
|
||||||
|
|
||||||
|
shared_ptr<ValueType> ValueType::NONE = make_shared<ValueType>(ValueTypeKind::NONE);
|
||||||
|
shared_ptr<ValueType> ValueType::BOOL = make_shared<ValueType>(ValueTypeKind::BOOL);
|
||||||
|
shared_ptr<ValueType> ValueType::SINT32 = make_shared<ValueType>(ValueTypeKind::SINT32);
|
||||||
|
shared_ptr<ValueType> ValueType::REAL32 = make_shared<ValueType>(ValueTypeKind::REAL32);
|
||||||
|
|
||||||
|
ValueType::ValueType(ValueTypeKind kind):
|
||||||
|
kind(kind) { }
|
||||||
|
|
||||||
|
shared_ptr<ValueType> ValueType::valueTypeForToken(shared_ptr<Token> token) {
|
||||||
|
switch (token->getKind()) {
|
||||||
|
case TokenKind::TYPE: {
|
||||||
|
string lexme = token->getLexme();
|
||||||
|
if (lexme.compare("bool") == 0)
|
||||||
|
return make_shared<ValueType>(ValueTypeKind::BOOL);
|
||||||
|
else if (lexme.compare("sint32") == 0)
|
||||||
|
return make_shared<ValueType>(ValueTypeKind::SINT32);
|
||||||
|
else if (lexme.compare("real32") == 0)
|
||||||
|
return make_shared<ValueType>(ValueTypeKind::REAL32);
|
||||||
|
else
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
case TokenKind::BOOL:
|
||||||
|
return make_shared<ValueType>(ValueTypeKind::BOOL);
|
||||||
|
case TokenKind::INTEGER_DEC:
|
||||||
|
case TokenKind::INTEGER_HEX:
|
||||||
|
case TokenKind::INTEGER_BIN:
|
||||||
|
case TokenKind::INTEGER_CHAR:
|
||||||
|
return make_shared<ValueType>(ValueTypeKind::SINT32);
|
||||||
|
case TokenKind::REAL:
|
||||||
|
return make_shared<ValueType>(ValueTypeKind::REAL32);
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueTypeKind ValueType::getKind() {
|
||||||
|
return kind;
|
||||||
|
}
|
||||||
32
src/Parser/ValueType.h
Normal file
32
src/Parser/ValueType.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#ifndef VALUE_TYPE_H
|
||||||
|
#define VALUE_TYPE_H
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
class Token;
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
enum class ValueTypeKind {
|
||||||
|
NONE,
|
||||||
|
BOOL,
|
||||||
|
SINT32,
|
||||||
|
REAL32
|
||||||
|
};
|
||||||
|
|
||||||
|
class ValueType {
|
||||||
|
private:
|
||||||
|
ValueTypeKind kind;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static shared_ptr<ValueType> NONE;
|
||||||
|
static shared_ptr<ValueType> BOOL;
|
||||||
|
static shared_ptr<ValueType> SINT32;
|
||||||
|
static shared_ptr<ValueType> REAL32;
|
||||||
|
static shared_ptr<ValueType> valueTypeForToken(shared_ptr<Token> token);
|
||||||
|
|
||||||
|
ValueType(ValueTypeKind kind);
|
||||||
|
ValueTypeKind getKind();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
11
src/Types.h
11
src/Types.h
@@ -1,11 +0,0 @@
|
|||||||
#ifndef TYPES_H
|
|
||||||
#define TYPES_H
|
|
||||||
|
|
||||||
enum class ValueType {
|
|
||||||
NONE,
|
|
||||||
BOOL,
|
|
||||||
SINT32,
|
|
||||||
REAL32
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user