Pass command line arguments to main
This commit is contained in:
parent
5108016d39
commit
845fab378b
@ -1,3 +1,5 @@
|
|||||||
|
#include <array>
|
||||||
|
|
||||||
#include "elna/gcc/elna-generic.h"
|
#include "elna/gcc/elna-generic.h"
|
||||||
#include "elna/gcc/elna-diagnostic.h"
|
#include "elna/gcc/elna-diagnostic.h"
|
||||||
|
|
||||||
@ -94,11 +96,11 @@ namespace gcc
|
|||||||
{
|
{
|
||||||
constant->accept(this);
|
constant->accept(this);
|
||||||
}
|
}
|
||||||
tree parameter_types[] = {
|
std::array<tree, 2> parameter_types{
|
||||||
integer_type_node,
|
integer_type_node,
|
||||||
build_pointer_type(build_pointer_type(char_type_node))
|
build_pointer_type(build_pointer_type(char_type_node))
|
||||||
};
|
};
|
||||||
tree declaration_type = build_function_type_array(integer_type_node, 2, parameter_types);
|
tree declaration_type = build_function_type_array(integer_type_node, 2, parameter_types.data());
|
||||||
this->main_fndecl = build_fn_decl("main", declaration_type);
|
this->main_fndecl = build_fn_decl("main", declaration_type);
|
||||||
tree resdecl = build_decl(UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, integer_type_node);
|
tree resdecl = build_decl(UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, integer_type_node);
|
||||||
DECL_CONTEXT(resdecl) = this->main_fndecl;
|
DECL_CONTEXT(resdecl) = this->main_fndecl;
|
||||||
@ -106,6 +108,19 @@ namespace gcc
|
|||||||
|
|
||||||
enter_scope();
|
enter_scope();
|
||||||
|
|
||||||
|
tree_chain argument_chain;
|
||||||
|
for (std::size_t i = 0; i < 2; ++i)
|
||||||
|
{
|
||||||
|
std::string argument_name = i == 0 ? "count" : "parameters";
|
||||||
|
tree argc_declaration_tree = build_decl(UNKNOWN_LOCATION, PARM_DECL,
|
||||||
|
get_identifier(argument_name.c_str()), parameter_types[i]);
|
||||||
|
DECL_CONTEXT(argc_declaration_tree) = this->main_fndecl;
|
||||||
|
DECL_ARG_TYPE(argc_declaration_tree) = parameter_types[i];
|
||||||
|
this->symbol_map->enter(argument_name, boot::make_info(argc_declaration_tree));
|
||||||
|
argument_chain.append(argc_declaration_tree);
|
||||||
|
}
|
||||||
|
DECL_ARGUMENTS(this->main_fndecl) = argument_chain.head();
|
||||||
|
|
||||||
for (const auto body_statement : program->body)
|
for (const auto body_statement : program->body)
|
||||||
{
|
{
|
||||||
body_statement->accept(this);
|
body_statement->accept(this);
|
||||||
@ -152,7 +167,7 @@ namespace gcc
|
|||||||
|
|
||||||
enter_scope();
|
enter_scope();
|
||||||
}
|
}
|
||||||
gcc::tree_chain argument_chain;
|
tree_chain argument_chain;
|
||||||
for (std::size_t i = 0; i < definition->parameters.size(); ++i)
|
for (std::size_t i = 0; i < definition->parameters.size(); ++i)
|
||||||
{
|
{
|
||||||
auto parameter = definition->parameters.at(i);
|
auto parameter = definition->parameters.at(i);
|
||||||
@ -241,7 +256,9 @@ namespace gcc
|
|||||||
|
|
||||||
void generic_visitor::visit(boot::number_literal<bool> *boolean)
|
void generic_visitor::visit(boot::number_literal<bool> *boolean)
|
||||||
{
|
{
|
||||||
this->current_expression = build_int_cst_type(boolean_type_node, boolean->number());
|
auto symbol = this->symbol_map->lookup("Bool");
|
||||||
|
|
||||||
|
this->current_expression = build_int_cst_type(symbol->payload, boolean->number());
|
||||||
}
|
}
|
||||||
|
|
||||||
void generic_visitor::visit(boot::number_literal<unsigned char> *character)
|
void generic_visitor::visit(boot::number_literal<unsigned char> *character)
|
||||||
|
35
source.elna
35
source.elna
@ -141,17 +141,6 @@ end;
|
|||||||
End of standard procedures.
|
End of standard procedures.
|
||||||
*)
|
*)
|
||||||
|
|
||||||
proc test_record();
|
|
||||||
var r: Token;
|
|
||||||
begin
|
|
||||||
write_s("\nTest record:\n");
|
|
||||||
|
|
||||||
r.kind := 4;
|
|
||||||
r.value.int_value := 8;
|
|
||||||
|
|
||||||
write_i(r.value.int_value)
|
|
||||||
end;
|
|
||||||
|
|
||||||
proc test_primitive();
|
proc test_primitive();
|
||||||
begin
|
begin
|
||||||
write_s("\nTest primitives:\n");
|
write_s("\nTest primitives:\n");
|
||||||
@ -413,7 +402,8 @@ begin
|
|||||||
write_c(' ');
|
write_c(' ');
|
||||||
|
|
||||||
i := i + sizeof(Token)
|
i := i + sizeof(Token)
|
||||||
end
|
end;
|
||||||
|
write_c('\n')
|
||||||
end;
|
end;
|
||||||
|
|
||||||
proc categorize_identifier(input_pointer: pointer to Char, token_length: Int): Token;
|
proc categorize_identifier(input_pointer: pointer to Char, token_length: Int): Token;
|
||||||
@ -638,10 +628,29 @@ begin
|
|||||||
free(input)
|
free(input)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
proc command_line(argc: Int, argv: pointer to pointer to Char);
|
||||||
|
var
|
||||||
|
parameter: pointer to pointer to Char,
|
||||||
|
i: Int;
|
||||||
|
begin
|
||||||
|
write_s("Argument count: ");
|
||||||
|
write_i(argc);
|
||||||
|
write_s("\nArguments:");
|
||||||
|
|
||||||
|
i := 1;
|
||||||
|
while i < argc do
|
||||||
|
parameter := argv + i * cast(sizeof(pointer to Char) as Int);
|
||||||
|
|
||||||
|
write_c(' ');
|
||||||
|
write_s(parameter^);
|
||||||
|
i := i + 1
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
compile();
|
compile();
|
||||||
|
|
||||||
test_record();
|
command_line(count, parameters);
|
||||||
test_primitive();
|
test_primitive();
|
||||||
|
|
||||||
exit(0)
|
exit(0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user