diff --git a/boot/lexer.ll b/boot/lexer.ll index 4039fea..f0bbe8a 100644 --- a/boot/lexer.ll +++ b/boot/lexer.ll @@ -262,6 +262,9 @@ defer { \+ { return yy::parser::make_PLUS(this->location); } +\-> { + return yy::parser::make_ARROW(this->location); + } \- { return yy::parser::make_MINUS(this->location); } diff --git a/boot/parser.yy b/boot/parser.yy index f1233f5..e4824cb 100644 --- a/boot/parser.yy +++ b/boot/parser.yy @@ -88,7 +88,7 @@ along with GCC; see the file COPYING3. If not see %token AND OR NOT CAST AS SIZEOF %token GREATER_EQUAL LESS_EQUAL LESS_THAN GREATER_THAN NOT_EQUAL EQUALS %token PLUS MINUS MULTIPLICATION DIVISION REMAINDER -%token ASSIGNMENT COLON HAT AT NIL +%token ASSIGNMENT COLON HAT AT NIL ARROW %left OR AND %left EQUALS NOT_EQUAL LESS_THAN GREATER_THAN LESS_EQUAL GREATER_EQUAL @@ -161,7 +161,7 @@ procedure_heading: $2.first, $2.second); 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), $2.first, $2.second, $5); diff --git a/gcc/elna-builtins.cc b/gcc/elna-builtins.cc index a2e6ee0..3c2de3f 100644 --- a/gcc/elna-builtins.cc +++ b/gcc/elna-builtins.cc @@ -30,10 +30,15 @@ namespace gcc elna_int_type_node = long_integer_type_node; elna_word_type_node = size_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_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); tree string_ptr_type = build_pointer_type_for_mode(elna_char_type_node, VOIDmode, true); tree record_chain = NULL_TREE; diff --git a/gcc/elna-generic.cc b/gcc/elna-generic.cc index 4739f29..ae29817 100644 --- a/gcc/elna-generic.cc +++ b/gcc/elna-generic.cc @@ -323,7 +323,7 @@ namespace gcc void generic_visitor::visit(boot::number_literal *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 *character) @@ -333,7 +333,7 @@ namespace gcc void generic_visitor::visit(boot::number_literal *) { - this->current_expression = null_pointer_node; + this->current_expression = elna_pointer_nil_node; } void generic_visitor::visit(boot::number_literal *string) diff --git a/gcc/elna-tree.cc b/gcc/elna-tree.cc index 300a9cf..5613724 100644 --- a/gcc/elna-tree.cc +++ b/gcc/elna-tree.cc @@ -50,7 +50,7 @@ namespace gcc tree lhs_type = TREE_TYPE(lhs); 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); } diff --git a/include/elna/gcc/elna1.h b/include/elna/gcc/elna1.h index 93d0043..f4f86f5 100644 --- a/include/elna/gcc/elna1.h +++ b/include/elna/gcc/elna1.h @@ -24,6 +24,9 @@ enum elna_tree_index ELNA_TI_BYTE_TYPE, ELNA_TI_FLOAT_TYPE, ELNA_TI_STRING_TYPE, + ELNA_TI_BOOL_TRUE, + ELNA_TI_BOOL_FALSE, + ELNA_TI_POINTER_NIL, ELNA_TI_MAX }; @@ -37,6 +40,9 @@ extern GTY(()) hash_map *elna_global_decls; #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_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. */ struct GTY (()) lang_type diff --git a/source.elna b/source.elna index b069d86..2a08830 100644 --- a/source.elna +++ b/source.elna @@ -67,28 +67,28 @@ type (* External procedures. *) -proc fopen(pathname: pointer to Char, mode: pointer to Char): pointer to FILE; extern -proc fclose(stream: pointer to FILE): Int; extern -proc fseek(stream: pointer to FILE, off: Int, whence: Int): Int; extern +proc fopen(pathname: pointer to Char, mode: pointer to Char) -> pointer to FILE; extern +proc fclose(stream: pointer to FILE) -> Int; extern +proc fseek(stream: pointer to FILE, off: Int, whence: Int) -> Int; extern proc rewind(stream: pointer to FILE); 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 write(fd: Int, buf: pointer to Byte, Word: Int): 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 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 calloc(nmemb: Word, size: Word): pointer to Byte; extern -proc realloc(ptr: pointer to Byte, 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 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 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 strcpy(dst: pointer to Char, src: pointer to Char): pointer to Char; extern -proc strlen(ptr: pointer to Char): Word; 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 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 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 exit(code: Int); extern @@ -96,7 +96,7 @@ proc exit(code: Int); extern (* 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 return realloc(ptr, n * size) end @@ -154,40 +154,40 @@ begin write_i(value) end -proc is_digit(c: Char): Bool; +proc is_digit(c: Char) -> Bool; begin return cast(c as Int) >= cast('0' as Int) and cast(c as Int) <= cast('9' as Int) end -proc is_alpha(c: Char): Bool; +proc is_alpha(c: Char) -> Bool; begin return cast(c as Int) >= cast('A' as Int) and cast(c as Int) <= cast('z' as Int) end -proc is_alnum(c: Char): Bool; +proc is_alnum(c: Char) -> Bool; begin return is_digit(c) or is_alpha(c) end -proc is_space(c: Char): Bool; +proc is_space(c: Char) -> Bool; begin return c = ' ' or c = '\n' or c = '\t' end -proc open_substring(string: String, start: Word): String; +proc open_substring(string: String, start: Word) -> String; begin string.ptr := string.ptr + start; string.length := string.length - start; return string end -proc substring(string: String, start: Word, count: Word): String; +proc substring(string: String, start: Word, count: Word) -> String; begin string.ptr := string.ptr + start; string.length := count end -proc string_dup(origin: String): String; +proc string_dup(origin: String) -> String; var copy: pointer to Char; begin @@ -198,7 +198,7 @@ begin return origin end -proc char_at(string: String, position: Word): Char; +proc char_at(string: String, position: Word) -> Char; begin return (string.ptr + position)^ end @@ -207,7 +207,7 @@ end End of standard procedures. *) -proc make_position(): Position; +proc make_position() -> Position; var result: Position; begin @@ -216,7 +216,7 @@ begin return result 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 input_file: pointer to FILE, source_size: Int, @@ -249,7 +249,7 @@ begin return true end -proc escape_char(escape: Char, result: pointer to Char): Bool; +proc escape_char(escape: Char, result: pointer to Char) -> Bool; begin if escape = 'n' then result^ := '\n'; @@ -292,7 +292,7 @@ begin end end -proc advance_source(source_code: SourceCode, length: Word): SourceCode; +proc advance_source(source_code: SourceCode, length: Word) -> SourceCode; begin source_code.text := open_substring(source_code.text, length); source_code.position.column := source_code.position.column + length; @@ -300,7 +300,7 @@ begin return source_code end -proc skip_spaces(source_code: SourceCode): SourceCode; +proc skip_spaces(source_code: SourceCode) -> SourceCode; begin 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 @@ -328,7 +328,7 @@ begin token_content^ := substring(token_content^, 0u, content_length) 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 content_length: Word; begin @@ -349,7 +349,7 @@ begin return false 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 if input^ = '\\' then input := input + 1; @@ -363,7 +363,7 @@ begin return input 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 token_end: pointer to Char, constructed_string: pointer to Char, @@ -548,7 +548,7 @@ begin write_c('\n') end -proc categorize_identifier(token_content: String): Token; +proc categorize_identifier(token_content: String) -> Token; var current_token: Token; begin @@ -622,7 +622,7 @@ begin return current_token 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 token_end: pointer to Char, tokens: pointer to Token, @@ -786,13 +786,13 @@ begin return tokens 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 return cast(calloc(1, sizeof(Literal)) as pointer to Literal) end 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 result: pointer to ConstantDefinition; begin @@ -815,7 +815,7 @@ begin return result 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 result: pointer to Program, current_constant: pointer to pointer to ConstantDefinition; @@ -845,7 +845,7 @@ begin 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 parameter: pointer to pointer to Char, i: Int, @@ -886,7 +886,7 @@ begin return result end -proc process(argc: Int, argv: pointer to pointer to Char): Int; +proc process(argc: Int, argv: pointer to pointer to Char) -> Int; var tokens: pointer to Token, tokens_size: Word,