Use -> arrow for the return types

This commit is contained in:
Eugen Wissner 2025-02-12 13:32:59 +01:00
parent cd949c4be7
commit f991686330
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
7 changed files with 60 additions and 46 deletions

View File

@ -262,6 +262,9 @@ defer {
\+ { \+ {
return yy::parser::make_PLUS(this->location); return yy::parser::make_PLUS(this->location);
} }
\-> {
return yy::parser::make_ARROW(this->location);
}
\- { \- {
return yy::parser::make_MINUS(this->location); return yy::parser::make_MINUS(this->location);
} }

View File

@ -88,7 +88,7 @@ along with GCC; see the file COPYING3. If not see
%token AND OR NOT CAST AS SIZEOF %token AND OR NOT CAST AS SIZEOF
%token GREATER_EQUAL LESS_EQUAL LESS_THAN GREATER_THAN NOT_EQUAL EQUALS %token GREATER_EQUAL LESS_EQUAL LESS_THAN GREATER_THAN NOT_EQUAL EQUALS
%token PLUS MINUS MULTIPLICATION DIVISION REMAINDER %token PLUS MINUS MULTIPLICATION DIVISION REMAINDER
%token ASSIGNMENT COLON HAT AT NIL %token ASSIGNMENT COLON HAT AT NIL ARROW
%left OR AND %left OR AND
%left EQUALS NOT_EQUAL LESS_THAN GREATER_THAN LESS_EQUAL GREATER_EQUAL %left EQUALS NOT_EQUAL LESS_THAN GREATER_THAN LESS_EQUAL GREATER_EQUAL
@ -161,7 +161,7 @@ procedure_heading:
$2.first, $2.second); $2.first, $2.second);
std::swap($3, $$->parameters); std::swap($3, $$->parameters);
} }
| PROCEDURE identifier_definition formal_parameter_list COLON type_expression SEMICOLON | PROCEDURE identifier_definition formal_parameter_list ARROW type_expression SEMICOLON
{ {
$$ = new elna::boot::procedure_definition(elna::boot::make_position(@1), $$ = new elna::boot::procedure_definition(elna::boot::make_position(@1),
$2.first, $2.second, $5); $2.first, $2.second, $5);

View File

@ -30,10 +30,15 @@ namespace gcc
elna_int_type_node = long_integer_type_node; elna_int_type_node = long_integer_type_node;
elna_word_type_node = size_type_node; elna_word_type_node = size_type_node;
elna_char_type_node = unsigned_char_type_node; elna_char_type_node = unsigned_char_type_node;
elna_bool_type_node = boolean_type_node;
elna_byte_type_node = make_unsigned_type(8); elna_byte_type_node = make_unsigned_type(8);
elna_float_type_node = double_type_node; elna_float_type_node = double_type_node;
elna_bool_type_node = boolean_type_node;
elna_bool_true_node = boolean_true_node;
elna_bool_false_node = boolean_false_node;
elna_pointer_nil_node = null_pointer_node;
elna_string_type_node = make_node(RECORD_TYPE); elna_string_type_node = make_node(RECORD_TYPE);
tree string_ptr_type = build_pointer_type_for_mode(elna_char_type_node, VOIDmode, true); tree string_ptr_type = build_pointer_type_for_mode(elna_char_type_node, VOIDmode, true);
tree record_chain = NULL_TREE; tree record_chain = NULL_TREE;

View File

@ -323,7 +323,7 @@ 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(elna_bool_type_node, boolean->number()); this->current_expression = boolean->number() ? boolean_true_node : boolean_false_node;
} }
void generic_visitor::visit(boot::number_literal<unsigned char> *character) void generic_visitor::visit(boot::number_literal<unsigned char> *character)
@ -333,7 +333,7 @@ namespace gcc
void generic_visitor::visit(boot::number_literal<nullptr_t> *) void generic_visitor::visit(boot::number_literal<nullptr_t> *)
{ {
this->current_expression = null_pointer_node; this->current_expression = elna_pointer_nil_node;
} }
void generic_visitor::visit(boot::number_literal<std::string> *string) void generic_visitor::visit(boot::number_literal<std::string> *string)

View File

