summaryrefslogtreecommitdiff
path: root/boot
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2025-10-08 12:06:07 +0200
committerEugen Wissner <belka@caraus.de>2025-10-10 13:53:54 +0200
commitc6531ba3988d297e08ffa543686d68455b00b26d (patch)
tree06eb6c8e9c43476ede4beee7123ed35ae1e62e20 /boot
parentaf9ad5b712003b41a981beafe519275b14d6c159 (diff)
downloadelna-c6531ba3988d297e08ffa543686d68455b00b26d.tar.gz
Extract simple expression parser
Diffstat (limited to 'boot')
-rw-r--r--boot/stage14.elna6
-rw-r--r--boot/stage15.elna589
2 files changed, 452 insertions, 143 deletions
diff --git a/boot/stage14.elna b/boot/stage14.elna
index ecb9347..9a6e18b 100644
--- a/boot/stage14.elna
+++ b/boot/stage14.elna
@@ -1598,8 +1598,8 @@ begin
_lexer_read_token(@token_kind);
if token_kind <> _lexer_token_kind_assignment() then
- (* Else we assume this is a zeroed 81920 bytes big array. *)
- _write_z(" .zero 81920\0")
+ (* Else we assume this is a zeroed 102400 bytes big array. *)
+ _write_z(" .zero 102400\0")
else
(* Skip the assignment sign with surrounding whitespaces. *)
_lexer_skip_token();
@@ -3038,7 +3038,7 @@ begin
.start_read;
(* Second argument is buffer size. Modifying update the source_code definition. *)
- last_read := _read_file(offset, 81920);
+ last_read := _read_file(offset, 102400);
if last_read > 0 then
offset := offset + last_read;
goto .start_read
diff --git a/boot/stage15.elna b/boot/stage15.elna
index 6200fbd..3d05d1b 100644
--- a/boot/stage15.elna
+++ b/boot/stage15.elna
@@ -128,10 +128,14 @@ type
_goto,
eof
);
- NodeKind := (
+ NodeKind = (
integer_literal,
string_literal,
- character_literal
+ character_literal,
+ variable_expression,
+ field_access_expression,
+ dereference_expression,
+ unary_expression
);
const
@@ -195,6 +199,7 @@ var
proc _string_length(string: Word);
var
counter: Word;
+ current_byte: Word;
begin
(* Reset the counter. *)
counter := 0;
@@ -202,7 +207,8 @@ begin
.string_length_loop;
string := string + 1;
- if _load_byte(string) <> '"' then
+ current_byte := _load_byte(string);
+ if current_byte <> '"' then
counter := counter + 1;
goto string_length_loop
end;
@@ -228,8 +234,8 @@ begin
result := compiler_strings_length;
.add_string_loop;
- if _load_byte(contents) <> '"' then
- current_byte := _load_byte(contents);
+ current_byte := _load_byte(contents);
+ if current_byte <> '"' then
_store_byte(current_byte, compiler_strings_position);
compiler_strings_position := compiler_strings_position + 1;
contents := contents + 1;
@@ -547,7 +553,8 @@ begin
memory_free_pointer := memory_free_pointer + 12;
integer_token := _lexer_global_get_start();
- integer_length := _lexer_global_get_end() - integer_token;
+ integer_length := _lexer_global_get_end();
+ integer_length := integer_length - integer_token;
_lexer_skip_token();
_node_set_kind(result, NodeKind.integer_literal);
@@ -600,7 +607,8 @@ begin
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_length := character_length - character;
_lexer_skip_token();
_node_set_kind(result, NodeKind.character_literal);
@@ -623,53 +631,81 @@ begin
_write_c('\n');
end;
-proc _compile_variable_expression();
-var
- name: Word;
- lookup_result: Word;
- name_token: Word;
+proc _variable_expression_size();
+ return 12
+end;
+
+proc _variable_expression_get_name(this: Word);
begin
- name := _lexer_global_get_start();
- name_token := _lexer_global_get_end() - name;
- lookup_result := _symbol_table_lookup(@symbol_table_global, name, name_token);
+ this := this + 4;
+ return this^
+end;
- if lookup_result <> 0 then
- _compile_enumeration_value(lookup_result)
- else
- _compile_designator();
- _write_z("\tlw t0, (t0)\n\0")
- end
+proc _variable_expression_set_name(this: Word, value: Word);
+begin
+ this := this + 4;
+ this^ := value
end;
-(**
- * Compiled take address expression, starting with an "@" sign.
- *)
-proc _compile_address_expression();
+proc _variable_expression_get_length(this: Word);
begin
- _lexer_skip_token();
- _compile_designator()
+ this := this + 8;
+ return this^
end;
-(**
- * Compile unary negation, "-" sign.
- *)
-proc _compile_negate_expression();
+proc _variable_expression_set_length(this: Word, value: Word);
begin
- _lexer_skip_token();
- _compile_term();
- _write_z("\tneg t0, t0\n\0")
+ this := this + 8;
+ this^ := value
end;
-(* Compile unary negation, "~" sign. *)
-proc _compile_not_expression();
+proc _allocate(size: Word);
var
- token_kind: Word;
+ result: Word;
begin
- _lexer_read_token(@token_kind);
+ result := memory_free_pointer;
+ memory_free_pointer := memory_free_pointer + size;
+ return result
+end;
+
+proc _parse_variable_expression();
+var
+ name: Word;
+ name_token: Word;
+ result: Word;
+ memory_size: Word;
+begin
+ name := _lexer_global_get_start();
+ name_token := _lexer_global_get_end();
+ name_token := name_token - name;
_lexer_skip_token();
- _compile_term();
- _write_z("\tnot t0, t0\n\0")
-end;
+
+ memory_size := _variable_expression_size();
+ result := _allocate(memory_size);
+
+ _node_set_kind(result, NodeKind.variable_expression);
+ _variable_expression_set_name(result, name);
+ _variable_expression_set_length(result, name_token);
+
+ return result
+end;
+
+proc _compile_variable_expression(variable_expression: Word);
+var
+ name: Word;
+ name_token: Word;
+ lookup_result: Word;
+begin
+ name := _variable_expression_get_name(variable_expression);
+ name_token := _variable_expression_get_length(variable_expression);
+
+ lookup_result := _symbol_table_lookup(@symbol_table_local, name, name_token);
+ if lookup_result <> 0 then
+ _compile_local_designator(lookup_result)
+ else
+ _compile_global_designator(variable_expression)
+ end
+end;
proc _string_literal_node_size();
return 12
@@ -698,14 +734,16 @@ var
length: Word;
token_start: Word;
result: Word;
+ memory_size: Word;
begin
- result := memory_free_pointer;
- memory_free_pointer := memory_free_pointer + _string_literal_node_size();
+ memory_size := _string_literal_node_size();
+ result := _allocate(memory_size);
token_start := _lexer_global_get_start();
length := _string_length(token_start);
_lexer_skip_token();
+ _node_set_kind(result, NodeKind.string_literal);
_string_literal_node_set_value(result, token_start);
_string_literal_node_set_length(result, length);
@@ -731,48 +769,206 @@ begin
_write_z("\tadd t0, t0, t1\n\0")
end;
-proc _compile_term();
+proc _parse_simple_expression();
var
current_character: Word;
- token_kind: Word;
parser_node: Word;
+ token_kind: Word;
begin
+ parser_node := 0;
_lexer_read_token(@token_kind);
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)
+ parser_node := _parse_character_literal()
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 = LexerTokenKind.minus then
- _compile_negate_expression()
- elsif token_kind = LexerTokenKind.not then
- _compile_not_expression()
+ parser_node := _parse_integer_literal()
+ elsif token_kind = LexerTokenKind.string then
+ parser_node := _parse_string_literal()
elsif token_kind = LexerTokenKind.identifier then
current_character := _lexer_global_get_start();
current_character := _load_byte(current_character);
(* This is a call if the statement starts with an underscore. *)
- if current_character = '_' then
- _compile_call();
- _write_z("\tmv t0, a0\n\0")
- else
- _compile_variable_expression()
+ if current_character <> '_' then
+ parser_node := _parse_variable_expression()
end
+ end;
+ return parser_node
+end;
+
+proc _dereference_expression_size();
+ return 8
+end;
+
+proc _dereference_expression_get_pointer(this: Word);
+begin
+ this := this + 4;
+ return this^
+end;
+
+proc _dereference_expression_set_pointer(this: Word, value: Word);
+begin
+ this := this + 4;
+ this^ := value
+end;
+
+proc _parse_dereference_expression(simple_expression: Word);
+var
+ result: Word;
+ memory_size: Word;
+begin
+ memory_size := _dereference_expression_size();
+ result := _allocate(memory_size);
+
+ _node_set_kind(result, NodeKind.dereference_expression);
+ _dereference_expression_set_pointer(result, simple_expression);
+ _lexer_skip_token();
+
+ return result
+end;
+
+proc _parse_designator();
+var
+ simple_expression: Word;
+ token_kind: Word;
+begin
+ simple_expression := _parse_simple_expression();
+
+ _lexer_read_token(@token_kind);
+
+ if token_kind = LexerTokenKind.hat then
+ simple_expression := _parse_dereference_expression(simple_expression)
+ elsif token_kind = LexerTokenKind.dot then
+ simple_expression := _parse_field_access_expression(simple_expression)
+ end;
+ return simple_expression
+end;
+
+proc _compile_simple_expression(parser_node: Word);
+var
+ is_address: Word;
+ node_kind: Word;
+begin
+ is_address := 0;
+ node_kind := _node_get_kind(parser_node);
+
+ if node_kind = NodeKind.character_literal then
+ _compile_character_literal(parser_node)
+ elsif node_kind = NodeKind.string_literal then
+ _compile_string_literal(parser_node)
+ elsif node_kind = NodeKind.integer_literal then
+ _compile_integer_literal(parser_node)
+ else
+ _compile_variable_expression(parser_node);
+ is_address := 1
+ end;
+ return is_address
+end;
+
+proc _unary_expression_size();
+ return 12
+end;
+
+proc _unary_expression_get_operand(this: Word);
+begin
+ this := this + 4;
+ return this^
+end;
+
+proc _unary_expression_set_operand(this: Word, value: Word);
+begin
+ this := this + 4;
+ this^ := value
+end;
+
+proc _unary_expression_get_operator(this: Word);
+begin
+ this := this + 8;
+ return this^
+end;
+
+proc _unary_expression_set_operator(this: Word, value: Word);
+begin
+ this := this + 8;
+ this^ := value
+end;
+
+proc _parse_unary_expression();
+var
+ token_kind: Word;
+ result: Word;
+ memory_size: Word;
+ operand: Word;
+ operator: Word;
+begin
+ _lexer_read_token(@token_kind);
+ operator := 0;
+
+ if token_kind = LexerTokenKind.at then
+ operator := '@';
+ elsif token_kind = LexerTokenKind.minus then
+ operator := '-';
+ elsif token_kind = LexerTokenKind.not then
+ operator := '~';
+ end;
+ if operator <> 0 then
+ _lexer_skip_token();
+ end;
+ result := _parse_designator();
+
+ if operator <> 0 then
+ operand := result;
+ memory_size := _unary_expression_size();
+ result := _allocate(memory_size);
+
+ _node_set_kind(result, NodeKind.unary_expression);
+ _unary_expression_set_operand(result, operand);
+ _unary_expression_set_operator(result, operator)
+ end;
+
+ return result
+end;
+
+proc _compile_unary_expression(parser_node: Word);
+var
+ current_character: Word;
+ token_kind: Word;
+ expression_kind: Word;
+ operator: Word;
+ operand: Word;
+begin
+ operator := 0;
+ operand := 0;
+
+ expression_kind := _node_get_kind(parser_node);
+
+ if expression_kind = NodeKind.unary_expression then
+ operator := _unary_expression_get_operator(parser_node);
+ operand := _unary_expression_get_operand(parser_node)
+ else
+ operand := parser_node
+ end;
+
+ if operator = '@' then
+ _compile_designator(operand)
+ elsif _compile_designator(operand) then
+ _write_z("\tlw t0, (t0) # Designator is an address.\n\0")
+ end;
+ if operator = '-' then
+ _write_z("\tneg t0, t0\n\0")
+ elsif operator = '~' then
+ _write_z("\tnot t0, t0\n\0")
end
end;
proc _compile_binary_rhs();
+var
+ parser_node: Word;
begin
(* Save the value of the left expression on the stack. *)
_write_z("\tsw t0, 64(sp)\n\0");
- _compile_term();
+ parser_node := _parse_unary_expression();
+ _compile_unary_expression(parser_node);
(* Load the left expression from the stack; *)
_write_z("\tlw t1, 64(sp)\n\0")
@@ -781,8 +977,22 @@ end;
proc _compile_expression();
var
token_kind: Word;
+ current_byte: Word;
+ parser_node: Word;
begin
- _compile_term();
+ _lexer_read_token(@token_kind);
+ if token_kind = LexerTokenKind.identifier then
+ current_byte := _lexer_global_get_start();
+ current_byte := _load_byte(current_byte);
+
+ if current_byte = '_' then
+ _compile_call();
+ _write_z("\tmv t0, a0\n\0");
+ goto compile_expression_end
+ end
+ end;
+ parser_node := _parse_unary_expression();
+ _compile_unary_expression(parser_node);
_lexer_read_token(@token_kind);
@@ -885,7 +1095,8 @@ 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_length := name_length - name;
argument_count := 0;
(* Skip the identifier and left paren. *)
@@ -964,7 +1175,8 @@ begin
_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_length := next_length - next_token;
_write_z("\tj .\0");
@@ -979,28 +1191,64 @@ begin
_write_z("\taddi t0, sp, \0");
variable_offset := _parameter_info_get_offset(symbol);
_write_i(variable_offset);
- _write_c('\n');
- _lexer_skip_token()
+ _write_c('\n')
end;
-proc _compile_global_designator();
+proc _compile_global_designator(variable_expression: Word);
var
name: Word;
- token_kind: Word;
token_length: Word;
begin
_write_z("\tla t0, \0");
- _lexer_read_token(@token_kind);
- name := _lexer_global_get_start();
- token_length := _lexer_global_get_end() - name;
- _write_s(name, token_length);
- _lexer_skip_token();
+ name := _variable_expression_get_name(variable_expression);
+ token_length := _variable_expression_get_length(variable_expression);
+ _write_s(name, token_length);
_write_c('\n')
end;
-proc _compile_enumeration_value(symbol: Word);
+proc _field_access_expression_size();
+ return 16
+end;
+
+proc _field_access_expression_get_aggregate(this: Word);
+begin
+ this := this + 4;
+ return this^
+end;
+
+proc _field_access_expression_set_aggregate(this: Word, value: Word);
+begin
+ this := this + 4;
+ this^ := value
+end;
+
+proc _field_access_expression_get_field(this: Word);
+begin
+ this := this + 8;
+ return this^
+end;
+
+proc _field_access_expression_set_field(this: Word, value: Word);
+begin
+ this := this + 8;
+ this^ := value
+end;
+
+proc _field_access_expression_get_length(this: Word);
+begin
+ this := this + 12;
+ return this^
+end;
+
+proc _field_access_expression_set_length(this: Word, value: Word);
+begin
+ this := this + 12;
+ this^ := value
+end;
+
+proc _compile_enumeration_value(field_access_expression: Word);
var
enumeration_type: Word;
members: Word;
@@ -1011,20 +1259,22 @@ var
member_name: Word;
member_length: Word;
counter: Word;
+ symbol: Word;
begin
+ symbol := _field_access_expression_get_aggregate(field_access_expression);
+ value_name := _variable_expression_get_name(symbol);
+ name_length := _variable_expression_get_length(symbol);
+
+ symbol := _symbol_table_lookup(@symbol_table_global, value_name, name_length);
+
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();
+ value_name := _field_access_expression_get_field(field_access_expression);
+ name_length := _field_access_expression_get_length(field_access_expression);
counter := 1;
.compile_enumeration_value_members;
@@ -1032,7 +1282,8 @@ begin
member_name := members^;
member_length := _load_word(members + 4);
- if _lexer_compare_keyword(value_name, name_length, member_name, member_length) = 0 then
+ if _lexer_compare_keyword(value_name, name_length, member_name, member_length) then
+ else
members_length := members_length - 1;
members := members + 8;
counter := counter + 1;
@@ -1044,35 +1295,64 @@ begin
end
end;
-proc _compile_designator();
+proc _parse_field_access_expression(aggregate: Word);
var
- name_token: Word;
- lookup_result: Word;
token_kind: Word;
name: Word;
+ name_token: Word;
+ result: Word;
+ memory_size: Word;
begin
+ (* Skip dot. Read the enumeration value. *)
+ _lexer_skip_token();
_lexer_read_token(@token_kind);
+
name := _lexer_global_get_start();
- name_token := _lexer_global_get_end() - name;
- lookup_result := _symbol_table_lookup(@symbol_table_local, name, name_token);
+ name_token := _lexer_global_get_end();
+ name_token := name_token - name;
+ _lexer_skip_token();
+ memory_size := _field_access_expression_size();
+ result := _allocate(memory_size);
- if lookup_result <> 0 then
- _compile_local_designator(lookup_result)
+ _node_set_kind(result, NodeKind.field_access_expression);
+ _field_access_expression_set_aggregate(result, aggregate);
+ _field_access_expression_set_field(result, name);
+ _field_access_expression_set_length(result, name_token);
+
+ return result
+end;
+
+proc _compile_designator(parser_node: Word);
+var
+ name_token: Word;
+ lookup_result: Word;
+ token_kind: Word;
+ parser_node: Word;
+ is_address: Word;
+ node_kind: Word;
+begin
+ is_address := 1;
+ node_kind := _node_get_kind(parser_node);
+
+ if node_kind = NodeKind.dereference_expression then
+ parser_node := _dereference_expression_get_pointer(parser_node);
+ _compile_simple_expression(parser_node);
+ _write_z("\tlw t0, (t0)\n\0")
+ elsif node_kind = NodeKind.field_access_expression then
+ _compile_enumeration_value(parser_node);
+ is_address := 0
else
- _compile_global_designator()
+ is_address := _compile_simple_expression(parser_node)
end;
- _lexer_read_token(@token_kind);
- if token_kind = LexerTokenKind.hat then
- _lexer_skip_token();
- _write_z("\tlw t0, (t0)\n\0")
- end
+ return is_address
end;
proc _compile_assignment();
var
token_kind: Word;
begin
- _compile_designator();
+ token_kind := _parse_designator();
+ _compile_designator(token_kind);
(* Save the assignee address on the stack. *)
_write_z("\tsw t0, 60(sp)\n\0");
@@ -1082,6 +1362,7 @@ begin
_lexer_skip_token();
(* Compile the assignment. *)
+ _lexer_read_token(@token_kind);
_compile_expression();
_write_z("\tlw t1, 60(sp)\n\tsw t0, (t1)\n\0")
@@ -1182,7 +1463,8 @@ 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();
+ label_token := label_token - name;
_write_c('.');
_write_s(name, label_token);
_write_z(":\n\0");
@@ -1315,7 +1597,8 @@ begin
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();
+ name_length := name_length - enumeration_name;
_store_word(enumeration_name, memory_free_pointer);
memory_free_pointer := memory_free_pointer + 4;
@@ -1362,7 +1645,8 @@ begin
if token_kind = LexerTokenKind.identifier then
(* Named type. *)
type_name := _lexer_global_get_start();
- name_length := _lexer_global_get_end() - type_name;
+ name_length := _lexer_global_get_end();
+ name_length := name_length - type_name;
result := _symbol_table_lookup(@symbol_table_global, type_name, name_length);
result := _type_info_get_type(result);
@@ -1473,7 +1757,8 @@ 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_length := name_length - name_position;
_lexer_skip_token();
(* Skip colon and space in front of the type expression. *)
@@ -1535,7 +1820,8 @@ 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_length := name_length - name_position;
_lexer_skip_token();
(* Read and skip variable name, colon and the space *)
@@ -1590,7 +1876,8 @@ 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_length := name_length - name_pointer;
(* Write .type _procedure_name, @function. *)
_write_z(".type \0");
@@ -1689,14 +1976,20 @@ begin
_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);
- _lexer_skip_token();
+ length := _lexer_global_get_end();
+ length := length - token_start;
+ _write_s(token_start, length);
+ _lexer_skip_token();
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);
+
+ length := _lexer_global_get_end();
+ length := length - token_start;
+ _write_s(token_start, length);
_lexer_skip_token();
goto compile_global_initializer_end
@@ -1727,7 +2020,8 @@ var
token_kind: Word;
begin
name := _lexer_global_get_start();
- name_length := _lexer_global_get_end() - name;
+ name_length := _lexer_global_get_end();
+ name_length := name_length - name;
_write_z(".type \0");
_write_s(name, name_length);
@@ -1756,7 +2050,8 @@ var
type_info: Word;
begin
type_name := _lexer_global_get_start();
- name_length := _lexer_global_get_end() - type_name;
+ name_length := _lexer_global_get_end();
+ name_length := name_length - type_name;
_lexer_skip_token();
_lexer_read_token(@token_kind);
@@ -1829,7 +2124,8 @@ 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_length := name_length - name;
_write_z(".type \0");
_write_s(name, name_length);
@@ -1847,8 +2143,8 @@ begin
_lexer_read_token(@token_kind);
if token_kind <> LexerTokenKind.assignment then
- (* Else we assume this is a zeroed 81920 bytes big array. *)
- _write_z(" .zero 81920\0")
+ (* Else we assume this is a zeroed 102400 bytes big array. *)
+ _write_z(" .zero 102400\0")
else
(* Skip the assignment sign with surrounding whitespaces. *)
_lexer_skip_token();
@@ -1993,7 +2289,7 @@ begin
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
+ if _memcmp(symbol_name, current_name, name_length) then
goto symbol_table_lookup_repeat
end;
(* Otherwise, the symbol is found. *)
@@ -2248,7 +2544,8 @@ begin
column_position := character_class - 1;
column_position := column_position * 8;
- target := _lexer_get_transition_table() + row_position;
+ target := _lexer_get_transition_table();
+ target := target + row_position;
return target + column_position
end;
@@ -2439,7 +2736,11 @@ end;
* and 22 columns (character classes), so 2992 = 8 * 17 * 22.
*)
proc _lexer_global_state();
- return _lexer_get_transition_table() + 2992
+var
+ result: Word;
+begin
+ result := _lexer_get_transition_table();
+ return result + 2992
end;
(**
@@ -2449,7 +2750,8 @@ proc _lexer_global_get_start();
var
target: Word;
begin
- target := _lexer_global_state() + 4;
+ target := _lexer_global_state();
+ target := target + 4;
return target^
end;
@@ -2460,8 +2762,9 @@ proc _lexer_global_set_start(new_start: Word);
var
target: Word;
begin
- target := _lexer_global_state() + 4;
- _store_word(new_start, target)
+ target := _lexer_global_state();
+ target := target + 4;
+ target^ := new_start
end;
(**
@@ -2471,7 +2774,8 @@ proc _lexer_global_get_end();
var
target: Word;
begin
- target := _lexer_global_state() + 8;
+ target := _lexer_global_state();
+ target := target + 8;
return target^
end;
@@ -2482,8 +2786,9 @@ proc _lexer_global_set_end(new_start: Word);
var
target: Word;
begin
- target := _lexer_global_state() + 8;
- _store_word(new_start, target)
+ target := _lexer_global_state();
+ target := target + 8;
+ target^ := new_start
end;
proc _lexer_transition_get_action(transition: Word);
@@ -2555,7 +2860,8 @@ begin
result := 0;
if lhs_length = rhs_length then
- result := _memcmp(lhs_pointer, rhs_pointer, lhs_length) = 0
+ result := _memcmp(lhs_pointer, rhs_pointer, lhs_length);
+ result := result = 0
end;
return result
end;
@@ -2568,35 +2874,35 @@ begin
result := LexerTokenKind.identifier;
token_length := position_end - position_start;
- if _lexer_compare_keyword(position_start, token_length, "const", 5) = 1 then
+ if _lexer_compare_keyword(position_start, token_length, "const", 5) then
result := LexerTokenKind._const
- elsif _lexer_compare_keyword(position_start, token_length, "var", 3) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "var", 3) then
result := LexerTokenKind._var
- elsif _lexer_compare_keyword(position_start, token_length, "proc", 4) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "proc", 4) then
result := LexerTokenKind._proc
- elsif _lexer_compare_keyword(position_start, token_length, "type", 4) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "type", 4) then
result := LexerTokenKind._type
- elsif _lexer_compare_keyword(position_start, token_length, "begin", 5) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "begin", 5) then
result := LexerTokenKind._begin
- elsif _lexer_compare_keyword(position_start, token_length, "end", 3) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "end", 3) then
result := LexerTokenKind._end
- elsif _lexer_compare_keyword(position_start, token_length, "return", 6) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "return", 6) then
result := LexerTokenKind._return
- elsif _lexer_compare_keyword(position_start, token_length, "goto", 4) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "goto", 4) then
result := LexerTokenKind._goto
- elsif _lexer_compare_keyword(position_start, token_length, "if", 2) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "if", 2) then
result := LexerTokenKind._if
- elsif _lexer_compare_keyword(position_start, token_length, "while", 5) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "while", 5) then
result := LexerTokenKind._while
- elsif _lexer_compare_keyword(position_start, token_length, "then", 4) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "then", 4) then
result := LexerTokenKind._then
- elsif _lexer_compare_keyword(position_start, token_length, "else", 4) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "else", 4) then
result := LexerTokenKind._else
- elsif _lexer_compare_keyword(position_start, token_length, "elsif", 5) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "elsif", 5) then
result := LexerTokenKind._elsif
- elsif _lexer_compare_keyword(position_start, token_length, "or", 2) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "or", 2) then
result := LexerTokenKind._or
- elsif _lexer_compare_keyword(position_start, token_length, "xor", 2) = 1 then
+ elsif _lexer_compare_keyword(position_start, token_length, "xor", 2) then
result := LexerTokenKind._xor
end;
return result
@@ -2779,8 +3085,11 @@ begin
end;
proc _lexer_advance_token(kind: Word);
+var
+ result_state: Word;
begin
- if _lexer_execute_transition(kind) <> LexerState.finish then
+ result_state := _lexer_execute_transition(kind);
+ if result_state <> LexerState.finish then
_lexer_advance_token(kind)
end
end;
@@ -2821,7 +3130,7 @@ begin
.start_read;
(* Second argument is buffer size. Modifying update the source_code definition. *)
- last_read := _read_file(offset, 81920);
+ last_read := _read_file(offset, 102400);
if last_read > 0 then
offset := offset + last_read;
goto start_read