Support nil literals
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
(* - Record declarations are supported. Access is done with generated procedures,
|
||||
record_name_get_field and record_name_set_field. Record size can be queried with
|
||||
record_name_size(). *)
|
||||
(* - Program modules start with the "program;" keyword. *)
|
||||
(* - nil literal. *)
|
||||
|
||||
type
|
||||
ElnaLexerAction = (none, accumulate, skip, single, eof, finalize, composite, key_id, integer, delimited);
|
||||
@@ -153,7 +155,8 @@ type
|
||||
named_type_expression,
|
||||
type_declaration,
|
||||
module_declaration,
|
||||
record_type_expression
|
||||
record_type_expression,
|
||||
null
|
||||
);
|
||||
InfoKind = (type_info, parameter_info, temporary_info, procedure_info);
|
||||
TypeKind = (primitive, enumeration, _record);
|
||||
@@ -1300,6 +1303,10 @@ begin
|
||||
this^ := kind
|
||||
end;
|
||||
|
||||
proc _nil_node_size();
|
||||
return 4
|
||||
end;
|
||||
|
||||
proc _integer_literal_node_size();
|
||||
return 12
|
||||
end;
|
||||
@@ -1350,6 +1357,19 @@ begin
|
||||
return result
|
||||
end;
|
||||
|
||||
proc _elna_parser_nil();
|
||||
var
|
||||
result: Word;
|
||||
literal_size: Word;
|
||||
begin
|
||||
literal_size := _nil_node_size();
|
||||
result := _allocate(literal_size);
|
||||
|
||||
_elna_lexer_skip_token();
|
||||
_node_set_kind(result, NodeKind.null);
|
||||
return result
|
||||
end;
|
||||
|
||||
proc _elna_tac_integer_literal(integer_literal_node: Word);
|
||||
var
|
||||
integer_token: Word;
|
||||
@@ -1362,6 +1382,11 @@ begin
|
||||
return _elna_tac_load_immediate(ElnaTacRegister.t0, integer_token, integer_length)
|
||||
end;
|
||||
|
||||
proc _elna_tac_nil(nil_node: Word);
|
||||
begin
|
||||
return _elna_tac_load_immediate(ElnaTacRegister.t0, 0, 0)
|
||||
end;
|
||||
|
||||
proc _character_literal_node_size();
|
||||
return 12
|
||||
end;
|
||||
@@ -1587,6 +1612,8 @@ begin
|
||||
parser_node := _elna_parser_integer_literal()
|
||||
elsif token_kind = ElnaLexerKind.string then
|
||||
parser_node := _elna_parser_string_literal()
|
||||
elsif token_kind = ElnaLexerKind.null then
|
||||
parser_node := _elna_parser_nil()
|
||||
elsif token_kind = ElnaLexerKind.identifier then
|
||||
parser_node := _elna_parser_variable_expression()
|
||||
end;
|
||||
@@ -1658,6 +1685,8 @@ begin
|
||||
instruction := _elna_tac_string_literal(parser_node)
|
||||
elsif node_kind = NodeKind.integer_literal then
|
||||
instruction := _elna_tac_integer_literal(parser_node)
|
||||
elsif node_kind = NodeKind.null then
|
||||
instruction := _elna_tac_nil(parser_node)
|
||||
else
|
||||
instruction := _elna_tac_variable_expression(parser_node, symbol_table);
|
||||
is_address^ := 1
|
||||
|
||||
Reference in New Issue
Block a user