@ -50,7 +50,7 @@ namespace gcc
tree lhs_type = TREE_TYPE(lhs); tree lhs_type = TREE_TYPE(lhs);
tree rhs_type = TREE_TYPE(rhs); tree rhs_type = TREE_TYPE(rhs);
return (is_pointer_type(lhs_type) && rhs == null_pointer_node) return (is_pointer_type(lhs_type) && rhs == elna_pointer_nil_node)
|| (is_pointer_type(lhs_type) && lhs_type == rhs_type); || (is_pointer_type(lhs_type) && lhs_type == rhs_type);
} }

View File

@ -24,6 +24,9 @@ enum elna_tree_index
ELNA_TI_BYTE_TYPE, ELNA_TI_BYTE_TYPE,
ELNA_TI_FLOAT_TYPE, ELNA_TI_FLOAT_TYPE,
ELNA_TI_STRING_TYPE, ELNA_TI_STRING_TYPE,
ELNA_TI_BOOL_TRUE,
ELNA_TI_BOOL_FALSE,
ELNA_TI_POINTER_NIL,
ELNA_TI_MAX ELNA_TI_MAX
}; };
@ -37,6 +40,9 @@ extern GTY(()) hash_map<nofree_string_hash, tree> *elna_global_decls;
#define elna_byte_type_node elna_global_trees[ELNA_TI_BYTE_TYPE] #define elna_byte_type_node elna_global_trees[ELNA_TI_BYTE_TYPE]
#define elna_float_type_node elna_global_trees[ELNA_TI_FLOAT_TYPE] #define elna_float_type_node elna_global_trees[ELNA_TI_FLOAT_TYPE]
#define elna_string_type_node elna_global_trees[ELNA_TI_STRING_TYPE] #define elna_string_type_node elna_global_trees[ELNA_TI_STRING_TYPE]
#define elna_bool_true_node elna_global_trees[ELNA_TI_BOOL_TRUE]
#define elna_bool_false_node elna_global_trees[ELNA_TI_BOOL_FALSE]
#define elna_pointer_nil_node elna_global_trees[ELNA_TI_POINTER_NIL]
/* Language-dependent contents of a type. */ /* Language-dependent contents of a type. */
struct GTY (()) lang_type struct GTY (()) lang_type

View File

