Add lexer and parser sources
This commit is contained in:
@ -54,9 +54,9 @@ namespace elna::boot
|
||||
};
|
||||
|
||||
class variable_declaration;
|
||||
class constant_definition;
|
||||
class procedure_definition;
|
||||
class type_definition;
|
||||
class constant_declaration;
|
||||
class procedure_declaration;
|
||||
class type_declaration;
|
||||
class procedure_call;
|
||||
class cast_expression;
|
||||
class assign_statement;
|
||||
@ -93,9 +93,9 @@ namespace elna::boot
|
||||
struct parser_visitor
|
||||
{
|
||||
virtual void visit(variable_declaration *) = 0;
|
||||
virtual void visit(constant_definition *) = 0;
|
||||
virtual void visit(procedure_definition *) = 0;
|
||||
virtual void visit(type_definition *) = 0;
|
||||
virtual void visit(constant_declaration *) = 0;
|
||||
virtual void visit(procedure_declaration *) = 0;
|
||||
virtual void visit(type_declaration *) = 0;
|
||||
virtual void visit(procedure_call *) = 0;
|
||||
virtual void visit(cast_expression *) = 0;
|
||||
virtual void visit(traits_expression *) = 0;
|
||||
@ -178,10 +178,10 @@ namespace elna::boot
|
||||
/**
|
||||
* Symbol definition.
|
||||
*/
|
||||
class definition : public node
|
||||
class declaration : public node
|
||||
{
|
||||
protected:
|
||||
definition(const struct position position, identifier_definition identifier);
|
||||
declaration(const struct position position, identifier_definition identifier);
|
||||
|
||||
public:
|
||||
const identifier_definition identifier;
|
||||
@ -292,7 +292,7 @@ namespace elna::boot
|
||||
/**
|
||||
* Variable declaration.
|
||||
*/
|
||||
class variable_declaration : public definition
|
||||
class variable_declaration : public declaration
|
||||
{
|
||||
std::shared_ptr<type_expression> m_variable_type;
|
||||
|
||||
@ -320,18 +320,18 @@ namespace elna::boot
|
||||
/**
|
||||
* Constant definition.
|
||||
*/
|
||||
class constant_definition : public definition
|
||||
class constant_declaration : public declaration
|
||||
{
|
||||
expression *m_body;
|
||||
|
||||
public:
|
||||
constant_definition(const struct position position, identifier_definition identifier,
|
||||
constant_declaration(const struct position position, identifier_definition identifier,
|
||||
expression *body);
|
||||
void accept(parser_visitor *visitor) override;
|
||||
|
||||
expression& body();
|
||||
|
||||
virtual ~constant_definition() override;
|
||||
virtual ~constant_declaration() override;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -354,7 +354,7 @@ namespace elna::boot
|
||||
|
||||
struct block
|
||||
{
|
||||
block(std::vector<constant_definition *>&& constants, std::vector<variable_declaration *>&& variables,
|
||||
block(std::vector<constant_declaration*>&& constants, std::vector<variable_declaration *>&& variables,
|
||||
std::vector<statement *>&& body);
|
||||
block(const block&) = delete;
|
||||
block(block&& that);
|
||||
@ -363,14 +363,14 @@ namespace elna::boot
|
||||
block& operator=(block&& that);
|
||||
|
||||
const std::vector<variable_declaration *>& variables();
|
||||
const std::vector<constant_definition *>& constants();
|
||||
const std::vector<constant_declaration *>& constants();
|
||||
const std::vector<statement *>& body();
|
||||
|
||||
virtual ~block();
|
||||
|
||||
private:
|
||||
std::vector<variable_declaration *> m_variables;
|
||||
std::vector<constant_definition *> m_constants;
|
||||
std::vector<constant_declaration *> m_constants;
|
||||
std::vector<statement *> m_body;
|
||||
|
||||
};
|
||||
@ -378,7 +378,7 @@ namespace elna::boot
|
||||
/**
|
||||
* Procedure definition.
|
||||
*/
|
||||
class procedure_definition : public definition
|
||||
class procedure_declaration : public declaration
|
||||
{
|
||||
procedure_type_expression *m_heading;
|
||||
|
||||
@ -386,28 +386,28 @@ namespace elna::boot
|
||||
std::optional<block> body;
|
||||
std::vector<std::string> parameter_names;
|
||||
|
||||
procedure_definition(const struct position position, identifier_definition identifier,
|
||||
procedure_declaration(const struct position position, identifier_definition identifier,
|
||||
procedure_type_expression *heading, block&& body);
|
||||
procedure_definition(const struct position position, identifier_definition identifier,
|
||||
procedure_declaration(const struct position position, identifier_definition identifier,
|
||||
procedure_type_expression *heading);
|
||||
void accept(parser_visitor *visitor) override;
|
||||
|
||||
procedure_type_expression& heading();
|
||||
|
||||
virtual ~procedure_definition() override;
|
||||
virtual ~procedure_declaration() override;
|
||||
};
|
||||
|
||||
/**
|
||||
* Type definition.
|
||||
*/
|
||||
class type_definition : public definition
|
||||
class type_declaration : public declaration
|
||||
{
|
||||
type_expression *m_body;
|
||||
|
||||
public:
|
||||
type_definition(const struct position position, identifier_definition identifier,
|
||||
type_declaration(const struct position position, identifier_definition identifier,
|
||||
type_expression *expression);
|
||||
~type_definition();
|
||||
~type_declaration();
|
||||
|
||||
void accept(parser_visitor *visitor) override;
|
||||
|
||||
@ -670,10 +670,10 @@ namespace elna::boot
|
||||
{
|
||||
public:
|
||||
std::vector<import_declaration *> imports;
|
||||
std::vector<constant_definition *> constants;
|
||||
std::vector<type_definition *> types;
|
||||
std::vector<constant_declaration *> constants;
|
||||
std::vector<type_declaration *> types;
|
||||
std::vector<variable_declaration *> variables;
|
||||
std::vector<procedure_definition *> procedures;
|
||||
std::vector<procedure_declaration *> procedures;
|
||||
|
||||
unit(const struct position position);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
@ -54,27 +54,26 @@ namespace elna::boot
|
||||
constant_info::variant current_literal;
|
||||
|
||||
std::shared_ptr<symbol_table> symbols;
|
||||
std::unordered_map<std::string, std::shared_ptr<alias_type>> unresolved;
|
||||
|
||||
procedure_type build_procedure(procedure_type_expression& type_expression);
|
||||
|
||||
public:
|
||||
std::unordered_map<std::string, std::shared_ptr<alias_type>> unresolved;
|
||||
|
||||
explicit declaration_visitor(const char *path, std::shared_ptr<symbol_table> symbols);
|
||||
|
||||
void visit(named_type_expression *type_expression) override;
|
||||
void visit(array_type_expression *type_expression) override;
|
||||
void visit(pointer_type_expression *type_expression) override;
|
||||
void visit(program *program) override;
|
||||
void visit(type_definition *definition) override;
|
||||
void visit(type_declaration *definition) override;
|
||||
void visit(record_type_expression *type_expression) override;
|
||||
void visit(union_type_expression *type_expression) override;
|
||||
void visit(procedure_type_expression *type_expression) override;
|
||||
void visit(enumeration_type_expression *type_expression) override;
|
||||
|
||||
void visit(variable_declaration *declaration) override;
|
||||
void visit(constant_definition *definition) override;
|
||||
void visit(procedure_definition *definition) override;
|
||||
void visit(constant_declaration *definition) override;
|
||||
void visit(procedure_declaration *definition) override;
|
||||
void visit(assign_statement *statement) override;
|
||||
void visit(if_statement *statement) override;
|
||||
void visit(import_declaration *) override;
|
||||
|
@ -202,10 +202,9 @@ namespace elna::boot
|
||||
class variable_info : public info
|
||||
{
|
||||
public:
|
||||
const std::string name;
|
||||
const type symbol;
|
||||
|
||||
variable_info(const std::string& name, const type symbol);
|
||||
variable_info(const type symbol);
|
||||
std::shared_ptr<variable_info> is_variable() override;
|
||||
};
|
||||
|
||||
|
@ -33,9 +33,8 @@ along with GCC; see the file COPYING3. If not see
|
||||
|
||||
namespace elna::gcc
|
||||
{
|
||||
std::deque<std::unique_ptr<boot::error>> do_semantic_analysis(const char *path,
|
||||
const std::unique_ptr<boot::program>& ast, std::shared_ptr<boot::symbol_table> info_table,
|
||||
std::shared_ptr<symbol_table> symbols, std::unordered_map<std::string, tree>& unresolved);
|
||||
std::unordered_map<std::string, tree> do_semantic_analysis(std::shared_ptr<boot::symbol_table> info_table,
|
||||
std::shared_ptr<symbol_table> symbols);
|
||||
tree handle_symbol(const std::string& symbol_name, std::shared_ptr<boot::alias_type> reference,
|
||||
std::shared_ptr<symbol_table> symbols, std::unordered_map<std::string, tree>& unresolved,
|
||||
std::vector<std::string>& path);
|
||||
@ -46,7 +45,7 @@ namespace elna::gcc
|
||||
std::shared_ptr<symbol_table> symbols;
|
||||
std::unordered_map<std::string, tree> unresolved;
|
||||
|
||||
void declare_procedure(boot::procedure_definition *const definition);
|
||||
void declare_procedure(boot::procedure_declaration *const definition);
|
||||
tree build_procedure_type(boot::procedure_type_expression& type);
|
||||
void build_composite_type(const std::vector<boot::field_declaration>& fields,
|
||||
tree composite_type_node);
|
||||
@ -79,7 +78,7 @@ namespace elna::gcc
|
||||
std::unordered_map<std::string, tree>&& unresolved);
|
||||
|
||||
void visit(boot::program *program) override;
|
||||
void visit(boot::procedure_definition *definition) override;
|
||||
void visit(boot::procedure_declaration *definition) override;
|
||||
void visit(boot::procedure_call *call) override;
|
||||
void visit(boot::cast_expression *expression) override;
|
||||
void visit(boot::traits_expression *trait) override;
|
||||
@ -92,8 +91,8 @@ namespace elna::gcc
|
||||
void visit(boot::literal<std::string> *string) override;
|
||||
void visit(boot::binary_expression *expression) override;
|
||||
void visit(boot::unary_expression *expression) override;
|
||||
void visit(boot::constant_definition *definition) override;
|
||||
void visit(boot::type_definition *definition) override;
|
||||
void visit(boot::constant_declaration *definition) override;
|
||||
void visit(boot::type_declaration *definition) override;
|
||||
void visit(boot::variable_declaration *declaration) override;
|
||||
void visit(boot::variable_expression *expression) override;
|
||||
void visit(boot::array_access_expression *expression) override;
|
||||
|
Reference in New Issue
Block a user