summaryrefslogtreecommitdiff
path: root/boot/stage15.elna
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-10-04 12:40:07 +0200
committerEugen Wissner <belka@caraus.de>2025-10-05 11:13:24 +0200
commitaf9ad5b712003b41a981beafe519275b14d6c159 (patch)
tree47081d013dcfda053e765f80e48c8502876d810b /boot/stage15.elna
parent2519b3f9e999fc0f97c61c8f2a26d6c3e4f5f92c (diff)
downloadelna-af9ad5b712003b41a981beafe519275b14d6c159.tar.gz
Implement enumeration
Diffstat (limited to 'boot/stage15.elna')
-rw-r--r--boot/stage15.elna1698
1 files changed, 780 insertions, 918 deletions
diff --git a/boot/stage15.elna b/boot/stage15.elna
index 9c8d3a3..6200fbd 100644
--- a/boot/stage15.elna
+++ b/boot/stage15.elna
@@ -4,12 +4,135 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*)
-(* Stage 14 compiler. *)
-
-(* - Binary minus. *)
-(* - Space independent parsing. *)
-(* - Label names in goto statements aren't required to begin with a dot. *)
-(* - Dereferencing pointers pointing to word long data. *)
+(* Stage 15 compiler. *)
+
+type
+ LexerAction = (none, accumulate, skip, single, eof, finalize, composite, key_id, integer, delimited);
+
+ (**
+ * Classification table assigns each possible character to a group (class). All
+ * characters of the same group a handled equivalently.
+ *
+ * Transition = record
+ * action: TransitionAction;
+ * next_state: TransitionState
+ * end;
+ *)
+ LexerClass = (
+ invalid,
+ digit,
+ alpha,
+ space,
+ colon,
+ equals,
+ left_paren,
+ right_paren,
+ asterisk,
+ backslash,
+ single,
+ hex,
+ zero,
+ x,
+ eof,
+ dot,
+ minus,
+ single_quote,
+ double_quote,
+ greater,
+ less,
+ other
+ );
+ LexerState = (
+ start,
+ colon,
+ identifier,
+ decimal,
+ leading_zero,
+ greater,
+ minus,
+ left_paren,
+ less,
+ dot,
+ comment,
+ closing_comment,
+ character,
+ character_escape,
+ string,
+ string_escape,
+ finish
+ );
+ LexerTokenKind = (
+ identifier,
+ _const,
+ _var,
+ _proc,
+ _type,
+ _begin,
+ _end,
+ _if,
+ _then,
+ _else,
+ _elsif,
+ _while,
+ _do,
+ _extern,
+ _record,
+ _union,
+ _true,
+ _false,
+ null,
+ and,
+ _or,
+ _xor,
+ pipe,
+ not,
+ _return,
+ _module,
+ _program,
+ _import,
+ _cast,
+ _defer,
+ _case,
+ _of,
+ trait,
+ left_paren,
+ right_paren,
+ left_square,
+ right_square,
+ shift_left,
+ shift_right,
+ greater_equal,
+ less_equal,
+ greater_than,
+ less_than,
+ not_equal,
+ equals,
+ semicolon,
+ dot,
+ comma,
+ plus,
+ arrow,
+ minus,
+ multiplication,
+ division,
+ remainder,
+ assignment,
+ colon,
+ hat,
+ at,
+ comment,
+ string,
+ character,
+ integer,
+ word,
+ _goto,
+ eof
+ );
+ NodeKind := (
+ integer_literal,
+ string_literal,
+ character_literal
+ );
const
symbol_builtin_name_int := "Int";
@@ -81,7 +204,7 @@ begin
if _load_byte(string) <> '"' then
counter := counter + 1;
- goto .string_length_loop
+ goto string_length_loop
end;
return counter
@@ -114,7 +237,7 @@ begin
if current_byte <> '\\' then
compiler_strings_length := compiler_strings_length + 1
end;
- goto .add_string_loop
+ goto add_string_loop
end;
return result
@@ -175,17 +298,17 @@ begin
_store_byte(current_character + '0', local_buffer);
number := number / 10;
- local_buffer := local_buffer + -1;
+ local_buffer := local_buffer - 1;
if number <> 0 then
- goto .print_i_digit10
+ goto print_i_digit10
end;
if is_negative = 1 then
_store_byte('-', local_buffer);
- local_buffer := local_buffer + -1
+ local_buffer := local_buffer - 1
end;
result := @result + 11;
- result := result + -local_buffer;
+ result := result - local_buffer;
_memcpy(output_buffer, local_buffer + 1, result);
return result
@@ -341,14 +464,14 @@ begin
if count <> 0 then
lhs_byte := _load_byte(lhs);
rhs_byte := _load_byte(rhs);
- result := lhs_byte + -rhs_byte;
+ result := lhs_byte - rhs_byte;
lhs := lhs + 1;
rhs := rhs + 1;
- count := count + -1;
+ count := count - 1;
if result = 0 then
- goto .memcmp_loop
+ goto memcmp_loop
end
end;
@@ -376,14 +499,65 @@ begin
destination := destination + 1;
source := source + 1;
- count := count + -1;
- goto .memcpy_loop
+ count := count - 1;
+ goto memcpy_loop
end;
return destination
end;
-proc _compile_integer_literal();
+proc _node_get_kind(this: Word);
+ return this^
+end;
+
+proc _node_set_kind(this: Word, kind: Word);
+begin
+ this^ := kind
+end;
+
+proc _integer_literal_node_size();
+ return 12
+end;
+
+proc _integer_literal_node_get_value(this: Word);
+ return _load_word(this + 4)
+end;
+
+proc _integer_literal_node_set_value(this: Word, value: Word);
+begin
+ _store_word(value, this + 4)
+end;
+
+proc _integer_literal_node_get_length(this: Word);
+ return _load_word(this + 8)
+end;
+
+proc _integer_literal_node_set_length(this: Word, value: Word);
+begin
+ _store_word(value, this + 8)
+end;
+
+proc _parse_integer_literal();
+var
+ integer_token: Word;
+ integer_length: Word;
+ result: Word;
+begin
+ result := memory_free_pointer;
+ memory_free_pointer := memory_free_pointer + 12;
+
+ integer_token := _lexer_global_get_start();
+ integer_length := _lexer_global_get_end() - integer_token;
+ _lexer_skip_token();
+
+ _node_set_kind(result, NodeKind.integer_literal);
+ _integer_literal_node_set_value(result, integer_token);
+ _integer_literal_node_set_length(result, integer_length);
+
+ return result
+end;
+
+proc _compile_integer_literal(integer_literal_node: Word);
var
integer_token: Word;
integer_length: Word;
@@ -391,34 +565,80 @@ var
begin
_write_z("\tli t0, \0");
- integer_token := _lexer_global_get_start();
- integer_length := _lexer_global_get_end() + -integer_token;
+ integer_token := _integer_literal_node_get_value(integer_literal_node);
+ integer_length := _integer_literal_node_get_length(integer_literal_node);
_write_s(integer_token, integer_length);
- _lexer_skip_token();
-
_write_c('\n')
end;
-proc _compile_character_literal();
+proc _character_literal_node_get_value(this: Word);
+ return _load_word(this + 4)
+end;
+
+proc _character_literal_node_set_value(this: Word, value: Word);
+begin
+ _store_word(value, this + 4)
+end;
+
+proc _character_literal_node_get_length(this: Word);
+ return _load_word(this + 8)
+end;
+
+proc _character_literal_node_set_length(this: Word, value: Word);
+begin
+ _store_word(value, this + 8)
+end;
+
+proc _parse_character_literal();
var
character: Word;
- token_kind: Word;
character_length: Word;
+ result: Word;
begin
+ result := memory_free_pointer;
+ memory_free_pointer := memory_free_pointer + 12;
+
character := _lexer_global_get_start();
- character_length := _lexer_global_get_end() + -character;
+ character_length := _lexer_global_get_end() - character;
+ _lexer_skip_token();
+
+ _node_set_kind(result, NodeKind.character_literal);
+ _integer_literal_node_set_value(result, character);
+ _integer_literal_node_set_length(result, character_length);
+
+ return result
+end;
+
+proc _compile_character_literal(character_literal_node: Word);
+var
+ character: Word;
+ character_length: Word;
+begin
+ character := _character_literal_node_get_value(character_literal_node);
+ character_length := _character_literal_node_get_length(character_literal_node);;
_write_z("\tli t0, \0");
_write_s(character, character_length);
_write_c('\n');
- _lexer_skip_token()
end;
proc _compile_variable_expression();
+var
+ name: Word;
+ lookup_result: Word;
+ name_token: Word;
begin
- _compile_designator();
- _write_z("\tlw t0, (t0)\n\0")
+ name := _lexer_global_get_start();
+ name_token := _lexer_global_get_end() - name;
+ lookup_result := _symbol_table_lookup(@symbol_table_global, name, name_token);
+
+ if lookup_result <> 0 then
+ _compile_enumeration_value(lookup_result)
+ else
+ _compile_designator();
+ _write_z("\tlw t0, (t0)\n\0")
+ end
end;
(**
@@ -451,19 +671,57 @@ begin
_write_z("\tnot t0, t0\n\0")
end;
-proc _compile_string_literal();
+proc _string_literal_node_size();
+ return 12
+end;
+
+proc _string_literal_node_get_value(this: Word);
+ return _load_word(this + 4)
+end;
+
+proc _string_literal_node_set_value(this: Word, value: Word);
+begin
+ _store_word(value, this + 4)
+end;
+
+proc _string_literal_node_get_length(this: Word);
+ return _load_word(this + 8)
+end;
+
+proc _string_literal_node_set_length(this: Word, value: Word);
+begin
+ _store_word(value, this + 8)
+end;
+
+proc _parse_string_literal();
var
- token_kind: Word;
- token_start: Word;
length: Word;
- offset: Word;
+ token_start: Word;
+ result: Word;
begin
- _lexer_read_token(@token_kind);
+ result := memory_free_pointer;
+ memory_free_pointer := memory_free_pointer + _string_literal_node_size();
+
token_start := _lexer_global_get_start();
length := _string_length(token_start);
+ _lexer_skip_token();
+
+ _string_literal_node_set_value(result, token_start);
+ _string_literal_node_set_length(result, length);
+
+ return result
+end;
+
+proc _compile_string_literal(string_literal_node: Word);
+var
+ token_start: Word;
+ length: Word;
+ offset: Word;
+begin
+ token_start := _string_literal_node_get_value(string_literal_node);
+ length := _string_literal_node_get_length(string_literal_node);
offset := _add_string(token_start);
- _lexer_skip_token();
_write_z("\tla t0, strings\n\0");
_write_z("\tli t1, \0");
@@ -477,22 +735,26 @@ proc _compile_term();
var
current_character: Word;
token_kind: Word;
+ parser_node: Word;
begin
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_character() then
- _compile_character_literal()
- elsif token_kind = _lexer_token_kind_string() then
- _compile_string_literal()
- elsif token_kind = _lexer_token_kind_integer() then
- _compile_integer_literal()
- elsif token_kind = _lexer_token_kind_at() then
+ if token_kind = LexerTokenKind.character then
+ parser_node := _parse_character_literal();
+ _compile_character_literal(parser_node)
+ elsif token_kind = LexerTokenKind.string then
+ parser_node := _parse_string_literal();
+ _compile_string_literal(parser_node)
+ elsif token_kind = LexerTokenKind.integer then
+ parser_node := _parse_integer_literal();
+ _compile_integer_literal(parser_node)
+ elsif token_kind = LexerTokenKind.at then
_compile_address_expression()
- elsif token_kind = _lexer_token_kind_minus() then
+ elsif token_kind = LexerTokenKind.minus then
_compile_negate_expression()
- elsif token_kind = _lexer_token_kind_not() then
+ elsif token_kind = LexerTokenKind.not then
_compile_not_expression()
- elsif token_kind = _lexer_token_kind_identifier() then
+ elsif token_kind = LexerTokenKind.identifier then
current_character := _lexer_global_get_start();
current_character := _load_byte(current_character);
@@ -524,85 +786,85 @@ begin
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_plus() then
+ if token_kind = LexerTokenKind.plus then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tadd t0, t0, t1\n\0")
- elsif token_kind = _lexer_token_kind_minus() then
+ elsif token_kind = LexerTokenKind.minus then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tsub t0, t1, t0\n\0");
- elsif token_kind = _lexer_token_kind_multiplication() then
+ elsif token_kind = LexerTokenKind.multiplication then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tmul t0, t0, t1\n\0")
- elsif token_kind = _lexer_token_kind_and() then
+ elsif token_kind = LexerTokenKind.and then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tand t0, t0, t1\n\0")
- elsif token_kind = _lexer_token_kind_or() then
+ elsif token_kind = LexerTokenKind._or then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tor t0, t0, t1\n\0")
- elsif token_kind = _lexer_token_kind_xor() then
+ elsif token_kind = LexerTokenKind._xor then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\txor t0, t0, t1\n\0")
- elsif token_kind = _lexer_token_kind_equals() then
+ elsif token_kind = LexerTokenKind.equals then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\txor t0, t0, t1\n\tseqz t0, t0\n\0")
- elsif token_kind = _lexer_token_kind_remainder() then
+ elsif token_kind = LexerTokenKind.remainder then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\trem t0, t1, t0\n\0")
- elsif token_kind = _lexer_token_kind_division() then
+ elsif token_kind = LexerTokenKind.division then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tdiv t0, t1, t0\n\0")
- elsif token_kind = _lexer_token_kind_less_than() then
+ elsif token_kind = LexerTokenKind.less_than then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tslt t0, t1, t0\n\0")
- elsif token_kind = _lexer_token_kind_greater_than() then
+ elsif token_kind = LexerTokenKind.greater_than then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tslt t0, t0, t1\n\0")
- elsif token_kind = _lexer_token_kind_less_equal() then
+ elsif token_kind = LexerTokenKind.less_equal then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\tslt t0, t0, t1\n\txori t0, t0, 1\n\0")
- elsif token_kind = _lexer_token_kind_not_equal() then
+ elsif token_kind = LexerTokenKind.not_equal then
_lexer_skip_token();
_compile_binary_rhs();
(* Execute the operation. *)
_write_z("\txor t0, t0, t1\n\tsnez t0, t0\n\0")
- elsif token_kind = _lexer_token_kind_greater_equal() then
+ elsif token_kind = LexerTokenKind.greater_equal then
_lexer_skip_token();
_compile_binary_rhs();
@@ -623,7 +885,7 @@ var
begin
_lexer_read_token(@token_kind);
name := _lexer_global_get_start();
- name_length := _lexer_global_get_end() + -name;
+ name_length := _lexer_global_get_end() - name;
argument_count := 0;
(* Skip the identifier and left paren. *)
@@ -632,8 +894,8 @@ begin
_lexer_skip_token();
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_right_paren() then
- goto .compile_call_finalize
+ if token_kind = LexerTokenKind.right_paren then
+ goto compile_call_finalize
end;
.compile_call_loop;
_compile_expression();
@@ -643,7 +905,7 @@ begin
(* Calculate the stack offset: 116 - (4 * argument_counter) *)
stack_offset := argument_count * 4;
- _write_i(116 + -stack_offset);
+ _write_i(116 - stack_offset);
_write_z("(sp)\n\0");
@@ -652,17 +914,17 @@ begin
_lexer_read_token(@token_kind);
- if token_kind <> _lexer_token_kind_comma() then
- goto .compile_call_finalize
+ if token_kind <> LexerTokenKind.comma then
+ goto compile_call_finalize
end;
_lexer_skip_token();
- goto .compile_call_loop;
+ goto compile_call_loop;
.compile_call_finalize;
(* Load the argument from the stack. *)
if argument_count <> 0 then
(* Decrement the argument counter. *)
- argument_count := argument_count + -1;
+ argument_count := argument_count - 1;
_write_z("\tlw a\0");
_write_i(argument_count);
@@ -671,11 +933,11 @@ begin
(* Calculate the stack offset: 116 - (4 * argument_counter) *)
stack_offset := argument_count * 4;
- _write_i(116 + -stack_offset);
+ _write_i(116 - stack_offset);
_write_z("(sp)\n\0");
- goto .compile_call_finalize
+ goto compile_call_finalize
end;
.compile_call_end;
@@ -697,12 +959,12 @@ begin
_lexer_skip_token();
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_dot() then
+ if token_kind = LexerTokenKind.dot then
_lexer_skip_token();
_lexer_read_token(@token_kind)
end;
next_token := _lexer_global_get_start();
- next_length := _lexer_global_get_end() + -next_token;
+ next_length := _lexer_global_get_end() - next_token;
_write_z("\tj .\0");
@@ -731,13 +993,57 @@ begin
_lexer_read_token(@token_kind);
name := _lexer_global_get_start();
- token_length := _lexer_global_get_end() + -name;
+ token_length := _lexer_global_get_end() - name;
_write_s(name, token_length);
_lexer_skip_token();
_write_c('\n')
end;
+proc _compile_enumeration_value(symbol: Word);
+var
+ enumeration_type: Word;
+ members: Word;
+ members_length: Word;
+ token_type: Word;
+ value_name: Word;
+ name_length: Word;
+ member_name: Word;
+ member_length: Word;
+ counter: Word;
+begin
+ enumeration_type := _type_info_get_type(symbol);
+ members := _enumeration_type_get_members(enumeration_type);
+ members_length := _enumeration_type_get_length(enumeration_type);
+
+ (* Skip enumeration type name and dot. Read the enumeration value. *)
+ _lexer_skip_token();
+ _lexer_read_token(@token_type);
+ _lexer_skip_token();
+ _lexer_read_token(@token_type);
+
+ value_name := _lexer_global_get_start();
+ name_length := _lexer_global_get_end() - value_name;
+ _lexer_skip_token();
+ counter := 1;
+
+ .compile_enumeration_value_members;
+ if members_length > 0 then
+ member_name := members^;
+ member_length := _load_word(members + 4);
+
+ if _lexer_compare_keyword(value_name, name_length, member_name, member_length) = 0 then
+ members_length := members_length - 1;
+ members := members + 8;
+ counter := counter + 1;
+ goto compile_enumeration_value_members
+ end;
+ _write_z("\tli t0, \0");
+ _write_i(counter);
+ _write_c('\n')
+ end
+end;
+
proc _compile_designator();
var
name_token: Word;
@@ -747,7 +1053,7 @@ var
begin
_lexer_read_token(@token_kind);
name := _lexer_global_get_start();
- name_token := _lexer_global_get_end() + -name;
+ name_token := _lexer_global_get_end() - name;
lookup_result := _symbol_table_lookup(@symbol_table_local, name, name_token);
if lookup_result <> 0 then
@@ -756,7 +1062,7 @@ begin
_compile_global_designator()
end;
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_hat() then
+ if token_kind = LexerTokenKind.hat then
_lexer_skip_token();
_write_z("\tlw t0, (t0)\n\0")
end
@@ -851,14 +1157,14 @@ begin
.compile_if_loop;
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_else() then
+ if token_kind = LexerTokenKind._else then
_lexer_skip_token();
_compile_statement_list()
- elsif token_kind = _lexer_token_kind_elsif() then
+ elsif token_kind = LexerTokenKind._elsif then
_lexer_skip_token();
_compile_condition(after_end_label);
- goto .compile_if_loop
+ goto compile_if_loop
end;
_lexer_skip_token();
@@ -876,7 +1182,7 @@ begin
_lexer_skip_token();
_lexer_read_token(@token_kind);
name := _lexer_global_get_start();
- label_token := _lexer_global_get_end() + -name;
+ label_token := _lexer_global_get_end() - name;
_write_c('.');
_write_s(name, label_token);
_write_z(":\n\0");
@@ -890,15 +1196,15 @@ var
begin
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_goto() then
+ if token_kind = LexerTokenKind._goto then
_compile_goto()
- elsif token_kind = _lexer_token_kind_if() then
+ elsif token_kind = LexerTokenKind._if then
_compile_if()
- elsif token_kind = _lexer_token_kind_return() then
+ elsif token_kind = LexerTokenKind._return then
_compile_return_statement()
- elsif token_kind = _lexer_token_kind_dot() then
+ elsif token_kind = LexerTokenKind.dot then
_compile_label_declaration()
- elsif token_kind = _lexer_token_kind_identifier() then
+ elsif token_kind = LexerTokenKind.identifier then
current_byte := _lexer_global_get_start();
current_byte := _load_byte(current_byte);
@@ -920,7 +1226,7 @@ begin
_compile_statement();
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_semicolon() then
+ if token_kind = LexerTokenKind.semicolon then
_lexer_skip_token();
_compile_statement_list()
end;
@@ -941,7 +1247,7 @@ begin
end;
proc _type_get_kind(this: Word);
- return _load_word(this)
+ return this^
end;
proc _type_set_kind(this: Word, value: Word);
@@ -1002,14 +1308,14 @@ begin
member_count := 0;
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_right_paren() then
- goto .read_type_enumeration_end
+ if token_kind = LexerTokenKind.right_paren then
+ goto read_type_enumeration_end
end;
.read_type_enumeration_loop;
member_count := member_count + 1;
enumeration_name := _lexer_global_get_start();
- name_length := _lexer_global_get_end() + -enumeration_name;
+ name_length := _lexer_global_get_end() - enumeration_name;
_store_word(enumeration_name, memory_free_pointer);
memory_free_pointer := memory_free_pointer + 4;
@@ -1021,10 +1327,10 @@ begin
_lexer_skip_token();
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_comma() then
+ if token_kind = LexerTokenKind.comma then
_lexer_skip_token();
_lexer_read_token(@token_kind);
- goto .read_type_enumeration_loop
+ goto read_type_enumeration_loop
end;
.read_type_enumeration_end;
@@ -1040,7 +1346,7 @@ begin
_enumeration_type_set_members(result, memory_start);
_enumeration_type_set_length(result, member_count);
- return result
+ return _type_info_create(result)
end;
proc _read_type_expression();
@@ -1053,20 +1359,15 @@ begin
result := 0;
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_identifier() then
+ if token_kind = LexerTokenKind.identifier then
(* Named type. *)
type_name := _lexer_global_get_start();
- name_length := _lexer_global_get_end() + -type_name;
- _write_c('#');
- _write_s(type_name, name_length);
- _write_c(' ');
+ name_length := _lexer_global_get_end() - type_name;
result := _symbol_table_lookup(@symbol_table_global, type_name, name_length);
- _write_i(result);
- _write_c('\n');
result := _type_info_get_type(result);
_lexer_skip_token()
- elsif token_kind = _lexer_token_kind_left_paren() then
+ elsif token_kind = LexerTokenKind.left_paren then
result := _read_type_enumeration()
end;
@@ -1096,7 +1397,7 @@ begin
(* Calculate the stack offset: 88 - (4 * parameter_counter) *)
offset := parameter_index * 4;
- _store_word(88 + -offset, current_word);
+ _store_word(88 - offset, current_word);
memory_free_pointer := current_word + 4;
@@ -1106,7 +1407,25 @@ end;
proc _parameter_info_get_offset(this: Word);
begin
this := this + 4;
- return _load_word(this)
+ return this^
+end;
+
+proc _type_info_create(type_representation: Word);
+var
+ result: Word;
+ current_word: Word;
+begin
+ result := memory_free_pointer;
+ current_word := result;
+ (* 1 is INFO_TYPE *)
+ _store_word(1, current_word);
+
+ current_word := current_word + 4;
+ _store_word(type_representation, current_word);
+
+ memory_free_pointer := current_word + 4;
+
+ return result
end;
(**
@@ -1137,7 +1456,7 @@ end;
proc _temporary_info_get_offset(this: Word);
begin
this := this + 4;
- return _load_word(this)
+ return this^
end;
(**
@@ -1154,7 +1473,7 @@ begin
(* Read the parameter name. *)
_lexer_read_token(@token_kind);
name_position := _lexer_global_get_start();
- name_length := _lexer_global_get_end() + -name_position;
+ name_length := _lexer_global_get_end() - name_position;
_lexer_skip_token();
(* Skip colon and space in front of the type expression. *)
@@ -1189,14 +1508,14 @@ begin
.compile_procedure_prologue_skip;
_lexer_read_token(@token_kind);
- if token_kind <> _lexer_token_kind_right_paren() then
+ if token_kind <> LexerTokenKind.right_paren then
_read_procedure_parameter(parameter_counter);
parameter_counter := parameter_counter + 1;
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_comma() then
+ if token_kind = LexerTokenKind.comma then
_lexer_skip_token();
- goto .compile_procedure_prologue_skip
+ goto compile_procedure_prologue_skip
end
end;
(* Skip close paren. *)
@@ -1216,7 +1535,7 @@ var
begin
_lexer_read_token(@token_kind);
name_position := _lexer_global_get_start();
- name_length := _lexer_global_get_end() + -name_position;
+ name_length := _lexer_global_get_end() - name_position;
_lexer_skip_token();
(* Read and skip variable name, colon and the space *)
@@ -1240,18 +1559,18 @@ var
begin
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_var() then
+ if token_kind = LexerTokenKind._var then
_lexer_skip_token();
temporary_counter := 0;
.read_local_variables_loop;
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_identifier() then
+ if token_kind = LexerTokenKind.identifier then
_read_procedure_temporary(temporary_counter);
temporary_counter := temporary_counter + 1;
- goto .read_local_variables_loop
+ goto read_local_variables_loop
end
end
end;
@@ -1271,7 +1590,7 @@ begin
_lexer_read_token(@token_kind);
name_pointer := _lexer_global_get_start();
- name_length := _lexer_global_get_end() + -name_pointer;
+ name_length := _lexer_global_get_end() - name_pointer;
(* Write .type _procedure_name, @function. *)
_write_z(".type \0");
@@ -1295,10 +1614,10 @@ begin
(* Skip semicolon, "begin" and newline. *)
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_begin() then
+ if token_kind = LexerTokenKind._begin then
_lexer_skip_token();
_compile_statement_list()
- elsif token_kind = _lexer_token_kind_return() then
+ elsif token_kind = LexerTokenKind._return then
_compile_return_statement()
end;
@@ -1323,9 +1642,9 @@ begin
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_comment() then
+ if token_kind = LexerTokenKind.comment then
_lexer_skip_token();
- goto .skip_empty_lines_rerun
+ goto skip_empty_lines_rerun
end
end;
@@ -1343,7 +1662,7 @@ begin
token_start := _lexer_global_get_start();
current_byte := _load_byte(token_start);
- if token_kind = _lexer_token_kind_string() then
+ if token_kind = LexerTokenKind.string then
_write_z("\n\t.word strings + \0");
length := _string_length(token_start);
@@ -1353,7 +1672,7 @@ begin
(* Skip the quoted string. *)
_lexer_skip_token();
- goto .compile_global_initializer_end
+ goto compile_global_initializer_end
elsif current_byte = 'S' then
(* Skip "S(". *)
_lexer_skip_token();
@@ -1361,37 +1680,37 @@ begin
_lexer_skip_token();
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_right_paren() then
- goto .compile_global_initializer_closing
+ if token_kind = LexerTokenKind.right_paren then
+ goto compile_global_initializer_closing
end;
- goto .compile_global_initializer_loop
- elsif token_kind = _lexer_token_kind_at() then
+ goto compile_global_initializer_loop
+ elsif token_kind = LexerTokenKind.at then
(* Skip @. *)
_lexer_skip_token();
_write_z("\n\t.word \0");
_lexer_read_token(@token_kind);
token_start := _lexer_global_get_start();
- _write_s(token_start, _lexer_global_get_end() + -token_start);
+ _write_s(token_start, _lexer_global_get_end() - token_start);
_lexer_skip_token();
- goto .compile_global_initializer_end
- elsif token_kind = _lexer_token_kind_integer() then
+ goto compile_global_initializer_end
+ elsif token_kind = LexerTokenKind.integer then
_write_z("\n\t.word \0");
- _write_s(token_start, _lexer_global_get_end() + -token_start);
+ _write_s(token_start, _lexer_global_get_end() - token_start);
_lexer_skip_token();
- goto .compile_global_initializer_end
+ goto compile_global_initializer_end
end;
.compile_global_initializer_loop;
_compile_global_initializer();
_lexer_read_token(@token_kind);
- if token_kind <> _lexer_token_kind_right_paren() then
+ if token_kind <> LexerTokenKind.right_paren then
(* Skip comma and whitespace after it. *)
_lexer_skip_token();
- goto .compile_global_initializer_loop
+ goto compile_global_initializer_loop
end;
.compile_global_initializer_closing;
@@ -1408,7 +1727,7 @@ var
token_kind: Word;
begin
name := _lexer_global_get_start();
- name_length := _lexer_global_get_end() + -name;
+ name_length := _lexer_global_get_end() - name;
_write_z(".type \0");
_write_s(name, name_length);
@@ -1432,11 +1751,20 @@ end;
proc _compile_type_declaration();
var
token_kind: Word;
+ type_name: Word;
+ name_length: Word;
+ type_info: Word;
begin
+ type_name := _lexer_global_get_start();
+ name_length := _lexer_global_get_end() - type_name;
+
_lexer_skip_token();
_lexer_read_token(@token_kind);
_lexer_skip_token();
- _read_type_expression();
+ type_info := _read_type_expression();
+
+ _symbol_table_enter(@symbol_table_global, type_name, name_length, type_info);
+
_lexer_read_token(@token_kind);
_lexer_skip_token()
end;
@@ -1448,8 +1776,8 @@ begin
_skip_empty_lines();
_lexer_read_token(@token_kind);
- if token_kind <> _lexer_token_kind_type() then
- goto .compile_type_part_end
+ if token_kind <> LexerTokenKind._type then
+ goto compile_type_part_end
end;
_lexer_skip_token();
@@ -1457,9 +1785,9 @@ begin
_skip_empty_lines();
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_identifier() then
+ if token_kind = LexerTokenKind.identifier then
_compile_type_declaration();
- goto .compile_type_part_loop
+ goto compile_type_part_loop
end;
.compile_type_part_end
@@ -1472,8 +1800,8 @@ begin
_skip_empty_lines();
_lexer_read_token(@token_kind);
- if token_kind <> _lexer_token_kind_const() then
- goto .compile_const_part_end
+ if token_kind <> LexerTokenKind._const then
+ goto compile_const_part_end
end;
(* Skip "const" with the newline after it. *)
_lexer_skip_token();
@@ -1485,9 +1813,9 @@ begin
(* If the character at the line beginning is not indentation,
it is probably the next code section. *)
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_identifier() then
+ if token_kind = LexerTokenKind.identifier then
_compile_constant_declaration();
- goto .compile_const_part_loop
+ goto compile_const_part_loop
end;
.compile_const_part_end
@@ -1501,7 +1829,7 @@ var
begin
_lexer_read_token(@token_kind);
name := _lexer_global_get_start();
- name_length := _lexer_global_get_end() + -name;
+ name_length := _lexer_global_get_end() - name;
_write_z(".type \0");
_write_s(name, name_length);
@@ -1518,7 +1846,7 @@ begin
_lexer_read_token(@token_kind);
- if token_kind <> _lexer_token_kind_assignment() then
+ if token_kind <> LexerTokenKind.assignment then
(* Else we assume this is a zeroed 81920 bytes big array. *)
_write_z(" .zero 81920\0")
else
@@ -1540,8 +1868,8 @@ var
begin
_lexer_read_token(@token_kind);
- if token_kind <> _lexer_token_kind_var() then
- goto .compile_var_part_end
+ if token_kind <> LexerTokenKind._var then
+ goto compile_var_part_end
end;
(* Skip "var" and newline. *)
_lexer_skip_token();
@@ -1551,9 +1879,9 @@ begin
_skip_empty_lines();
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_identifier() then
+ if token_kind = LexerTokenKind.identifier then
_compile_variable_declaration();
- goto .compile_var_part_loop
+ goto compile_var_part_loop
end;
.compile_var_part_end
@@ -1582,9 +1910,9 @@ begin
_skip_empty_lines();
_lexer_read_token(@token_kind);
- if token_kind = _lexer_token_kind_proc() then
+ if token_kind = LexerTokenKind._proc then
_compile_procedure();
- goto .compile_module_loop
+ goto compile_module_loop
end
end;
@@ -1609,7 +1937,7 @@ begin
compiler_strings_copy := compiler_strings_copy + 1;
_write_c(current_byte);
- goto .compile_loop
+ goto compile_loop
end;
_write_c('"');
_write_c('\n')
@@ -1646,36 +1974,36 @@ begin
result := 0;
(* The first word in the symbol table is its length, get it. *)
- symbol_table_length := _load_word(symbol_table);
+ symbol_table_length := symbol_table^;
(* Go to the first symbol position. *)
symbol_table := symbol_table + 4;
.symbol_table_lookup_loop;
if symbol_table_length = 0 then
- goto .symbol_table_lookup_end
+ goto symbol_table_lookup_end
end;
(* Symbol name pointer and length. *)
- current_name := _load_word(symbol_table);
+ current_name := symbol_table^;
current_length := _load_word(symbol_table + 4);
(* If lengths don't match, exit and return nil. *)
if name_length <> current_length then
- goto .symbol_table_lookup_repeat
+ goto symbol_table_lookup_repeat
end;
(* If names don't match, exit and return nil. *)
if _memcmp(symbol_name, current_name, name_length) <> 0 then
- goto .symbol_table_lookup_repeat
+ goto symbol_table_lookup_repeat
end;
(* Otherwise, the symbol is found. *)
result := _load_word(symbol_table + 8);
- goto .symbol_table_lookup_end;
+ goto symbol_table_lookup_end;
.symbol_table_lookup_repeat;
symbol_table := symbol_table + 12;
- symbol_table_length := symbol_table_length + -1;
- goto .symbol_table_lookup_loop;
+ symbol_table_length := symbol_table_length - 1;
+ goto symbol_table_lookup_loop;
.symbol_table_lookup_end;
return result
@@ -1696,7 +2024,7 @@ var
symbol_pointer: Word;
begin
(* The first word in the symbol table is its length, get it. *)
- table_length := _load_word(symbol_table);
+ table_length := symbol_table^;
(* Calculate the offset for the new symbol. *)
symbol_pointer := table_length * 12;
@@ -1727,212 +2055,6 @@ begin
_symbol_table_enter(@symbol_table_global, symbol_builtin_name_array, 5, @symbol_type_info_array)
end;
-
-(**
- * Classification table assigns each possible character to a group (class). All
- * characters of the same group a handled equivalently.
- *
- * Transition = record
- * action: TransitionAction;
- * next_state: TransitionState
- * end;
- *)
-proc _lexer_class_invalid();
- return 1
-end;
-
-proc _lexer_class_digit();
- return 2
-end;
-
-proc _lexer_class_alpha();
- return 3
-end;
-
-proc _lexer_class_space();
- return 4
-end;
-
-proc _lexer_class_colon();
- return 5
-end;
-
-proc _lexer_class_equals();
- return 6
-end;
-
-proc _lexer_class_left_paren();
- return 7
-end;
-
-proc _lexer_class_right_paren();
- return 8
-end;
-
-proc _lexer_class_asterisk();
- return 9
-end;
-
-proc _lexer_class_backslash();
- return 10
-end;
-
-proc _lexer_class_single();
- return 11
-end;
-
-proc _lexer_class_hex();
- return 12
-end;
-
-proc _lexer_class_zero();
- return 13
-end;
-
-proc _lexer_class_x();
- return 14
-end;
-
-proc _lexer_class_eof();
- return 15
-end;
-
-proc _lexer_class_dot();
- return 16
-end;
-
-proc _lexer_class_minus();
- return 17
-end;
-
-proc _lexer_class_single_quote();
- return 18
-end;
-
-proc _lexer_class_double_quote();
- return 19
-end;
-
-proc _lexer_class_greater();
- return 20
-end;
-
-proc _lexer_class_less();
- return 21
-end;
-
-proc _lexer_class_other();
- return 22
-end;
-
-proc _lexer_state_start();
- return 1
-end;
-
-proc _lexer_state_colon();
- return 2
-end;
-
-proc _lexer_state_identifier();
- return 3
-end;
-
-proc _lexer_state_decimal();
- return 4
-end;
-
-proc _lexer_state_leading_zero();
- return 5
-end;
-
-proc _lexer_state_greater();
- return 6
-end;
-
-proc _lexer_state_minus();
- return 7
-end;
-
-proc _lexer_state_left_paren();
- return 8
-end;
-
-proc _lexer_state_less();
- return 9
-end;
-
-proc _lexer_state_dot();
- return 10
-end;
-
-proc _lexer_state_comment();
- return 11
-end;
-
-proc _lexer_state_closing_comment();
- return 12
-end;
-
-proc _lexer_state_character();
- return 13
-end;
-
-proc _lexer_state_character_escape();
- return 14
-end;
-
-proc _lexer_state_string();
- return 15
-end;
-
-proc _lexer_state_string_escape();
- return 16
-end;
-
-proc _lexer_state_end();
- return 17
-end;
-
-proc _lexer_action_none();
- return 1
-end;
-
-proc _lexer_action_accumulate();
- return 2
-end;
-
-proc _lexer_action_skip();
- return 3
-end;
-
-proc _lexer_action_single();
- return 4
-end;
-
-proc _lexer_action_eof();
- return 5
-end;
-
-proc _lexer_action_finalize();
- return 6
-end;
-
-proc _lexer_action_composite();
- return 7
-end;
-
-proc _lexer_action_key_id();
- return 8
-end;
-
-proc _lexer_action_integer();
- return 9
-end;
-
-proc _lexer_action_delimited();
- return 10
-end;
-
(**
* Assigns some value to at array index.
*
@@ -1945,7 +2067,7 @@ proc _assign_at(array: Word, index: Word, data: Word);
var
target: Word;
begin
- target := index + -1;
+ target := index - 1;
target := target * 4;
target := array + target;
@@ -1956,11 +2078,11 @@ proc _get_at(array: Word, index: Word);
var
target: Word;
begin
- target := index + -1;
+ target := index - 1;
target := target * 4;
target := array + target;
- return _load_word(target)
+ return target^
end;
(**
@@ -1970,144 +2092,144 @@ proc _lexer_classifications();
var
code: Word;
begin
- _assign_at(@classification, 1, _lexer_class_eof());
- _assign_at(@classification, 2, _lexer_class_invalid());
- _assign_at(@classification, 3, _lexer_class_invalid());
- _assign_at(@classification, 4, _lexer_class_invalid());
- _assign_at(@classification, 5, _lexer_class_invalid());
- _assign_at(@classification, 6, _lexer_class_invalid());
- _assign_at(@classification, 7, _lexer_class_invalid());
- _assign_at(@classification, 8, _lexer_class_invalid());
- _assign_at(@classification, 9, _lexer_class_invalid());
- _assign_at(@classification, 10, _lexer_class_space());
- _assign_at(@classification, 11, _lexer_class_space());
- _assign_at(@classification, 12, _lexer_class_invalid());
- _assign_at(@classification, 13, _lexer_class_invalid());
- _assign_at(@classification, 14, _lexer_class_space());
- _assign_at(@classification, 15, _lexer_class_invalid());
- _assign_at(@classification, 16, _lexer_class_invalid());
- _assign_at(@classification, 17, _lexer_class_invalid());
- _assign_at(@classification, 18, _lexer_class_invalid());
- _assign_at(@classification, 19, _lexer_class_invalid());
- _assign_at(@classification, 20, _lexer_class_invalid());
- _assign_at(@classification, 21, _lexer_class_invalid());
- _assign_at(@classification, 22, _lexer_class_invalid());
- _assign_at(@classification, 23, _lexer_class_invalid());
- _assign_at(@classification, 24, _lexer_class_invalid());
- _assign_at(@classification, 25, _lexer_class_invalid());
- _assign_at(@classification, 26, _lexer_class_invalid());
- _assign_at(@classification, 27, _lexer_class_invalid());
- _assign_at(@classification, 28, _lexer_class_invalid());
- _assign_at(@classification, 29, _lexer_class_invalid());
- _assign_at(@classification, 30, _lexer_class_invalid());
- _assign_at(@classification, 31, _lexer_class_invalid());
- _assign_at(@classification, 32, _lexer_class_invalid());
- _assign_at(@classification, 33, _lexer_class_space());
- _assign_at(@classification, 34, _lexer_class_single());
- _assign_at(@classification, 35, _lexer_class_double_quote());
- _assign_at(@classification, 36, _lexer_class_other());
- _assign_at(@classification, 37, _lexer_class_other());
- _assign_at(@classification, 38, _lexer_class_single());
- _assign_at(@classification, 39, _lexer_class_single());
- _assign_at(@classification, 40, _lexer_class_single_quote());
- _assign_at(@classification, 41, _lexer_class_left_paren());
- _assign_at(@classification, 42, _lexer_class_right_paren());
- _assign_at(@classification, 43, _lexer_class_asterisk());
- _assign_at(@classification, 44, _lexer_class_single());
- _assign_at(@classification, 45, _lexer_class_single());
- _assign_at(@classification, 46, _lexer_class_minus());
- _assign_at(@classification, 47, _lexer_class_dot());
- _assign_at(@classification, 48, _lexer_class_single());
- _assign_at(@classification, 49, _lexer_class_zero());
- _assign_at(@classification, 50, _lexer_class_digit());
- _assign_at(@classification, 51, _lexer_class_digit());
- _assign_at(@classification, 52, _lexer_class_digit());
- _assign_at(@classification, 53, _lexer_class_digit());
- _assign_at(@classification, 54, _lexer_class_digit());
- _assign_at(@classification, 55, _lexer_class_digit());
- _assign_at(@classification, 56, _lexer_class_digit());
- _assign_at(@classification, 57, _lexer_class_digit());
- _assign_at(@classification, 58, _lexer_class_digit());
- _assign_at(@classification, 59, _lexer_class_colon());
- _assign_at(@classification, 60, _lexer_class_single());
- _assign_at(@classification, 61, _lexer_class_less());
- _assign_at(@classification, 62, _lexer_class_equals());
- _assign_at(@classification, 63, _lexer_class_greater());
- _assign_at(@classification, 64, _lexer_class_other());
- _assign_at(@classification, 65, _lexer_class_single());
- _assign_at(@classification, 66, _lexer_class_alpha());
- _assign_at(@classification, 67, _lexer_class_alpha());
- _assign_at(@classification, 68, _lexer_class_alpha());
- _assign_at(@classification, 69, _lexer_class_alpha());
- _assign_at(@classification, 70, _lexer_class_alpha());
- _assign_at(@classification, 71, _lexer_class_alpha());
- _assign_at(@classification, 72, _lexer_class_alpha());
- _assign_at(@classification, 73, _lexer_class_alpha());
- _assign_at(@classification, 74, _lexer_class_alpha());
- _assign_at(@classification, 75, _lexer_class_alpha());
- _assign_at(@classification, 76, _lexer_class_alpha());
- _assign_at(@classification, 77, _lexer_class_alpha());
- _assign_at(@classification, 78, _lexer_class_alpha());
- _assign_at(@classification, 79, _lexer_class_alpha());
- _assign_at(@classification, 80, _lexer_class_alpha());
- _assign_at(@classification, 81, _lexer_class_alpha());
- _assign_at(@classification, 82, _lexer_class_alpha());
- _assign_at(@classification, 83, _lexer_class_alpha());
- _assign_at(@classification, 84, _lexer_class_alpha());
- _assign_at(@classification, 85, _lexer_class_alpha());
- _assign_at(@classification, 86, _lexer_class_alpha());
- _assign_at(@classification, 87, _lexer_class_alpha());
- _assign_at(@classification, 88, _lexer_class_alpha());
- _assign_at(@classification, 89, _lexer_class_alpha());
- _assign_at(@classification, 90, _lexer_class_alpha());
- _assign_at(@classification, 91, _lexer_class_alpha());
- _assign_at(@classification, 92, _lexer_class_single());
- _assign_at(@classification, 93, _lexer_class_backslash());
- _assign_at(@classification, 94, _lexer_class_single());
- _assign_at(@classification, 95, _lexer_class_single());
- _assign_at(@classification, 96, _lexer_class_alpha());
- _assign_at(@classification, 97, _lexer_class_other());
- _assign_at(@classification, 98, _lexer_class_hex());
- _assign_at(@classification, 99, _lexer_class_hex());
- _assign_at(@classification, 100, _lexer_class_hex());
- _assign_at(@classification, 101, _lexer_class_hex());
- _assign_at(@classification, 102, _lexer_class_hex());
- _assign_at(@classification, 103, _lexer_class_hex());
- _assign_at(@classification, 104, _lexer_class_alpha());
- _assign_at(@classification, 105, _lexer_class_alpha());
- _assign_at(@classification, 106, _lexer_class_alpha());
- _assign_at(@classification, 107, _lexer_class_alpha());
- _assign_at(@classification, 108, _lexer_class_alpha());
- _assign_at(@classification, 109, _lexer_class_alpha());
- _assign_at(@classification, 110, _lexer_class_alpha());
- _assign_at(@classification, 111, _lexer_class_alpha());
- _assign_at(@classification, 112, _lexer_class_alpha());
- _assign_at(@classification, 113, _lexer_class_alpha());
- _assign_at(@classification, 114, _lexer_class_alpha());
- _assign_at(@classification, 115, _lexer_class_alpha());
- _assign_at(@classification, 116, _lexer_class_alpha());
- _assign_at(@classification, 117, _lexer_class_alpha());
- _assign_at(@classification, 118, _lexer_class_alpha());
- _assign_at(@classification, 119, _lexer_class_alpha());
- _assign_at(@classification, 120, _lexer_class_alpha());
- _assign_at(@classification, 121, _lexer_class_x());
- _assign_at(@classification, 122, _lexer_class_alpha());
- _assign_at(@classification, 123, _lexer_class_alpha());
- _assign_at(@classification, 124, _lexer_class_other());
- _assign_at(@classification, 125, _lexer_class_single());
- _assign_at(@classification, 126, _lexer_class_other());
- _assign_at(@classification, 127, _lexer_class_single());
- _assign_at(@classification, 128, _lexer_class_invalid());
+ _assign_at(@classification, 1, LexerClass.eof);
+ _assign_at(@classification, 2, LexerClass.invalid);
+ _assign_at(@classification, 3, LexerClass.invalid);
+ _assign_at(@classification, 4, LexerClass.invalid);
+ _assign_at(@classification, 5, LexerClass.invalid);
+ _assign_at(@classification, 6, LexerClass.invalid);
+ _assign_at(@classification, 7, LexerClass.invalid);
+ _assign_at(@classification, 8, LexerClass.invalid);
+ _assign_at(@classification, 9, LexerClass.invalid);
+ _assign_at(@classification, 10, LexerClass.space);
+ _assign_at(@classification, 11, LexerClass.space);
+ _assign_at(@classification, 12, LexerClass.invalid);
+ _assign_at(@classification, 13, LexerClass.invalid);
+ _assign_at(@classification, 14, LexerClass.space);
+ _assign_at(@classification, 15, LexerClass.invalid);
+ _assign_at(@classification, 16, LexerClass.invalid);
+ _assign_at(@classification, 17, LexerClass.invalid);
+ _assign_at(@classification, 18, LexerClass.invalid);
+ _assign_at(@classification, 19, LexerClass.invalid);
+ _assign_at(@classification, 20, LexerClass.invalid);
+ _assign_at(@classification, 21, LexerClass.invalid);
+ _assign_at(@classification, 22, LexerClass.invalid);
+ _assign_at(@classification, 23, LexerClass.invalid);
+ _assign_at(@classification, 24, LexerClass.invalid);
+ _assign_at(@classification, 25, LexerClass.invalid);
+ _assign_at(@classification, 26, LexerClass.invalid);
+ _assign_at(@classification, 27, LexerClass.invalid);
+ _assign_at(@classification, 28, LexerClass.invalid);
+ _assign_at(@classification, 29, LexerClass.invalid);
+ _assign_at(@classification, 30, LexerClass.invalid);
+ _assign_at(@classification, 31, LexerClass.invalid);
+ _assign_at(@classification, 32, LexerClass.invalid);
+ _assign_at(@classification, 33, LexerClass.space);
+ _assign_at(@classification, 34, LexerClass.single);
+ _assign_at(@classification, 35, LexerClass.double_quote);
+ _assign_at(@classification, 36, LexerClass.other);
+ _assign_at(@classification, 37, LexerClass.other);
+ _assign_at(@classification, 38, LexerClass.single);
+ _assign_at(@classification, 39, LexerClass.single);
+ _assign_at(@classification, 40, LexerClass.single_quote);
+ _assign_at(@classification, 41, LexerClass.left_paren);
+ _assign_at(@classification, 42, LexerClass.right_paren);
+ _assign_at(@classification, 43, LexerClass.asterisk);
+ _assign_at(@classification, 44, LexerClass.single);
+ _assign_at(@classification, 45, LexerClass.single);
+ _assign_at(@classification, 46, LexerClass.minus);
+ _assign_at(@classification, 47, LexerClass.dot);
+ _assign_at(@classification, 48, LexerClass.single);
+ _assign_at(@classification, 49, LexerClass.zero);
+ _assign_at(@classification, 50, LexerClass.digit);
+ _assign_at(@classification, 51, LexerClass.digit);
+ _assign_at(@classification, 52, LexerClass.digit);
+ _assign_at(@classification, 53, LexerClass.digit);
+ _assign_at(@classification, 54, LexerClass.digit);
+ _assign_at(@classification, 55, LexerClass.digit);
+ _assign_at(@classification, 56, LexerClass.digit);
+ _assign_at(@classification, 57, LexerClass.digit);
+ _assign_at(@classification, 58, LexerClass.digit);
+ _assign_at(@classification, 59, LexerClass.colon);
+ _assign_at(@classification, 60, LexerClass.single);
+ _assign_at(@classification, 61, LexerClass.less);
+ _assign_at(@classification, 62, LexerClass.equals);
+ _assign_at(@classification, 63, LexerClass.greater);
+ _assign_at(@classification, 64, LexerClass.other);
+ _assign_at(@classification, 65, LexerClass.single);
+ _assign_at(@classification, 66, LexerClass.alpha);
+ _assign_at(@classification, 67, LexerClass.alpha);
+ _assign_at(@classification, 68, LexerClass.alpha);
+ _assign_at(@classification, 69, LexerClass.alpha);
+ _assign_at(@classification, 70, LexerClass.alpha);
+ _assign_at(@classification, 71, LexerClass.alpha);
+ _assign_at(@classification, 72, LexerClass.alpha);
+ _assign_at(@classification, 73, LexerClass.alpha);
+ _assign_at(@classification, 74, LexerClass.alpha);
+ _assign_at(@classification, 75, LexerClass.alpha);
+ _assign_at(@classification, 76, LexerClass.alpha);
+ _assign_at(@classification, 77, LexerClass.alpha);
+ _assign_at(@classification, 78, LexerClass.alpha);
+ _assign_at(@classification, 79, LexerClass.alpha);
+ _assign_at(@classification, 80, LexerClass.alpha);
+ _assign_at(@classification, 81, LexerClass.alpha);
+ _assign_at(@classification, 82, LexerClass.alpha);
+ _assign_at(@classification, 83, LexerClass.alpha);
+ _assign_at(@classification, 84, LexerClass.alpha);
+ _assign_at(@classification, 85, LexerClass.alpha);
+ _assign_at(@classification, 86, LexerClass.alpha);
+ _assign_at(@classification, 87, LexerClass.alpha);
+ _assign_at(@classification, 88, LexerClass.alpha);
+ _assign_at(@classification, 89, LexerClass.alpha);
+ _assign_at(@classification, 90, LexerClass.alpha);
+ _assign_at(@classification, 91, LexerClass.alpha);
+ _assign_at(@classification, 92, LexerClass.single);
+ _assign_at(@classification, 93, LexerClass.backslash);
+ _assign_at(@classification, 94, LexerClass.single);
+ _assign_at(@classification, 95, LexerClass.single);
+ _assign_at(@classification, 96, LexerClass.alpha);
+ _assign_at(@classification, 97, LexerClass.other);
+ _assign_at(@classification, 98, LexerClass.hex);
+ _assign_at(@classification, 99, LexerClass.hex);
+ _assign_at(@classification, 100, LexerClass.hex);
+ _assign_at(@classification, 101, LexerClass.hex);
+ _assign_at(@classification, 102, LexerClass.hex);
+ _assign_at(@classification, 103, LexerClass.hex);
+ _assign_at(@classification, 104, LexerClass.alpha);
+ _assign_at(@classification, 105, LexerClass.alpha);
+ _assign_at(@classification, 106, LexerClass.alpha);
+ _assign_at(@classification, 107, LexerClass.alpha);
+ _assign_at(@classification, 108, LexerClass.alpha);
+ _assign_at(@classification, 109, LexerClass.alpha);
+ _assign_at(@classification, 110, LexerClass.alpha);
+ _assign_at(@classification, 111, LexerClass.alpha);
+ _assign_at(@classification, 112, LexerClass.alpha);
+ _assign_at(@classification, 113, LexerClass.alpha);
+ _assign_at(@classification, 114, LexerClass.alpha);
+ _assign_at(@classification, 115, LexerClass.alpha);
+ _assign_at(@classification, 116, LexerClass.alpha);
+ _assign_at(@classification, 117, LexerClass.alpha);
+ _assign_at(@classification, 118, LexerClass.alpha);
+ _assign_at(@classification, 119, LexerClass.alpha);
+ _assign_at(@classification, 120, LexerClass.alpha);
+ _assign_at(@classification, 121, LexerClass.x);
+ _assign_at(@classification, 122, LexerClass.alpha);
+ _assign_at(@classification, 123, LexerClass.alpha);
+ _assign_at(@classification, 124, LexerClass.other);
+ _assign_at(@classification, 125, LexerClass.single);
+ _assign_at(@classification, 126, LexerClass.other);
+ _assign_at(@classification, 127, LexerClass.single);
+ _assign_at(@classification, 128, LexerClass.invalid);
code := 129;
(* Set the remaining 129 - 256 bytes to transitionClassOther. *)
.create_classification_loop;
- _assign_at(@classification, code, _lexer_class_other());
+ _assign_at(@classification, code, LexerClass.other);
code := code + 1;
if code < 257 then
- goto .create_classification_loop
+ goto create_classification_loop
end
end;
@@ -2120,10 +2242,10 @@ var
begin
(* Each state is 8 bytes long (2 words: action and next state).
There are 22 character classes, so a transition row 8 * 22 = 176 bytes long. *)
- row_position := current_state + -1;
+ row_position := current_state - 1;
row_position := row_position * 176;
- column_position := character_class + -1;
+ column_position := character_class - 1;
column_position := column_position * 8;
target := _lexer_get_transition_table() + row_position;
@@ -2158,28 +2280,28 @@ end;
*)
proc _lexer_default_transition(current_state: Word, default_action: Word, next_state: Word);
begin
- _lexer_set_transition(current_state, _lexer_class_invalid(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_digit(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_alpha(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_space(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_colon(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_equals(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_left_paren(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_right_paren(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_asterisk(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_backslash(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_single(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_hex(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_zero(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_x(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_eof(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_dot(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_minus(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_single_quote(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_double_quote(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_greater(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_less(), default_action, next_state);
- _lexer_set_transition(current_state, _lexer_class_other(), default_action, next_state)
+ _lexer_set_transition(current_state, LexerClass.invalid, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.digit, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.alpha, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.space, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.colon, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.equals, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.left_paren, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.right_paren, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.asterisk, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.backslash, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.single, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.hex, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.zero, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.x, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.eof, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.dot, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.minus, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.single_quote, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.double_quote, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.greater, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.less, default_action, next_state);
+ _lexer_set_transition(current_state, LexerClass.other, default_action, next_state)
end;
(**
@@ -2193,113 +2315,113 @@ end;
proc _lexer_transitions();
begin
(* Start state. *)
- _lexer_set_transition(_lexer_state_start(), _lexer_class_invalid(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_digit(), _lexer_action_accumulate(), _lexer_state_decimal());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_alpha(), _lexer_action_accumulate(), _lexer_state_identifier());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_space(), _lexer_action_skip(), _lexer_state_start());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_colon(), _lexer_action_accumulate(), _lexer_state_colon());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_equals(), _lexer_action_single(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_left_paren(), _lexer_action_accumulate(), _lexer_state_left_paren());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_right_paren(), _lexer_action_single(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_asterisk(), _lexer_action_single(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_backslash(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_single(), _lexer_action_single(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_hex(), _lexer_action_accumulate(), _lexer_state_identifier());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_zero(), _lexer_action_accumulate(), _lexer_state_leading_zero());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_x(), _lexer_action_accumulate(), _lexer_state_identifier());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_eof(), _lexer_action_eof(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_dot(), _lexer_action_single(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_minus(), _lexer_action_accumulate(), _lexer_state_minus());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_single_quote(), _lexer_action_accumulate(), _lexer_state_character());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_double_quote(), _lexer_action_accumulate(), _lexer_state_string());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_greater(), _lexer_action_accumulate(), _lexer_state_greater());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_less(), _lexer_action_accumulate(), _lexer_state_less());
- _lexer_set_transition(_lexer_state_start(), _lexer_class_other(), _lexer_action_none(), _lexer_state_end());
+ _lexer_set_transition(LexerState.start, LexerClass.invalid, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.start, LexerClass.digit, LexerAction.accumulate, LexerState.decimal);
+ _lexer_set_transition(LexerState.start, LexerClass.alpha, LexerAction.accumulate, LexerState.identifier);
+ _lexer_set_transition(LexerState.start, LexerClass.space, LexerAction.skip, LexerState.start);
+ _lexer_set_transition(LexerState.start, LexerClass.colon, LexerAction.accumulate, LexerState.colon);
+ _lexer_set_transition(LexerState.start, LexerClass.equals, LexerAction.single, LexerState.finish);
+ _lexer_set_transition(LexerState.start, LexerClass.left_paren, LexerAction.accumulate, LexerState.left_paren);
+ _lexer_set_transition(LexerState.start, LexerClass.right_paren, LexerAction.single, LexerState.finish);
+ _lexer_set_transition(LexerState.start, LexerClass.asterisk, LexerAction.single, LexerState.finish);
+ _lexer_set_transition(LexerState.start, LexerClass.backslash, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.start, LexerClass.single, LexerAction.single, LexerState.finish);
+ _lexer_set_transition(LexerState.start, LexerClass.hex, LexerAction.accumulate, LexerState.identifier);
+ _lexer_set_transition(LexerState.start, LexerClass.zero, LexerAction.accumulate, LexerState.leading_zero);
+ _lexer_set_transition(LexerState.start, LexerClass.x, LexerAction.accumulate, LexerState.identifier);
+ _lexer_set_transition(LexerState.start, LexerClass.eof, LexerAction.eof, LexerState.finish);
+ _lexer_set_transition(LexerState.start, LexerClass.dot, LexerAction.single, LexerState.finish);
+ _lexer_set_transition(LexerState.start, LexerClass.minus, LexerAction.accumulate, LexerState.minus);
+ _lexer_set_transition(LexerState.start, LexerClass.single_quote, LexerAction.accumulate, LexerState.character);
+ _lexer_set_transition(LexerState.start, LexerClass.double_quote, LexerAction.accumulate, LexerState.string);
+ _lexer_set_transition(LexerState.start, LexerClass.greater, LexerAction.accumulate, LexerState.greater);
+ _lexer_set_transition(LexerState.start, LexerClass.less, LexerAction.accumulate, LexerState.less);
+ _lexer_set_transition(LexerState.start, LexerClass.other, LexerAction.none, LexerState.finish);
(* Colon state. *)
- _lexer_default_transition(_lexer_state_colon(), _lexer_action_finalize(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_colon(), _lexer_class_equals(), _lexer_action_composite(), _lexer_state_end());
+ _lexer_default_transition(LexerState.colon, LexerAction.finalize, LexerState.finish);
+ _lexer_set_transition(LexerState.colon, LexerClass.equals, LexerAction.composite, LexerState.finish);
(* Identifier state. *)
- _lexer_default_transition(_lexer_state_identifier(), _lexer_action_key_id(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_identifier(), _lexer_class_digit(), _lexer_action_accumulate(), _lexer_state_identifier());
- _lexer_set_transition(_lexer_state_identifier(), _lexer_class_alpha(), _lexer_action_accumulate(), _lexer_state_identifier());
- _lexer_set_transition(_lexer_state_identifier(), _lexer_class_hex(), _lexer_action_accumulate(), _lexer_state_identifier());
- _lexer_set_transition(_lexer_state_identifier(), _lexer_class_zero(), _lexer_action_accumulate(), _lexer_state_identifier());
- _lexer_set_transition(_lexer_state_identifier(), _lexer_class_x(), _lexer_action_accumulate(), _lexer_state_identifier());
+ _lexer_default_transition(LexerState.identifier, LexerAction.key_id, LexerState.finish);
+ _lexer_set_transition(LexerState.identifier, LexerClass.digit, LexerAction.accumulate, LexerState.identifier);
+ _lexer_set_transition(LexerState.identifier, LexerClass.alpha, LexerAction.accumulate, LexerState.identifier);
+ _lexer_set_transition(LexerState.identifier, LexerClass.hex, LexerAction.accumulate, LexerState.identifier);
+ _lexer_set_transition(LexerState.identifier, LexerClass.zero, LexerAction.accumulate, LexerState.identifier);
+ _lexer_set_transition(LexerState.identifier, LexerClass.x, LexerAction.accumulate, LexerState.identifier);
(* Decimal state. *)
- _lexer_default_transition(_lexer_state_decimal(), _lexer_action_integer(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_decimal(), _lexer_class_digit(), _lexer_action_accumulate(), _lexer_state_decimal());
- _lexer_set_transition(_lexer_state_decimal(), _lexer_class_alpha(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_decimal(), _lexer_class_hex(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_decimal(), _lexer_class_zero(), _lexer_action_accumulate(), _lexer_state_decimal());
- _lexer_set_transition(_lexer_state_decimal(), _lexer_class_x(), _lexer_action_none(), _lexer_state_end());
+ _lexer_default_transition(LexerState.decimal, LexerAction.integer, LexerState.finish);
+ _lexer_set_transition(LexerState.decimal, LexerClass.digit, LexerAction.accumulate, LexerState.decimal);
+ _lexer_set_transition(LexerState.decimal, LexerClass.alpha, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.decimal, LexerClass.hex, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.decimal, LexerClass.zero, LexerAction.accumulate, LexerState.decimal);
+ _lexer_set_transition(LexerState.decimal, LexerClass.x, LexerAction.none, LexerState.finish);
(* Leading zero. *)
- _lexer_default_transition(_lexer_state_leading_zero(), _lexer_action_integer(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_leading_zero(), _lexer_class_digit(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_leading_zero(), _lexer_class_alpha(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_leading_zero(), _lexer_class_hex(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_leading_zero(), _lexer_class_zero(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_leading_zero(), _lexer_class_x(), _lexer_action_none(), _lexer_state_dot());
+ _lexer_default_transition(LexerState.leading_zero, LexerAction.integer, LexerState.finish);
+ _lexer_set_transition(LexerState.leading_zero, LexerClass.digit, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.leading_zero, LexerClass.alpha, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.leading_zero, LexerClass.hex, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.leading_zero, LexerClass.zero, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.leading_zero, LexerClass.x, LexerAction.none, LexerState.dot);
(* Greater state. *)
- _lexer_default_transition(_lexer_state_greater(), _lexer_action_finalize(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_greater(), _lexer_class_equals(), _lexer_action_composite(), _lexer_state_end());
+ _lexer_default_transition(LexerState.greater, LexerAction.finalize, LexerState.finish);
+ _lexer_set_transition(LexerState.greater, LexerClass.equals, LexerAction.composite, LexerState.finish);
(* Minus state. *)
- _lexer_default_transition(_lexer_state_minus(), _lexer_action_finalize(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_minus(), _lexer_class_greater(), _lexer_action_composite(), _lexer_state_end());
+ _lexer_default_transition(LexerState.minus, LexerAction.finalize, LexerState.finish);
+ _lexer_set_transition(LexerState.minus, LexerClass.greater, LexerAction.composite, LexerState.finish);
(* Left paren state. *)
- _lexer_default_transition(_lexer_state_left_paren(), _lexer_action_finalize(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_left_paren(), _lexer_class_asterisk(), _lexer_action_accumulate(), _lexer_state_comment());
+ _lexer_default_transition(LexerState.left_paren, LexerAction.finalize, LexerState.finish);
+ _lexer_set_transition(LexerState.left_paren, LexerClass.asterisk, LexerAction.accumulate, LexerState.comment);
(* Less state. *)
- _lexer_default_transition(_lexer_state_less(), _lexer_action_finalize(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_less(), _lexer_class_equals(), _lexer_action_composite(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_less(), _lexer_class_greater(), _lexer_action_composite(), _lexer_state_end());
+ _lexer_default_transition(LexerState.less, LexerAction.finalize, LexerState.finish);
+ _lexer_set_transition(LexerState.less, LexerClass.equals, LexerAction.composite, LexerState.finish);
+ _lexer_set_transition(LexerState.less, LexerClass.greater, LexerAction.composite, LexerState.finish);
(* Hexadecimal after 0x. *)
- _lexer_default_transition(_lexer_state_dot(), _lexer_action_finalize(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_dot(), _lexer_class_dot(), _lexer_action_composite(), _lexer_state_end());
+ _lexer_default_transition(LexerState.dot, LexerAction.finalize, LexerState.finish);
+ _lexer_set_transition(LexerState.dot, LexerClass.dot, LexerAction.composite, LexerState.finish);
(* Comment. *)
- _lexer_default_transition(_lexer_state_comment(), _lexer_action_accumulate(), _lexer_state_comment());
- _lexer_set_transition(_lexer_state_comment(), _lexer_class_asterisk(), _lexer_action_accumulate(), _lexer_state_closing_comment());
- _lexer_set_transition(_lexer_state_comment(), _lexer_class_eof(), _lexer_action_none(), _lexer_state_end());
+ _lexer_default_transition(LexerState.comment, LexerAction.accumulate, LexerState.comment);
+ _lexer_set_transition(LexerState.comment, LexerClass.asterisk, LexerAction.accumulate, LexerState.closing_comment);
+ _lexer_set_transition(LexerState.comment, LexerClass.eof, LexerAction.none, LexerState.finish);
(* Closing comment. *)
- _lexer_default_transition(_lexer_state_closing_comment(), _lexer_action_accumulate(), _lexer_state_comment());
- _lexer_set_transition(_lexer_state_closing_comment(), _lexer_class_invalid(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_closing_comment(), _lexer_class_right_paren(), _lexer_action_delimited(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_closing_comment(), _lexer_class_asterisk(), _lexer_action_accumulate(), _lexer_state_closing_comment());
- _lexer_set_transition(_lexer_state_closing_comment(), _lexer_class_eof(), _lexer_action_none(), _lexer_state_end());
+ _lexer_default_transition(LexerState.closing_comment, LexerAction.accumulate, LexerState.comment);
+ _lexer_set_transition(LexerState.closing_comment, LexerClass.invalid, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.closing_comment, LexerClass.right_paren, LexerAction.delimited, LexerState.finish);
+ _lexer_set_transition(LexerState.closing_comment, LexerClass.asterisk, LexerAction.accumulate, LexerState.closing_comment);
+ _lexer_set_transition(LexerState.closing_comment, LexerClass.eof, LexerAction.none, LexerState.finish);
(* Character. *)
- _lexer_default_transition(_lexer_state_character(), _lexer_action_accumulate(), _lexer_state_character());
- _lexer_set_transition(_lexer_state_character(), _lexer_class_invalid(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_character(), _lexer_class_eof(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_character(), _lexer_class_single_quote(), _lexer_action_delimited(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_character(), _lexer_class_backslash(), _lexer_action_accumulate(), _lexer_state_character_escape());
+ _lexer_default_transition(LexerState.character, LexerAction.accumulate, LexerState.character);
+ _lexer_set_transition(LexerState.character, LexerClass.invalid, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.character, LexerClass.eof, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.character, LexerClass.single_quote, LexerAction.delimited, LexerState.finish);
+ _lexer_set_transition(LexerState.character, LexerClass.backslash, LexerAction.accumulate, LexerState.character_escape);
(* Escape sequence in a character. *)
- _lexer_default_transition(_lexer_state_character_escape(), _lexer_action_accumulate(), _lexer_state_character());
- _lexer_set_transition(_lexer_state_character_escape(), _lexer_class_invalid(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_character_escape(), _lexer_class_eof(), _lexer_action_none(), _lexer_state_end());
+ _lexer_default_transition(LexerState.character_escape, LexerAction.accumulate, LexerState.character);
+ _lexer_set_transition(LexerState.character_escape, LexerClass.invalid, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.character_escape, LexerClass.eof, LexerAction.none, LexerState.finish);
(* String. *)
- _lexer_default_transition(_lexer_state_string(), _lexer_action_accumulate(), _lexer_state_string());
- _lexer_set_transition(_lexer_state_string(), _lexer_class_invalid(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_string(), _lexer_class_eof(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_string(), _lexer_class_double_quote(), _lexer_action_delimited(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_string(), _lexer_class_backslash(), _lexer_action_accumulate(), _lexer_state_string_escape());
+ _lexer_default_transition(LexerState.string, LexerAction.accumulate, LexerState.string);
+ _lexer_set_transition(LexerState.string, LexerClass.invalid, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.string, LexerClass.eof, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.string, LexerClass.double_quote, LexerAction.delimited, LexerState.finish);
+ _lexer_set_transition(LexerState.string, LexerClass.backslash, LexerAction.accumulate, LexerState.string_escape);
(* Escape sequence in a string. *)
- _lexer_default_transition(_lexer_state_string_escape(), _lexer_action_accumulate(), _lexer_state_string());
- _lexer_set_transition(_lexer_state_string_escape(), _lexer_class_invalid(), _lexer_action_none(), _lexer_state_end());
- _lexer_set_transition(_lexer_state_string_escape(), _lexer_class_eof(), _lexer_action_none(), _lexer_state_end())
+ _lexer_default_transition(LexerState.string_escape, LexerAction.accumulate, LexerState.string);
+ _lexer_set_transition(LexerState.string_escape, LexerClass.invalid, LexerAction.none, LexerState.finish);
+ _lexer_set_transition(LexerState.string_escape, LexerClass.eof, LexerAction.none, LexerState.finish)
end;
(**
@@ -2328,7 +2450,7 @@ var
target: Word;
begin
target := _lexer_global_state() + 4;
- return _load_word(target)
+ return target^
end;
(**
@@ -2350,7 +2472,7 @@ var
target: Word;
begin
target := _lexer_global_state() + 8;
- return _load_word(target)
+ return target^
end;
(**
@@ -2365,7 +2487,7 @@ begin
end;
proc _lexer_transition_get_action(transition: Word);
- return _load_word(transition)
+ return transition^
end;
proc _lexer_transition_set_action(transition: Word, action: Word);
@@ -2391,7 +2513,7 @@ var
begin
(* Transition start state is 1. *)
state := _lexer_global_state();
- _store_word(_lexer_state_start(), state);
+ _store_word(LexerState.start, state);
state := _lexer_global_get_start();
_lexer_global_set_end(state)
@@ -2421,271 +2543,11 @@ begin
character_class := _get_at(@classification, current_character + 1);
current_state := _lexer_global_state();
- current_state := _load_word(current_state);
+ current_state := current_state^;
return _lexer_get_transition(current_state, character_class)
end;
-proc _lexer_token_kind_identifier();
- return 1
-end;
-
-proc _lexer_token_kind_const();
- return 2
-end;
-
-proc _lexer_token_kind_var();
- return 3
-end;
-
-proc _lexer_token_kind_proc();
- return 4
-end;
-
-proc _lexer_token_kind_type();
- return 5
-end;
-
-proc _lexer_token_kind_begin();
- return 6
-end;
-
-proc _lexer_token_kind_end();
- return 7
-end;
-
-proc _lexer_token_kind_if();
- return 8
-end;
-
-proc _lexer_token_kind_then();
- return 9
-end;
-
-proc _lexer_token_kind_else();
- return 10
-end;
-
-proc _lexer_token_kind_elsif();
- return 11
-end;
-
-proc _lexer_token_kind_while();
- return 12
-end;
-
-proc _lexer_token_kind_do();
- return 13
-end;
-
-proc _lexer_token_kind_extern();
- return 14
-end;
-
-proc _lexer_token_kind_record();
- return 15
-end;
-
-proc _lexer_token_kind_union();
- return 16
-end;
-
-proc _lexer_token_kind_true();
- return 17
-end;
-
-proc _lexer_token_kind_false();
- return 18
-end;
-
-proc _lexer_token_kind_nil();
- return 19
-end;
-
-proc _lexer_token_kind_and();
- return 20
-end;
-
-proc _lexer_token_kind_or();
- return 21
-end;
-
-proc _lexer_token_kind_xor();
- return 22
-end;
-
-proc _lexer_token_kind_pipe();
- return 23
-end;
-
-proc _lexer_token_kind_not();
- return 24
-end;
-
-proc _lexer_token_kind_return();
- return 24
-end;
-
-proc _lexer_token_kind_module();
- return 25
-end;
-
-proc _lexer_token_kind_program();
- return 26
-end;
-
-proc _lexer_token_kind_import();
- return 27
-end;
-
-proc _lexer_token_kind_cast();
- return 28
-end;
-
-proc _lexer_token_kind_defer();
- return 29
-end;
-
-proc _lexer_token_kind_case();
- return 30
-end;
-
-proc _lexer_token_kind_of();
- return 31
-end;
-
-proc _lexer_token_kind_trait();
- return 32
-end;
-
-proc _lexer_token_kind_left_paren();
- return 33
-end;
-
-proc _lexer_token_kind_right_paren();
- return 34
-end;
-
-proc _lexer_token_kind_left_square();
- return 35
-end;
-
-proc _lexer_token_kind_right_square();
- return 36
-end;
-
-proc _lexer_token_kind_shift_left();
- return 37
-end;
-
-proc _lexer_token_kind_shift_right();
- return 38
-end;
-
-proc _lexer_token_kind_greater_equal();
- return 39
-end;
-
-proc _lexer_token_kind_less_equal();
- return 40
-end;
-
-proc _lexer_token_kind_greater_than();
- return 41
-end;
-
-proc _lexer_token_kind_less_than();
- return 42
-end;
-
-proc _lexer_token_kind_not_equal();
- return 43
-end;
-
-proc _lexer_token_kind_equals();
- return 44
-end;
-
-proc _lexer_token_kind_semicolon();
- return 45
-end;
-
-proc _lexer_token_kind_dot();
- return 46
-end;
-
-proc _lexer_token_kind_comma();
- return 47
-end;
-
-proc _lexer_token_kind_plus();
- return 48
-end;
-
-proc _lexer_token_kind_arrow();
- return 49
-end;
-
-proc _lexer_token_kind_minus();
- return 50
-end;
-
-proc _lexer_token_kind_multiplication();
- return 51
-end;
-
-proc _lexer_token_kind_division();
- return 52
-end;
-
-proc _lexer_token_kind_remainder();
- return 53
-end;
-
-proc _lexer_token_kind_assignment();
- return 54
-end;
-
-proc _lexer_token_kind_colon();
- return 55
-end;
-
-proc _lexer_token_kind_hat();
- return 56
-end;
-
-proc _lexer_token_kind_at();
- return 57
-end;
-
-proc _lexer_token_kind_comment();
- return 58
-end;
-
-proc _lexer_token_kind_string();
- return 59
-end;
-
-proc _lexer_token_kind_character();
- return 60
-end;
-
-proc _lexer_token_kind_integer();
- return 61
-end;
-
-proc _lexer_token_kind_word();
- return 62
-end;
-
-proc _lexer_token_kind_goto();
- return 63
-end;
-
-proc _lexer_token_kind_eof();
- return 64
-end;
-
proc _lexer_compare_keyword(lhs_pointer: Word, lhs_length: Word, rhs_pointer: Word, rhs_length: Word);
var
result: Word;
@@ -2703,39 +2565,39 @@ var
result: Word;
token_length: Word;
begin
- result := _lexer_token_kind_identifier();
- token_length := position_end + -position_start;
+ result := LexerTokenKind.identifier;
+ token_length := position_end - position_start;
if _lexer_compare_keyword(position_start, token_length, "const", 5) = 1 then
- result := _lexer_token_kind_const()
+ result := LexerTokenKind._const
elsif _lexer_compare_keyword(position_start, token_length, "var", 3) = 1 then
- result := _lexer_token_kind_var()
+ result := LexerTokenKind._var
elsif _lexer_compare_keyword(position_start, token_length, "proc", 4) = 1 then
- result := _lexer_token_kind_proc()
+ result := LexerTokenKind._proc
elsif _lexer_compare_keyword(position_start, token_length, "type", 4) = 1 then
- result := _lexer_token_kind_type()
+ result := LexerTokenKind._type
elsif _lexer_compare_keyword(position_start, token_length, "begin", 5) = 1 then
- result := _lexer_token_kind_begin()
+ result := LexerTokenKind._begin
elsif _lexer_compare_keyword(position_start, token_length, "end", 3) = 1 then
- result := _lexer_token_kind_end()
+ result := LexerTokenKind._end
elsif _lexer_compare_keyword(position_start, token_length, "return", 6) = 1 then
- result := _lexer_token_kind_return()
+ result := LexerTokenKind._return
elsif _lexer_compare_keyword(position_start, token_length, "goto", 4) = 1 then
- result := _lexer_token_kind_goto()
+ result := LexerTokenKind._goto
elsif _lexer_compare_keyword(position_start, token_length, "if", 2) = 1 then
- result := _lexer_token_kind_if()
+ result := LexerTokenKind._if
elsif _lexer_compare_keyword(position_start, token_length, "while", 5) = 1 then
- result := _lexer_token_kind_while()
+ result := LexerTokenKind._while
elsif _lexer_compare_keyword(position_start, token_length, "then", 4) = 1 then
- result := _lexer_token_kind_then()
+ result := LexerTokenKind._then
elsif _lexer_compare_keyword(position_start, token_length, "else", 4) = 1 then
- result := _lexer_token_kind_else()
+ result := LexerTokenKind._else
elsif _lexer_compare_keyword(position_start, token_length, "elsif", 5) = 1 then
- result := _lexer_token_kind_elsif()
+ result := LexerTokenKind._elsif
elsif _lexer_compare_keyword(position_start, token_length, "or", 2) = 1 then
- result := _lexer_token_kind_or()
+ result := LexerTokenKind._or
elsif _lexer_compare_keyword(position_start, token_length, "xor", 2) = 1 then
- result := _lexer_token_kind_xor()
+ result := LexerTokenKind._xor
end;
return result
end;
@@ -2749,17 +2611,17 @@ begin
character := _load_byte(start_position);
if character = ':' then
- result := _lexer_token_kind_colon()
+ result := LexerTokenKind.colon
elsif character = '.' then
- result := _lexer_token_kind_dot()
+ result := LexerTokenKind.dot
elsif character = '(' then
- result := _lexer_token_kind_left_paren()
+ result := LexerTokenKind.left_paren
elsif character = '-' then
- result := _lexer_token_kind_minus()
+ result := LexerTokenKind.minus
elsif character = '<' then
- result := _lexer_token_kind_less_than()
+ result := LexerTokenKind.less_than
elsif character = '>' then
- result := _lexer_token_kind_greater_than()
+ result := LexerTokenKind.greater_than
end;
return result
end;
@@ -2773,31 +2635,31 @@ begin
character := _load_byte(start_position);
if character = ';' then
- result := _lexer_token_kind_semicolon()
+ result := LexerTokenKind.semicolon
elsif character = ',' then
- result := _lexer_token_kind_comma()
+ result := LexerTokenKind.comma
elsif character = ')' then
- result := _lexer_token_kind_right_paren()
+ result := LexerTokenKind.right_paren
elsif character = '@' then
- result := _lexer_token_kind_at()
+ result := LexerTokenKind.at
elsif character = '~' then
- result := _lexer_token_kind_not()
+ result := LexerTokenKind.not
elsif character = '&' then
- result := _lexer_token_kind_and()
+ result := LexerTokenKind.and
elsif character = '+' then
- result := _lexer_token_kind_plus()
+ result := LexerTokenKind.plus
elsif character = '*' then
- result := _lexer_token_kind_multiplication()
+ result := LexerTokenKind.multiplication
elsif character = '=' then
- result := _lexer_token_kind_equals()
+ result := LexerTokenKind.equals
elsif character = '%' then
- result := _lexer_token_kind_remainder()
+ result := LexerTokenKind.remainder
elsif character = '/' then
- result := _lexer_token_kind_division()
+ result := LexerTokenKind.division
elsif character = '.' then
- result := _lexer_token_kind_dot()
+ result := LexerTokenKind.dot
elsif character = '^' then
- result := _lexer_token_kind_hat()
+ result := LexerTokenKind.hat
end;
return result
end;
@@ -2812,16 +2674,16 @@ begin
last_character := _load_byte(one_before_last);
if first_character = ':' then
- result := _lexer_token_kind_assignment()
+ result := LexerTokenKind.assignment
elsif first_character = '<' then
if last_character = '=' then
- result := _lexer_token_kind_less_equal()
+ result := LexerTokenKind.less_equal
elsif last_character = '>' then
- result := _lexer_token_kind_not_equal()
+ result := LexerTokenKind.not_equal
end
elsif first_character = '>' then
if last_character = '=' then
- result := _lexer_token_kind_greater_equal()
+ result := LexerTokenKind.greater_equal
end
end;
@@ -2834,22 +2696,22 @@ var
delimiter: Word;
result: Word;
begin
- token_length := end_position + -start_position;
+ token_length := end_position - start_position;
delimiter := _load_byte(start_position);
if delimiter = '(' then
- result := _lexer_token_kind_comment()
+ result := LexerTokenKind.comment
elsif delimiter = '\'' then
- result := _lexer_token_kind_character()
+ result := LexerTokenKind.character
elsif delimiter = '"' then
- result := _lexer_token_kind_string()
+ result := LexerTokenKind.string
end;
return result
end;
proc _lexer_classify_integer(start_position: Word, end_position: Word);
begin
- return _lexer_token_kind_integer()
+ return LexerTokenKind.integer
end;
proc _lexer_execute_action(action_to_perform: Word, kind: Word);
@@ -2861,35 +2723,35 @@ begin
position_start := _lexer_global_get_start();
position_end := _lexer_global_get_end();
- if action_to_perform = _lexer_action_none() then
- elsif action_to_perform = _lexer_action_accumulate() then
+ if action_to_perform = LexerAction.none then
+ elsif action_to_perform = LexerAction.accumulate then
_lexer_global_set_end(position_end + 1)
- elsif action_to_perform = _lexer_action_skip() then
+ elsif action_to_perform = LexerAction.skip then
_lexer_global_set_start(position_start + 1);
_lexer_global_set_end(position_end + 1)
- elsif action_to_perform = _lexer_action_single() then
+ elsif action_to_perform = LexerAction.single then
_lexer_global_set_end(position_end + 1);
intermediate := _lexer_classify_single(position_start);
_store_word(intermediate, kind)
- elsif action_to_perform = _lexer_action_eof() then
- intermediate := _lexer_token_kind_eof();
+ elsif action_to_perform = LexerAction.eof then
+ intermediate := LexerTokenKind.eof;
_store_word(intermediate, kind)
- elsif action_to_perform = _lexer_action_finalize() then
+ elsif action_to_perform = LexerAction.finalize then
intermediate := _lexer_classify_finalize(position_start);
_store_word(intermediate, kind)
- elsif action_to_perform = _lexer_action_composite() then
+ elsif action_to_perform = LexerAction.composite then
_lexer_global_set_end(position_end + 1);
intermediate := _lexer_classify_composite(position_start, position_end);
_store_word(intermediate, kind)
- elsif action_to_perform = _lexer_action_key_id() then
+ elsif action_to_perform = LexerAction.key_id then
intermediate := _lexer_classify_keyword(position_start, position_end);
_store_word(intermediate, kind)
- elsif action_to_perform = _lexer_action_integer() then
+ elsif action_to_perform = LexerAction.integer then
intermediate := _lexer_classify_integer(position_start, position_end);
_store_word(intermediate, kind)
- elsif action_to_perform = _lexer_action_delimited() then
+ elsif action_to_perform = LexerAction.delimited then
_lexer_global_set_end(position_end + 1);
intermediate := _lexer_classify_delimited(position_start, position_end + 1);
@@ -2918,7 +2780,7 @@ end;
proc _lexer_advance_token(kind: Word);
begin
- if _lexer_execute_transition(kind) <> _lexer_state_end() then
+ if _lexer_execute_transition(kind) <> LexerState.finish then
_lexer_advance_token(kind)
end
end;
@@ -2962,7 +2824,7 @@ begin
last_read := _read_file(offset, 81920);
if last_read > 0 then
offset := offset + last_read;
- goto .start_read
+ goto start_read
end;
_compile();