diff options
Diffstat (limited to 'boot/stage15/cl.elna')
| -rw-r--r-- | boot/stage15/cl.elna | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/boot/stage15/cl.elna b/boot/stage15/cl.elna index f2d2cab..6511bd7 100644 --- a/boot/stage15/cl.elna +++ b/boot/stage15/cl.elna @@ -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 |
