#include "ast_nodes.h" /*************************** AST NODE ********************************/ AstNode::~AstNode() = default; /*************************** NUMBER NODE ********************************/ NumberNode::NumberNode(const std::string &expression) { if (expression.size() > 2) { if (expression.substr(0, 2) == "0x") { this->value = std::stoll(expression, nullptr, 16); } else if (expression.substr(0, 2) == "0b") { this->value = std::stoll(expression, nullptr, 2); } else { this->value = std::stoll(expression, nullptr, 10); } } else { this->value = std::stoll(expression, nullptr, 10); } } /*************************** STRING NODE ********************************/ std::string StringNode::asString() { return value.substr(1, value.length() - 2); } /*************************** VALUE NODE ********************************/ long long ValueNode::asInt() { if (is(INT)) { return intValue.value(); } return 0; } std::string ValueNode::asString() { if (is(STRING)) { return stringValue.value(); } return ""; } std::string ValueNode::asIdentifier() { if (is(IDENTIFIER) || is(WIRE)) { return identifierValue.value(); } return ""; } bool ValueNode::asBool() { if (is(BOOL)) { return boolValue.value(); } return false; } bool ValueNode::is(ValueNode::ValueType valueType) { return type.value == valueType; } ValueNode ValueNode::ofBool(bool _value) { ValueNode value; value.type = EnumNode(BOOL); value.boolValue = std::optional(_value); return value; } ValueNode ValueNode::ofInt(long long int _value) { ValueNode value; value.type = EnumNode(INT); value.intValue = std::optional(_value); return value; } ValueNode ValueNode::ofString(std::string _value) { ValueNode value; value.type = EnumNode(STRING); value.stringValue = std::optional(_value); return value; } ValueNode ValueNode::ofIdentifier(std::string _value) { ValueNode value; value.type = EnumNode(IDENTIFIER); value.identifierValue = std::optional(_value); return value; } ValueNode ValueNode::ofNull() { ValueNode value; value.type = EnumNode(NIL); return value; } ValueNode ValueNode::ofWire(std::optional _value) { ValueNode value; value.type = EnumNode(WIRE); value.identifierValue = _value; return value; } ValueNode ValueNode::ofMemory(std::optional _value) { ValueNode value; value.type = EnumNode(MEMORY); value.identifierValue = _value; return value; }