aboutsummaryrefslogtreecommitdiff
path: root/source/symbol.elna
diff options
context:
space:
mode:
Diffstat (limited to 'source/symbol.elna')
-rw-r--r--source/symbol.elna200
1 files changed, 0 insertions, 200 deletions
diff --git a/source/symbol.elna b/source/symbol.elna
deleted file mode 100644
index a07a9f3..0000000
--- a/source/symbol.elna
+++ /dev/null
@@ -1,200 +0,0 @@
-(* This Source Code Form is subject to the terms of the Mozilla Public License,
- v. 2.0. If a copy of the MPL was not distributed with this file, You can
- obtain one at https://mozilla.org/MPL/2.0/. *)
-module
-import sys.posix.cstdlib, common, ast
-
-type
- ElnaSymbolInfoKind* = (type_info, temporary_info, procedure_info)
- ElnaSymbolInfo* = record
- kind: ElnaSymbolInfoKind
- end
- ElnaSymbolTypeInfo* = record(ElnaSymbolInfo)
- _type: ^ElnaType
- end
- ElnaSymbolTemporaryInfo* = record(ElnaSymbolInfo)
- attr: Word;
- variable_type: ^ElnaType
- end
- ElnaSymbolProcedureInfo* = record(ElnaSymbolInfo)
- symbol_table: ^ElnaSymbolTable;
- procedure_type: ^ElnaTypeProcedure;
- is_extern: Bool
- end
-
- ElnaSymbolEntry* = record
- name: []const Word8;
- symbol_info: ^ElnaSymbolInfo
- end
- ElnaSymbolTable* = record
- count: Word;
- capacity: Word;
- parent: ^ElnaSymbolTable;
- symbols: ^ElnaSymbolEntry
- end
-
-var
- symbol_table_global*: ^ElnaSymbolTable
- word_type*: ^ElnaType
- int_type*: ^ElnaType
- pointer_type*: ^ElnaType
- bool_type*: ^ElnaType
- char_type*: ^ElnaType
- string_type*: ^ElnaTypeRecord
-
-proc elna_symbol_type_info_create*(type_representation: ^ElnaType) -> ^ElnaSymbolTypeInfo
-var
- result: ^ElnaSymbolTypeInfo
-begin
- result := malloc#[ElnaSymbolTypeInfo](#size(ElnaSymbolTypeInfo));
- result^.kind := ElnaSymbolInfoKind.type_info;
- result^._type := type_representation
-return result
-
-proc elna_symbol_temporary_info_create*(attr: Word; temporary_type: ^ElnaType) -> ^ElnaSymbolTemporaryInfo
-var
- result: ^ElnaSymbolTemporaryInfo
-begin
- result := malloc#[ElnaSymbolTemporaryInfo](#size(ElnaSymbolTemporaryInfo));
- result^.kind := ElnaSymbolInfoKind.temporary_info;
- result^.variable_type := temporary_type;
- result^.attr := attr
-return result
-
-proc elna_symbol_procedure_info_create*(is_extern: Bool) -> ^ElnaSymbolProcedureInfo
-var
- result: ^ElnaSymbolProcedureInfo
-begin
- result := malloc#[ElnaSymbolProcedureInfo](#size(ElnaSymbolProcedureInfo));
- result^.kind := ElnaSymbolInfoKind.procedure_info;
- result^.procedure_type := nil;
- result^.symbol_table := nil;
- result^.is_extern := is_extern
-return result
-
-proc elna_symbol_table_create*(parent: ^ElnaSymbolTable) -> ^ElnaSymbolTable
-var
- new_symbol_table: ^ElnaSymbolTable
-begin
- new_symbol_table := malloc#[ElnaSymbolTable](#size(ElnaSymbolTable));
- new_symbol_table^.capacity := 64u;
- new_symbol_table^.symbols := malloc#[ElnaSymbolEntry](new_symbol_table^.capacity * #size(ElnaSymbolEntry));
- new_symbol_table^.count := 0u;
- new_symbol_table^.parent := parent
-return new_symbol_table
-
-proc elna_symbol_table_enter*(symbol_table: ^ElnaSymbolTable; symbol_name: []const Word8; symbol: ^ElnaSymbolInfo)
-var
- entry: ^ElnaSymbolEntry
-begin
- if symbol_table^.count >= symbol_table^.capacity then
- symbol_table^.capacity := symbol_table^.capacity * 2u;
- symbol_table^.symbols := realloc#[ElnaSymbolEntry](symbol_table^.symbols, symbol_table^.capacity * #size(ElnaSymbolEntry))
- end;
- entry := symbol_table^.symbols + symbol_table^.count;
- entry^.name := symbol_name;
- entry^.symbol_info := symbol;
- symbol_table^.count := symbol_table^.count + 1u
-return
-
-proc elna_symbol_table_lookup_local*(symbol_table: ^ElnaSymbolTable; symbol_name: []const Word8) -> ^ElnaSymbolInfo
-var
- i: Word := 0u
- entry: ^ElnaSymbolEntry
- result: ^ElnaSymbolInfo := nil
-begin
- while i < symbol_table^.count & result = nil do
- entry := symbol_table^.symbols + i;
- if entry^.name = symbol_name then
- result := entry^.symbol_info
- end;
- i := i + 1u
- end
-return result
-
-proc elna_symbol_table_lookup*(symbol_table: ^ElnaSymbolTable; symbol_name: []const Word8) -> ^ElnaSymbolInfo
-var
- current: ^ElnaSymbolTable
- found: ^ElnaSymbolInfo := nil
-begin
- current := symbol_table;
- while current <> nil & found = nil do
- found := elna_symbol_table_lookup_local(current, symbol_name);
- current := current^.parent
- end
-return found
-
-proc elna_symbol_string_build()
-var
- current_field: ^ElnaTypeField
- char_pointer: ^ElnaTypePointer
-begin
- string_type := malloc#[ElnaTypeRecord](#size(ElnaTypeRecord));
- string_type^.kind := ElnaTypeKind._record;
- string_type^.size := 16u;
- string_type^.alignment := 8u;
- string_type^.members := malloc#[ElnaTypeField](2u * #size(ElnaTypeField));
- string_type^.length := 2u;
-
- char_pointer := malloc#[ElnaTypePointer](#size(ElnaTypePointer));
- char_pointer^.kind := ElnaTypeKind.pointer;
- char_pointer^.size := 8u;
- char_pointer^.alignment := 8u;
- char_pointer^.base := char_type;
-
- current_field := string_type^.members;
- current_field^.name := "ptr";
- current_field^.field_type := cast(char_pointer: ^ElnaType);
-
- current_field := current_field + 1u;
- current_field^.name := "length";
- current_field^.field_type := word_type
-return
-
-proc elna_symbol_table_build*()
-var
- current_info: ^ElnaSymbolTypeInfo
-begin
- symbol_table_global := elna_symbol_table_create(nil);
-
- word_type := malloc#[ElnaType](#size(ElnaType));
- word_type^.kind := ElnaTypeKind.primitive;
- word_type^.size := 8u;
- word_type^.alignment := 8u;
- current_info := elna_symbol_type_info_create(word_type);
- elna_symbol_table_enter(symbol_table_global, "Word", cast(current_info: ^ElnaSymbolInfo));
-
- int_type := malloc#[ElnaType](#size(ElnaType));
- int_type^.kind := ElnaTypeKind.primitive;
- int_type^.size := 8u;
- int_type^.alignment := 8u;
- current_info := elna_symbol_type_info_create(int_type);
- elna_symbol_table_enter(symbol_table_global, "Int", cast(current_info: ^ElnaSymbolInfo));
-
- pointer_type := malloc#[ElnaType](#size(ElnaType));
- pointer_type^.kind := ElnaTypeKind.primitive;
- pointer_type^.size := 8u;
- pointer_type^.alignment := 8u;
- current_info := elna_symbol_type_info_create(pointer_type);
- elna_symbol_table_enter(symbol_table_global, "Pointer", cast(current_info: ^ElnaSymbolInfo));
-
- bool_type := malloc#[ElnaType](#size(ElnaType));
- bool_type^.kind := ElnaTypeKind.primitive;
- bool_type^.size := 1u;
- bool_type^.alignment := 1u;
- current_info := elna_symbol_type_info_create(bool_type);
- elna_symbol_table_enter(symbol_table_global, "Bool", cast(current_info: ^ElnaSymbolInfo));
-
- char_type := malloc#[ElnaType](#size(ElnaType));
- char_type^.kind := ElnaTypeKind.primitive;
- char_type^.size := 1u;
- char_type^.alignment := 1u;
- current_info := elna_symbol_type_info_create(char_type);
- elna_symbol_table_enter(symbol_table_global, "Char", cast(current_info: ^ElnaSymbolInfo));
-
- elna_symbol_string_build();
- current_info := elna_symbol_type_info_create(cast(string_type: ^ElnaType));
- elna_symbol_table_enter(symbol_table_global, "String", cast(current_info: ^ElnaSymbolInfo))
-return
-
-end.