Add string type

This commit is contained in:
2025-01-03 22:18:35 +01:00
parent 660c774327
commit a7b0c53d23
11 changed files with 202 additions and 76 deletions

View File

@ -31,6 +31,7 @@ namespace gcc
void visit(source::number_literal<double> *literal) override;
void visit(source::number_literal<bool> *boolean) override;
void visit(source::char_literal *character) override;
void visit(source::string_literal *string) override;
void visit(source::binary_expression *expression) override;
void visit(source::constant_definition *definition) override;
void visit(source::declaration *declaration) override;

View File

@ -7,12 +7,21 @@
enum elna_tree_index
{
ELNA_TI_CHAR_TYPE,
ELNA_TI_MAX
ELNA_TI_CHAR_TYPE,
ELNA_TI_STRING_TYPE,
ELNA_TI_MAX
};
extern GTY(()) tree elna_global_trees[ELNA_TI_MAX];
#define elna_char_type_node elna_global_trees[ELNA_TI_CHAR_TYPE]
#define elna_string_type_node elna_global_trees[ELNA_TI_STRING_TYPE]
void elna_init_ttree(void);
namespace elna
{
namespace gcc
{
void init_ttree();
bool is_string_type(tree type);
}
}

View File

@ -5,6 +5,8 @@
#include <cstdint>
#include <memory>
#include <string>
#include <vector>
#include "elna/source/result.h"
#include "elna/source/types.h"
@ -49,6 +51,7 @@ namespace source
template<typename T>
class number_literal;
class char_literal;
class string_literal;
/**
* Interface for AST visitors.
@ -73,6 +76,7 @@ namespace source
virtual void visit(number_literal<double> *) = 0;
virtual void visit(number_literal<bool> *) = 0;
virtual void visit(char_literal *) = 0;
virtual void visit(string_literal *) = 0;
};
/**
@ -80,7 +84,7 @@ namespace source
*/
struct empty_visitor : parser_visitor
{
virtual void visit(declaration *declaration) override;
virtual void visit(declaration *) override;
virtual void visit(constant_definition *definition) override;
virtual void visit(procedure_definition *definition) override;
virtual void visit(call_statement *statement) override;
@ -92,12 +96,13 @@ namespace source
virtual void visit(program *program) override;
virtual void visit(binary_expression *expression) override;
virtual void visit(unary_expression *expression) override;
virtual void visit(type_expression *variable) override;
virtual void visit(variable_expression *variable) override;
virtual void visit(number_literal<std::int32_t> *number) override;
virtual void visit(number_literal<double> *number) override;
virtual void visit(number_literal<bool> *boolean) override;
virtual void visit(char_literal *character) override;
virtual void visit(type_expression *) override;
virtual void visit(variable_expression *) override;
virtual void visit(number_literal<std::int32_t> *) override;
virtual void visit(number_literal<double> *) override;
virtual void visit(number_literal<bool> *) override;
virtual void visit(char_literal *) override;
virtual void visit(string_literal *) override;
};
/**
@ -408,9 +413,9 @@ namespace source
class block : public node
{
std::unique_ptr<statement> m_body;
std::vector<std::unique_ptr<definition>> m_definitions;
std::vector<std::unique_ptr<declaration>> m_declarations;
std::unique_ptr<statement> m_body;
public:
block(const struct position position, std::vector<std::unique_ptr<definition>>&& definitions,
@ -465,6 +470,17 @@ namespace source
unsigned char character() const noexcept;
};
class string_literal : public expression
{
std::string m_string;
public:
string_literal(const struct position position, const std::string& value);
virtual void accept(parser_visitor *visitor) override;
const std::string& string() const noexcept;
};
class variable_expression : public expression
{
std::string m_name;