#ifndef PCC_LITERALNODE_H #define PCC_LITERALNODE_H #include #include "BaseNode.hh" #include "ExprNode.hh" namespace pcc { template class LiteralNode : public ExprNode { public: LiteralNode(Context* context, std::shared_ptr type, T value); virtual Value CodeGen() override; virtual int Travel(Traveler& traveler) override; private: T value_; }; // the implementation of member functions of template classes must be put in // header, but we put type-specific CodeGen() in the .cc file. template LiteralNode::LiteralNode(Context* context, std::shared_ptr type, T value) : ExprNode(context) , value_(value) { type_ = type; } using BooleanLiteralNode = LiteralNode; using CharLiteralNode = LiteralNode; using IntegerLiteralNode = LiteralNode; using RealLiteralNode = LiteralNode; class StringLiteralNode : public ExprNode { public: StringLiteralNode(Context* context, std::shared_ptr type, std::vector value); virtual Value CodeGen() override; virtual int Travel(Traveler& traveler) override; private: std::vector value_; }; } // namespace pcc #endif