@ -67,28 +67,28 @@ type
(* (*
External procedures. External procedures.
*) *)
proc fopen(pathname: pointer to Char, mode: pointer to Char): pointer to FILE; extern proc fopen(pathname: pointer to Char, mode: pointer to Char) -> pointer to FILE; extern
proc fclose(stream: pointer to FILE): Int; extern proc fclose(stream: pointer to FILE) -> Int; extern
proc fseek(stream: pointer to FILE, off: Int, whence: Int): Int; extern proc fseek(stream: pointer to FILE, off: Int, whence: Int) -> Int; extern
proc rewind(stream: pointer to FILE); extern proc rewind(stream: pointer to FILE); extern
proc ftell(stream: pointer to FILE): Int; extern proc ftell(stream: pointer to FILE) -> Int; extern
proc fread(ptr: pointer to Byte, size: Word, nmemb: Word, stream: pointer to FILE): Word; extern proc fread(ptr: pointer to Byte, size: Word, nmemb: Word, stream: pointer to FILE) -> Word; extern
proc write(fd: Int, buf: pointer to Byte, Word: Int): Int; extern proc write(fd: Int, buf: pointer to Byte, Word: Int) -> Int; extern
proc malloc(size: Word): pointer to Byte; extern proc malloc(size: Word) -> pointer to Byte; extern
proc free(ptr: pointer to Byte); extern proc free(ptr: pointer to Byte); extern
proc calloc(nmemb: Word, size: Word): pointer to Byte; extern proc calloc(nmemb: Word, size: Word) -> pointer to Byte; extern
proc realloc(ptr: pointer to Byte, size: Word): pointer to Byte; extern proc realloc(ptr: pointer to Byte, size: Word) -> pointer to Byte; extern
proc memset(ptr: pointer to Char, c: Int, n: Int): pointer to Char; extern proc memset(ptr: pointer to Char, c: Int, n: Int) -> pointer to Char; extern
proc strcmp(s1: pointer to Char, s2: pointer to Char): Int; extern proc strcmp(s1: pointer to Char, s2: pointer to Char) -> Int; extern
proc strncmp(s1: pointer to Char, s2: pointer to Char, n: Word): Int; extern proc strncmp(s1: pointer to Char, s2: pointer to Char, n: Word) -> Int; extern
proc strncpy(dst: pointer to Char, src: pointer to Char, dsize: Word): pointer to Char; extern proc strncpy(dst: pointer to Char, src: pointer to Char, dsize: Word) -> pointer to Char; extern
proc strcpy(dst: pointer to Char, src: pointer to Char): pointer to Char; extern proc strcpy(dst: pointer to Char, src: pointer to Char) -> pointer to Char; extern
proc strlen(ptr: pointer to Char): Word; extern proc strlen(ptr: pointer to Char) -> Word; extern
proc strtol(nptr: pointer to Char, endptr: pointer to pointer to Char, base: Int): Int; extern proc strtol(nptr: pointer to Char, endptr: pointer to pointer to Char, base: Int) -> Int; extern
proc perror(s: pointer to Char); extern proc perror(s: pointer to Char); extern
proc exit(code: Int); extern proc exit(code: Int); extern
@ -96,7 +96,7 @@ proc exit(code: Int); extern
(* (*
Standard procedures. Standard procedures.
*) *)
proc reallocarray(ptr: pointer to Byte, n: Word, size: Word): pointer to Byte; proc reallocarray(ptr: pointer to Byte, n: Word, size: Word) -> pointer to Byte;
begin begin
return realloc(ptr, n * size) return realloc(ptr, n * size)
end end
@ -154,40 +154,40 @@ begin
write_i(value) write_i(value)
end end
proc is_digit(c: Char): Bool; proc is_digit(c: Char) -> Bool;
begin begin
return cast(c as Int) >= cast('0' as Int) and cast(c as Int) <= cast('9' as Int) return cast(c as Int) >= cast('0' as Int) and cast(c as Int) <= cast('9' as Int)
end end
proc is_alpha(c: Char): Bool; proc is_alpha(c: Char) -> Bool;
begin begin
return cast(c as Int) >= cast('A' as Int) and cast(c as Int) <= cast('z' as Int) return cast(c as Int) >= cast('A' as Int) and cast(c as Int) <= cast('z' as Int)
end end
proc is_alnum(c: Char): Bool; proc is_alnum(c: Char) -> Bool;
begin begin
return is_digit(c) or is_alpha(c) return is_digit(c) or is_alpha(c)
end end
proc is_space(c: Char): Bool; proc is_space(c: Char) -> Bool;
begin begin
return c = ' ' or c = '\n' or c = '\t' return c = ' ' or c = '\n' or c = '\t'
end end
proc open_substring(string: String, start: Word): String; proc open_substring(string: String, start: Word) -> String;
begin begin
string.ptr := string.ptr + start; string.ptr := string.ptr + start;
string.length := string.length - start; string.length := string.length - start;
return string return string
end end
proc substring(string: String, start: Word, count: Word): String; proc substring(string: String, start: Word, count: Word) -> String;
begin begin
string.ptr := string.ptr + start; string.ptr := string.ptr + start;
string.length := count string.length := count
end end
proc string_dup(origin: String): String; proc string_dup(origin: String) -> String;
var var
copy: pointer to Char; copy: pointer to Char;
begin begin
@ -198,7 +198,7 @@ begin
return origin return origin
end end
proc char_at(string: String, position: Word): Char; proc char_at(string: String, position: Word) -> Char;
begin begin
return (string.ptr + position)^ return (string.ptr + position)^
end end
@ -207,7 +207,7 @@ end
End of standard procedures. End of standard procedures.
*) *)
proc make_position(): Position; proc make_position() -> Position;
var var
result: Position; result: Position;
begin begin
@ -216,7 +216,7 @@ begin
return result return result
end end
proc read_source(filename: pointer to Char, result: pointer to String): Bool; proc read_source(filename: pointer to Char, result: pointer to String) -> Bool;
var var
input_file: pointer to FILE, input_file: pointer to FILE,
source_size: Int, source_size: Int,
@ -249,7 +249,7 @@ begin
return true return true
end end
proc escape_char(escape: Char, result: pointer to Char): Bool; proc escape_char(escape: Char, result: pointer to Char) -> Bool;
begin begin
if escape = 'n' then if escape = 'n' then
result^ := '\n'; result^ := '\n';
@ -292,7 +292,7 @@ begin
end end
end end
proc advance_source(source_code: SourceCode, length: Word): SourceCode; proc advance_source(source_code: SourceCode, length: Word) -> SourceCode;
begin begin
source_code.text := open_substring(source_code.text, length); source_code.text := open_substring(source_code.text, length);
source_code.position.column := source_code.position.column + length; source_code.position.column := source_code.position.column + length;
@ -300,7 +300,7 @@ begin
return source_code return source_code
end end
proc skip_spaces(source_code: SourceCode): SourceCode; proc skip_spaces(source_code: SourceCode) -> SourceCode;
begin begin
while source_code.text.length > 0u and is_space(char_at(source_code.text, 0)) do while source_code.text.length > 0u and is_space(char_at(source_code.text, 0)) do
if char_at(source_code.text, 0) = '\n' then if char_at(source_code.text, 0) = '\n' then
@ -328,7 +328,7 @@ begin
token_content^ := substring(token_content^, 0u, content_length) token_content^ := substring(token_content^, 0u, content_length)
end end
proc lex_comment(source_code: pointer to SourceCode, token_content: pointer to String): Bool; proc lex_comment(source_code: pointer to SourceCode, token_content: pointer to String) -> Bool;
var var
content_length: Word; content_length: Word;
begin begin
@ -349,7 +349,7 @@ begin
return false return false
end end
proc lex_character(input: pointer to Char, current_token: pointer to Token): pointer to Char; proc lex_character(input: pointer to Char, current_token: pointer to Token) -> pointer to Char;
begin begin
if input^ = '\\' then if input^ = '\\' then
input := input + 1; input := input + 1;
@ -363,7 +363,7 @@ begin
return input return input
end end
proc lex_string(input: pointer to Char, current_token: pointer to Token): pointer to Char; proc lex_string(input: pointer to Char, current_token: pointer to Token) -> pointer to Char;
var var
token_end: pointer to Char, token_end: pointer to Char,
constructed_string: pointer to Char, constructed_string: pointer to Char,
@ -548,7 +548,7 @@ begin
write_c('\n') write_c('\n')
end end
proc categorize_identifier(token_content: String): Token; proc categorize_identifier(token_content: String) -> Token;
var var
current_token: Token; current_token: Token;
begin begin
@ -622,7 +622,7 @@ begin
return current_token return current_token
end end
proc tokenize(source_code: SourceCode, tokens_size: pointer to Word): pointer to Token; proc tokenize(source_code: SourceCode, tokens_size: pointer to Word) -> pointer to Token;
var var
token_end: pointer to Char, token_end: pointer to Char,
tokens: pointer to Token, tokens: pointer to Token,
@ -786,13 +786,13 @@ begin
return tokens return tokens
end end
proc parse_literal(tokens: pointer to pointer to Token, tokens_size: pointer to Word): pointer to Literal; proc parse_literal(tokens: pointer to pointer to Token, tokens_size: pointer to Word) -> pointer to Literal;
begin begin
return cast(calloc(1, sizeof(Literal)) as pointer to Literal) return cast(calloc(1, sizeof(Literal)) as pointer to Literal)
end end
proc parse_constant_definition(tokens: pointer to pointer to Token, proc parse_constant_definition(tokens: pointer to pointer to Token,
tokens_size: pointer to Word): pointer to ConstantDefinition; tokens_size: pointer to Word) -> pointer to ConstantDefinition;
var var
result: pointer to ConstantDefinition; result: pointer to ConstantDefinition;
begin begin
@ -815,7 +815,7 @@ begin
return result return result
end end
proc parse_program(tokens: pointer to pointer to Token, tokens_size: pointer to Word): pointer to Program; proc parse_program(tokens: pointer to pointer to Token, tokens_size: pointer to Word) -> pointer to Program;
var var
result: pointer to Program, result: pointer to Program,
current_constant: pointer to pointer to ConstantDefinition; current_constant: pointer to pointer to ConstantDefinition;
@ -845,7 +845,7 @@ begin
end end
end end
proc parse_command_line*(argc: Int, argv: pointer to pointer to Char): pointer to CommandLine; proc parse_command_line*(argc: Int, argv: pointer to pointer to Char) -> pointer to CommandLine;
var var
parameter: pointer to pointer to Char, parameter: pointer to pointer to Char,
i: Int, i: Int,
@ -886,7 +886,7 @@ begin
return result return result
end end
proc process(argc: Int, argv: pointer to pointer to Char): Int; proc process(argc: Int, argv: pointer to pointer to Char) -> Int;
var var
tokens: pointer to Token, tokens: pointer to Token,
tokens_size: Word, tokens_size: Word,