machine-dialect 0.1.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- machine_dialect/__main__.py +667 -0
- machine_dialect/agent/__init__.py +5 -0
- machine_dialect/agent/agent.py +360 -0
- machine_dialect/ast/__init__.py +95 -0
- machine_dialect/ast/ast_node.py +35 -0
- machine_dialect/ast/call_expression.py +82 -0
- machine_dialect/ast/dict_extraction.py +60 -0
- machine_dialect/ast/expressions.py +439 -0
- machine_dialect/ast/literals.py +309 -0
- machine_dialect/ast/program.py +35 -0
- machine_dialect/ast/statements.py +1433 -0
- machine_dialect/ast/tests/test_ast_string_representation.py +62 -0
- machine_dialect/ast/tests/test_boolean_literal.py +29 -0
- machine_dialect/ast/tests/test_collection_hir.py +138 -0
- machine_dialect/ast/tests/test_define_statement.py +142 -0
- machine_dialect/ast/tests/test_desugar.py +541 -0
- machine_dialect/ast/tests/test_foreach_desugar.py +245 -0
- machine_dialect/cfg/__init__.py +6 -0
- machine_dialect/cfg/config.py +156 -0
- machine_dialect/cfg/examples.py +221 -0
- machine_dialect/cfg/generate_with_ai.py +187 -0
- machine_dialect/cfg/openai_generation.py +200 -0
- machine_dialect/cfg/parser.py +94 -0
- machine_dialect/cfg/tests/__init__.py +1 -0
- machine_dialect/cfg/tests/test_cfg_parser.py +252 -0
- machine_dialect/cfg/tests/test_config.py +188 -0
- machine_dialect/cfg/tests/test_examples.py +391 -0
- machine_dialect/cfg/tests/test_generate_with_ai.py +354 -0
- machine_dialect/cfg/tests/test_openai_generation.py +256 -0
- machine_dialect/codegen/__init__.py +5 -0
- machine_dialect/codegen/bytecode_module.py +89 -0
- machine_dialect/codegen/bytecode_serializer.py +300 -0
- machine_dialect/codegen/opcodes.py +101 -0
- machine_dialect/codegen/register_codegen.py +1996 -0
- machine_dialect/codegen/symtab.py +208 -0
- machine_dialect/codegen/tests/__init__.py +1 -0
- machine_dialect/codegen/tests/test_array_operations_codegen.py +295 -0
- machine_dialect/codegen/tests/test_bytecode_serializer.py +185 -0
- machine_dialect/codegen/tests/test_register_codegen_ssa.py +324 -0
- machine_dialect/codegen/tests/test_symtab.py +418 -0
- machine_dialect/codegen/vm_serializer.py +621 -0
- machine_dialect/compiler/__init__.py +18 -0
- machine_dialect/compiler/compiler.py +197 -0
- machine_dialect/compiler/config.py +149 -0
- machine_dialect/compiler/context.py +149 -0
- machine_dialect/compiler/phases/__init__.py +19 -0
- machine_dialect/compiler/phases/bytecode_optimization.py +90 -0
- machine_dialect/compiler/phases/codegen.py +40 -0
- machine_dialect/compiler/phases/hir_generation.py +39 -0
- machine_dialect/compiler/phases/mir_generation.py +86 -0
- machine_dialect/compiler/phases/optimization.py +110 -0
- machine_dialect/compiler/phases/parsing.py +39 -0
- machine_dialect/compiler/pipeline.py +143 -0
- machine_dialect/compiler/tests/__init__.py +1 -0
- machine_dialect/compiler/tests/test_compiler.py +568 -0
- machine_dialect/compiler/vm_runner.py +173 -0
- machine_dialect/errors/__init__.py +32 -0
- machine_dialect/errors/exceptions.py +369 -0
- machine_dialect/errors/messages.py +82 -0
- machine_dialect/errors/tests/__init__.py +0 -0
- machine_dialect/errors/tests/test_expected_token_errors.py +188 -0
- machine_dialect/errors/tests/test_name_errors.py +118 -0
- machine_dialect/helpers/__init__.py +0 -0
- machine_dialect/helpers/stopwords.py +225 -0
- machine_dialect/helpers/validators.py +30 -0
- machine_dialect/lexer/__init__.py +9 -0
- machine_dialect/lexer/constants.py +23 -0
- machine_dialect/lexer/lexer.py +907 -0
- machine_dialect/lexer/tests/__init__.py +0 -0
- machine_dialect/lexer/tests/helpers.py +86 -0
- machine_dialect/lexer/tests/test_apostrophe_identifiers.py +122 -0
- machine_dialect/lexer/tests/test_backtick_identifiers.py +140 -0
- machine_dialect/lexer/tests/test_boolean_literals.py +108 -0
- machine_dialect/lexer/tests/test_case_insensitive_keywords.py +188 -0
- machine_dialect/lexer/tests/test_comments.py +200 -0
- machine_dialect/lexer/tests/test_double_asterisk_keywords.py +127 -0
- machine_dialect/lexer/tests/test_lexer_position.py +113 -0
- machine_dialect/lexer/tests/test_list_tokens.py +282 -0
- machine_dialect/lexer/tests/test_stopwords.py +80 -0
- machine_dialect/lexer/tests/test_strict_equality.py +129 -0
- machine_dialect/lexer/tests/test_token.py +41 -0
- machine_dialect/lexer/tests/test_tokenization.py +294 -0
- machine_dialect/lexer/tests/test_underscore_literals.py +343 -0
- machine_dialect/lexer/tests/test_url_literals.py +169 -0
- machine_dialect/lexer/tokens.py +487 -0
- machine_dialect/linter/__init__.py +10 -0
- machine_dialect/linter/__main__.py +144 -0
- machine_dialect/linter/linter.py +154 -0
- machine_dialect/linter/rules/__init__.py +8 -0
- machine_dialect/linter/rules/base.py +112 -0
- machine_dialect/linter/rules/statement_termination.py +99 -0
- machine_dialect/linter/tests/__init__.py +1 -0
- machine_dialect/linter/tests/mdrules/__init__.py +0 -0
- machine_dialect/linter/tests/mdrules/test_md101_statement_termination.py +181 -0
- machine_dialect/linter/tests/test_linter.py +81 -0
- machine_dialect/linter/tests/test_rules.py +110 -0
- machine_dialect/linter/tests/test_violations.py +71 -0
- machine_dialect/linter/violations.py +51 -0
- machine_dialect/mir/__init__.py +69 -0
- machine_dialect/mir/analyses/__init__.py +20 -0
- machine_dialect/mir/analyses/alias_analysis.py +315 -0
- machine_dialect/mir/analyses/dominance_analysis.py +49 -0
- machine_dialect/mir/analyses/escape_analysis.py +286 -0
- machine_dialect/mir/analyses/loop_analysis.py +272 -0
- machine_dialect/mir/analyses/tests/test_type_analysis.py +736 -0
- machine_dialect/mir/analyses/type_analysis.py +448 -0
- machine_dialect/mir/analyses/use_def_chains.py +232 -0
- machine_dialect/mir/basic_block.py +385 -0
- machine_dialect/mir/dataflow.py +445 -0
- machine_dialect/mir/debug_info.py +208 -0
- machine_dialect/mir/hir_to_mir.py +1738 -0
- machine_dialect/mir/mir_dumper.py +366 -0
- machine_dialect/mir/mir_function.py +167 -0
- machine_dialect/mir/mir_instructions.py +1877 -0
- machine_dialect/mir/mir_interpreter.py +556 -0
- machine_dialect/mir/mir_module.py +225 -0
- machine_dialect/mir/mir_printer.py +480 -0
- machine_dialect/mir/mir_transformer.py +410 -0
- machine_dialect/mir/mir_types.py +367 -0
- machine_dialect/mir/mir_validation.py +455 -0
- machine_dialect/mir/mir_values.py +268 -0
- machine_dialect/mir/optimization_config.py +233 -0
- machine_dialect/mir/optimization_pass.py +251 -0
- machine_dialect/mir/optimization_pipeline.py +355 -0
- machine_dialect/mir/optimizations/__init__.py +84 -0
- machine_dialect/mir/optimizations/algebraic_simplification.py +733 -0
- machine_dialect/mir/optimizations/branch_prediction.py +372 -0
- machine_dialect/mir/optimizations/constant_propagation.py +634 -0
- machine_dialect/mir/optimizations/cse.py +398 -0
- machine_dialect/mir/optimizations/dce.py +288 -0
- machine_dialect/mir/optimizations/inlining.py +551 -0
- machine_dialect/mir/optimizations/jump_threading.py +487 -0
- machine_dialect/mir/optimizations/licm.py +405 -0
- machine_dialect/mir/optimizations/loop_unrolling.py +366 -0
- machine_dialect/mir/optimizations/strength_reduction.py +422 -0
- machine_dialect/mir/optimizations/tail_call.py +207 -0
- machine_dialect/mir/optimizations/tests/test_loop_unrolling.py +483 -0
- machine_dialect/mir/optimizations/type_narrowing.py +397 -0
- machine_dialect/mir/optimizations/type_specialization.py +447 -0
- machine_dialect/mir/optimizations/type_specific.py +906 -0
- machine_dialect/mir/optimize_mir.py +89 -0
- machine_dialect/mir/pass_manager.py +391 -0
- machine_dialect/mir/profiling/__init__.py +26 -0
- machine_dialect/mir/profiling/profile_collector.py +318 -0
- machine_dialect/mir/profiling/profile_data.py +372 -0
- machine_dialect/mir/profiling/profile_reader.py +272 -0
- machine_dialect/mir/profiling/profile_writer.py +226 -0
- machine_dialect/mir/register_allocation.py +302 -0
- machine_dialect/mir/reporting/__init__.py +17 -0
- machine_dialect/mir/reporting/optimization_reporter.py +314 -0
- machine_dialect/mir/reporting/report_formatter.py +289 -0
- machine_dialect/mir/ssa_construction.py +342 -0
- machine_dialect/mir/tests/__init__.py +1 -0
- machine_dialect/mir/tests/test_algebraic_associativity.py +204 -0
- machine_dialect/mir/tests/test_algebraic_complex_patterns.py +221 -0
- machine_dialect/mir/tests/test_algebraic_division.py +126 -0
- machine_dialect/mir/tests/test_algebraic_simplification.py +863 -0
- machine_dialect/mir/tests/test_basic_block.py +425 -0
- machine_dialect/mir/tests/test_branch_prediction.py +459 -0
- machine_dialect/mir/tests/test_call_lowering.py +168 -0
- machine_dialect/mir/tests/test_collection_lowering.py +604 -0
- machine_dialect/mir/tests/test_cross_block_constant_propagation.py +255 -0
- machine_dialect/mir/tests/test_custom_passes.py +166 -0
- machine_dialect/mir/tests/test_debug_info.py +285 -0
- machine_dialect/mir/tests/test_dict_extraction_lowering.py +192 -0
- machine_dialect/mir/tests/test_dictionary_lowering.py +299 -0
- machine_dialect/mir/tests/test_double_negation.py +231 -0
- machine_dialect/mir/tests/test_escape_analysis.py +233 -0
- machine_dialect/mir/tests/test_hir_to_mir.py +465 -0
- machine_dialect/mir/tests/test_hir_to_mir_complete.py +389 -0
- machine_dialect/mir/tests/test_hir_to_mir_simple.py +130 -0
- machine_dialect/mir/tests/test_inlining.py +435 -0
- machine_dialect/mir/tests/test_licm.py +472 -0
- machine_dialect/mir/tests/test_mir_dumper.py +313 -0
- machine_dialect/mir/tests/test_mir_instructions.py +445 -0
- machine_dialect/mir/tests/test_mir_module.py +860 -0
- machine_dialect/mir/tests/test_mir_printer.py +387 -0
- machine_dialect/mir/tests/test_mir_types.py +123 -0
- machine_dialect/mir/tests/test_mir_types_enhanced.py +132 -0
- machine_dialect/mir/tests/test_mir_validation.py +378 -0
- machine_dialect/mir/tests/test_mir_values.py +168 -0
- machine_dialect/mir/tests/test_one_based_indexing.py +202 -0
- machine_dialect/mir/tests/test_optimization_helpers.py +60 -0
- machine_dialect/mir/tests/test_optimization_pipeline.py +554 -0
- machine_dialect/mir/tests/test_optimization_reporter.py +318 -0
- machine_dialect/mir/tests/test_pass_manager.py +294 -0
- machine_dialect/mir/tests/test_pass_registration.py +64 -0
- machine_dialect/mir/tests/test_profiling.py +356 -0
- machine_dialect/mir/tests/test_register_allocation.py +307 -0
- machine_dialect/mir/tests/test_report_formatters.py +372 -0
- machine_dialect/mir/tests/test_ssa_construction.py +433 -0
- machine_dialect/mir/tests/test_tail_call.py +236 -0
- machine_dialect/mir/tests/test_type_annotated_instructions.py +192 -0
- machine_dialect/mir/tests/test_type_narrowing.py +277 -0
- machine_dialect/mir/tests/test_type_specialization.py +421 -0
- machine_dialect/mir/tests/test_type_specific_optimization.py +545 -0
- machine_dialect/mir/tests/test_type_specific_optimization_advanced.py +382 -0
- machine_dialect/mir/type_inference.py +368 -0
- machine_dialect/parser/__init__.py +12 -0
- machine_dialect/parser/enums.py +45 -0
- machine_dialect/parser/parser.py +3655 -0
- machine_dialect/parser/protocols.py +11 -0
- machine_dialect/parser/symbol_table.py +169 -0
- machine_dialect/parser/tests/__init__.py +0 -0
- machine_dialect/parser/tests/helper_functions.py +193 -0
- machine_dialect/parser/tests/test_action_statements.py +334 -0
- machine_dialect/parser/tests/test_boolean_literal_expressions.py +152 -0
- machine_dialect/parser/tests/test_call_statements.py +154 -0
- machine_dialect/parser/tests/test_call_statements_errors.py +187 -0
- machine_dialect/parser/tests/test_collection_mutations.py +264 -0
- machine_dialect/parser/tests/test_conditional_expressions.py +343 -0
- machine_dialect/parser/tests/test_define_integration.py +468 -0
- machine_dialect/parser/tests/test_define_statements.py +311 -0
- machine_dialect/parser/tests/test_dict_extraction.py +115 -0
- machine_dialect/parser/tests/test_empty_literal.py +155 -0
- machine_dialect/parser/tests/test_float_literal_expressions.py +163 -0
- machine_dialect/parser/tests/test_identifier_expressions.py +57 -0
- machine_dialect/parser/tests/test_if_empty_block.py +61 -0
- machine_dialect/parser/tests/test_if_statements.py +299 -0
- machine_dialect/parser/tests/test_illegal_tokens.py +86 -0
- machine_dialect/parser/tests/test_infix_expressions.py +680 -0
- machine_dialect/parser/tests/test_integer_literal_expressions.py +137 -0
- machine_dialect/parser/tests/test_interaction_statements.py +269 -0
- machine_dialect/parser/tests/test_list_literals.py +277 -0
- machine_dialect/parser/tests/test_no_none_in_ast.py +94 -0
- machine_dialect/parser/tests/test_panic_mode_recovery.py +171 -0
- machine_dialect/parser/tests/test_parse_errors.py +114 -0
- machine_dialect/parser/tests/test_possessive_syntax.py +182 -0
- machine_dialect/parser/tests/test_prefix_expressions.py +415 -0
- machine_dialect/parser/tests/test_program.py +13 -0
- machine_dialect/parser/tests/test_return_statements.py +89 -0
- machine_dialect/parser/tests/test_set_statements.py +152 -0
- machine_dialect/parser/tests/test_strict_equality.py +258 -0
- machine_dialect/parser/tests/test_symbol_table.py +217 -0
- machine_dialect/parser/tests/test_url_literal_expressions.py +209 -0
- machine_dialect/parser/tests/test_utility_statements.py +423 -0
- machine_dialect/parser/token_buffer.py +159 -0
- machine_dialect/repl/__init__.py +3 -0
- machine_dialect/repl/repl.py +426 -0
- machine_dialect/repl/tests/__init__.py +0 -0
- machine_dialect/repl/tests/test_repl.py +606 -0
- machine_dialect/semantic/__init__.py +12 -0
- machine_dialect/semantic/analyzer.py +906 -0
- machine_dialect/semantic/error_messages.py +189 -0
- machine_dialect/semantic/tests/__init__.py +1 -0
- machine_dialect/semantic/tests/test_analyzer.py +364 -0
- machine_dialect/semantic/tests/test_error_messages.py +104 -0
- machine_dialect/tests/edge_cases/__init__.py +10 -0
- machine_dialect/tests/edge_cases/test_boundary_access.py +256 -0
- machine_dialect/tests/edge_cases/test_empty_collections.py +166 -0
- machine_dialect/tests/edge_cases/test_invalid_operations.py +243 -0
- machine_dialect/tests/edge_cases/test_named_list_edge_cases.py +295 -0
- machine_dialect/tests/edge_cases/test_nested_structures.py +313 -0
- machine_dialect/tests/edge_cases/test_type_mixing.py +277 -0
- machine_dialect/tests/integration/test_array_operations_emulation.py +248 -0
- machine_dialect/tests/integration/test_list_compilation.py +395 -0
- machine_dialect/tests/integration/test_lists_and_dictionaries.py +322 -0
- machine_dialect/type_checking/__init__.py +21 -0
- machine_dialect/type_checking/tests/__init__.py +1 -0
- machine_dialect/type_checking/tests/test_type_system.py +230 -0
- machine_dialect/type_checking/type_system.py +270 -0
- machine_dialect-0.1.0a1.dist-info/METADATA +128 -0
- machine_dialect-0.1.0a1.dist-info/RECORD +268 -0
- machine_dialect-0.1.0a1.dist-info/WHEEL +5 -0
- machine_dialect-0.1.0a1.dist-info/entry_points.txt +3 -0
- machine_dialect-0.1.0a1.dist-info/licenses/LICENSE +201 -0
- machine_dialect-0.1.0a1.dist-info/top_level.txt +2 -0
- machine_dialect_vm/__init__.pyi +15 -0
@@ -0,0 +1,309 @@
|
|
1
|
+
"""Literal expression AST nodes for Machine Dialect™."""
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING
|
4
|
+
|
5
|
+
from machine_dialect.ast import Expression
|
6
|
+
from machine_dialect.lexer import Token
|
7
|
+
|
8
|
+
if TYPE_CHECKING:
|
9
|
+
from machine_dialect.ast import Expression as ExpressionType
|
10
|
+
|
11
|
+
|
12
|
+
class WholeNumberLiteral(Expression):
|
13
|
+
"""Represents a Whole Number literal expression."""
|
14
|
+
|
15
|
+
def __init__(self, token: Token, value: int) -> None:
|
16
|
+
super().__init__(token)
|
17
|
+
self.value = value
|
18
|
+
|
19
|
+
def __str__(self) -> str:
|
20
|
+
# Display with underscores for the new syntax
|
21
|
+
return f"_{self.value}_"
|
22
|
+
|
23
|
+
def desugar(self) -> "WholeNumberLiteral":
|
24
|
+
"""Whole Number literals are already in simplest form.
|
25
|
+
|
26
|
+
Returns:
|
27
|
+
Self unchanged.
|
28
|
+
"""
|
29
|
+
return self
|
30
|
+
|
31
|
+
|
32
|
+
class FloatLiteral(Expression):
|
33
|
+
"""Represents a float literal expression."""
|
34
|
+
|
35
|
+
def __init__(self, token: Token, value: float) -> None:
|
36
|
+
super().__init__(token)
|
37
|
+
self.value = value
|
38
|
+
|
39
|
+
def __str__(self) -> str:
|
40
|
+
# Display with underscores for the new syntax
|
41
|
+
return f"_{self.value}_"
|
42
|
+
|
43
|
+
def desugar(self) -> "FloatLiteral":
|
44
|
+
"""Float literals are already in simplest form.
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
Self unchanged.
|
48
|
+
"""
|
49
|
+
return self
|
50
|
+
|
51
|
+
|
52
|
+
class StringLiteral(Expression):
|
53
|
+
"""Represents a string literal expression."""
|
54
|
+
|
55
|
+
def __init__(self, token: Token, value: str) -> None:
|
56
|
+
super().__init__(token)
|
57
|
+
self.value = value
|
58
|
+
|
59
|
+
def __str__(self) -> str:
|
60
|
+
# Display with underscores and quotes for the new syntax
|
61
|
+
# The value doesn't include quotes, so add them for display
|
62
|
+
return f'_"{self.value}"_'
|
63
|
+
|
64
|
+
def desugar(self) -> "StringLiteral":
|
65
|
+
"""String literals are already in simplest form.
|
66
|
+
|
67
|
+
Returns:
|
68
|
+
Self unchanged.
|
69
|
+
"""
|
70
|
+
return self
|
71
|
+
|
72
|
+
|
73
|
+
class EmptyLiteral(Expression):
|
74
|
+
"""Represents an empty/null literal expression."""
|
75
|
+
|
76
|
+
def __init__(self, token: Token) -> None:
|
77
|
+
super().__init__(token)
|
78
|
+
self.value = None
|
79
|
+
|
80
|
+
def __str__(self) -> str:
|
81
|
+
return "empty"
|
82
|
+
|
83
|
+
def desugar(self) -> "EmptyLiteral":
|
84
|
+
"""Empty literals represent null/none values.
|
85
|
+
|
86
|
+
Returns:
|
87
|
+
Self unchanged (already canonical).
|
88
|
+
"""
|
89
|
+
return self
|
90
|
+
|
91
|
+
|
92
|
+
class URLLiteral(Expression):
|
93
|
+
"""Represents a URL literal expression."""
|
94
|
+
|
95
|
+
def __init__(self, token: Token, value: str) -> None:
|
96
|
+
super().__init__(token)
|
97
|
+
self.value = value
|
98
|
+
|
99
|
+
def __str__(self) -> str:
|
100
|
+
# Display with underscores and quotes for the new syntax
|
101
|
+
# Add quotes for display even though the value doesn't include them
|
102
|
+
return f'_"{self.value}"_'
|
103
|
+
|
104
|
+
def desugar(self) -> "URLLiteral":
|
105
|
+
"""URL literals are already in simplest form.
|
106
|
+
|
107
|
+
Returns:
|
108
|
+
Self unchanged.
|
109
|
+
"""
|
110
|
+
return self
|
111
|
+
|
112
|
+
|
113
|
+
class YesNoLiteral(Expression):
|
114
|
+
"""Represents a boolean literal expression."""
|
115
|
+
|
116
|
+
def __init__(self, token: Token, value: bool) -> None:
|
117
|
+
super().__init__(token)
|
118
|
+
self.value = value
|
119
|
+
|
120
|
+
def __str__(self) -> str:
|
121
|
+
# Display with underscores for the new syntax using canonical Yes/No
|
122
|
+
return f"_{'Yes' if self.value else 'No'}_"
|
123
|
+
|
124
|
+
def desugar(self) -> "YesNoLiteral":
|
125
|
+
"""Boolean literals are already normalized by lexer.
|
126
|
+
|
127
|
+
Returns:
|
128
|
+
Self unchanged.
|
129
|
+
"""
|
130
|
+
return self
|
131
|
+
|
132
|
+
|
133
|
+
class UnorderedListLiteral(Expression):
|
134
|
+
"""Unordered list literal (dash markers).
|
135
|
+
|
136
|
+
Represents a list created with dash markers (-).
|
137
|
+
Example:
|
138
|
+
- item1
|
139
|
+
- item2
|
140
|
+
"""
|
141
|
+
|
142
|
+
def __init__(self, token: Token, elements: list["ExpressionType"]) -> None:
|
143
|
+
"""Initialize unordered list literal.
|
144
|
+
|
145
|
+
Args:
|
146
|
+
token: The token representing the start of the list.
|
147
|
+
elements: List of expressions that are the list elements.
|
148
|
+
"""
|
149
|
+
super().__init__(token)
|
150
|
+
self.elements = elements
|
151
|
+
|
152
|
+
def __str__(self) -> str:
|
153
|
+
"""String representation of the unordered list."""
|
154
|
+
if not self.elements:
|
155
|
+
return "[]"
|
156
|
+
elements_str = ", ".join(str(elem) for elem in self.elements)
|
157
|
+
return f"[{elements_str}]"
|
158
|
+
|
159
|
+
def desugar(self) -> "UnorderedListLiteral":
|
160
|
+
"""Desugar the unordered list literal.
|
161
|
+
|
162
|
+
Returns:
|
163
|
+
Self with desugared elements.
|
164
|
+
"""
|
165
|
+
desugared_elements = [elem.desugar() for elem in self.elements]
|
166
|
+
return UnorderedListLiteral(self.token, desugared_elements)
|
167
|
+
|
168
|
+
def to_hir(self) -> "UnorderedListLiteral":
|
169
|
+
"""Convert unordered list to HIR representation.
|
170
|
+
|
171
|
+
Returns:
|
172
|
+
HIR representation with desugared elements.
|
173
|
+
"""
|
174
|
+
hir_elements = []
|
175
|
+
for elem in self.elements:
|
176
|
+
if hasattr(elem, "to_hir"):
|
177
|
+
hir_elements.append(elem.to_hir())
|
178
|
+
else:
|
179
|
+
hir_elements.append(elem)
|
180
|
+
return UnorderedListLiteral(self.token, hir_elements)
|
181
|
+
|
182
|
+
|
183
|
+
class OrderedListLiteral(Expression):
|
184
|
+
"""Ordered list literal (numbered markers).
|
185
|
+
|
186
|
+
Represents a list created with numbered markers (1., 2., etc).
|
187
|
+
Example:
|
188
|
+
1. item1
|
189
|
+
2. item2
|
190
|
+
"""
|
191
|
+
|
192
|
+
def __init__(self, token: Token, elements: list["ExpressionType"]) -> None:
|
193
|
+
"""Initialize ordered list literal.
|
194
|
+
|
195
|
+
Args:
|
196
|
+
token: The token representing the start of the list.
|
197
|
+
elements: List of expressions that are the list elements.
|
198
|
+
"""
|
199
|
+
super().__init__(token)
|
200
|
+
self.elements = elements
|
201
|
+
|
202
|
+
def __str__(self) -> str:
|
203
|
+
"""String representation of the ordered list."""
|
204
|
+
if not self.elements:
|
205
|
+
return "[]"
|
206
|
+
elements_str = ", ".join(str(elem) for elem in self.elements)
|
207
|
+
return f"[{elements_str}]"
|
208
|
+
|
209
|
+
def desugar(self) -> "OrderedListLiteral":
|
210
|
+
"""Desugar the ordered list literal.
|
211
|
+
|
212
|
+
Returns:
|
213
|
+
Self with desugared elements.
|
214
|
+
"""
|
215
|
+
desugared_elements = [elem.desugar() for elem in self.elements]
|
216
|
+
return OrderedListLiteral(self.token, desugared_elements)
|
217
|
+
|
218
|
+
def to_hir(self) -> "OrderedListLiteral":
|
219
|
+
"""Convert ordered list to HIR representation.
|
220
|
+
|
221
|
+
Returns:
|
222
|
+
HIR representation with desugared elements.
|
223
|
+
"""
|
224
|
+
hir_elements = []
|
225
|
+
for elem in self.elements:
|
226
|
+
if hasattr(elem, "to_hir"):
|
227
|
+
hir_elements.append(elem.to_hir())
|
228
|
+
else:
|
229
|
+
hir_elements.append(elem)
|
230
|
+
return OrderedListLiteral(self.token, hir_elements)
|
231
|
+
|
232
|
+
|
233
|
+
class NamedListLiteral(Expression):
|
234
|
+
"""Named list literal (dictionary).
|
235
|
+
|
236
|
+
Represents a dictionary created with name-content pairs using dash markers.
|
237
|
+
Example:
|
238
|
+
- name: content
|
239
|
+
- key: value
|
240
|
+
"""
|
241
|
+
|
242
|
+
def __init__(self, token: Token, entries: list[tuple[str, "ExpressionType"]]) -> None:
|
243
|
+
"""Initialize named list literal.
|
244
|
+
|
245
|
+
Args:
|
246
|
+
token: The token representing the start of the list.
|
247
|
+
entries: List of (name, content) pairs.
|
248
|
+
"""
|
249
|
+
super().__init__(token)
|
250
|
+
self.entries = entries
|
251
|
+
|
252
|
+
def __str__(self) -> str:
|
253
|
+
"""String representation of the named list."""
|
254
|
+
if not self.entries:
|
255
|
+
return "{}"
|
256
|
+
entries_str = ", ".join(f"{name}: {content}" for name, content in self.entries)
|
257
|
+
return f"{{{entries_str}}}"
|
258
|
+
|
259
|
+
def desugar(self) -> "NamedListLiteral":
|
260
|
+
"""Desugar the named list literal.
|
261
|
+
|
262
|
+
Returns:
|
263
|
+
Self with desugared content expressions.
|
264
|
+
"""
|
265
|
+
desugared_entries = [(name, content.desugar()) for name, content in self.entries]
|
266
|
+
return NamedListLiteral(self.token, desugared_entries)
|
267
|
+
|
268
|
+
def to_hir(self) -> "NamedListLiteral":
|
269
|
+
"""Convert named list to HIR representation.
|
270
|
+
|
271
|
+
Returns:
|
272
|
+
HIR representation with desugared content expressions.
|
273
|
+
"""
|
274
|
+
hir_entries = []
|
275
|
+
for name, content in self.entries:
|
276
|
+
if hasattr(content, "to_hir"):
|
277
|
+
hir_entries.append((name, content.to_hir()))
|
278
|
+
else:
|
279
|
+
hir_entries.append((name, content))
|
280
|
+
return NamedListLiteral(self.token, hir_entries)
|
281
|
+
|
282
|
+
|
283
|
+
class BlankLiteral(Expression):
|
284
|
+
"""Represents a blank literal for empty collections.
|
285
|
+
|
286
|
+
Used in expressions like:
|
287
|
+
- Set `list` to blank.
|
288
|
+
- Set `dict` to blank.
|
289
|
+
"""
|
290
|
+
|
291
|
+
def __init__(self, token: Token) -> None:
|
292
|
+
"""Initialize blank literal.
|
293
|
+
|
294
|
+
Args:
|
295
|
+
token: The 'blank' token.
|
296
|
+
"""
|
297
|
+
self.token = token
|
298
|
+
|
299
|
+
def __str__(self) -> str:
|
300
|
+
"""Return string representation."""
|
301
|
+
return "blank"
|
302
|
+
|
303
|
+
def desugar(self) -> "BlankLiteral":
|
304
|
+
"""Desugar to self."""
|
305
|
+
return self
|
306
|
+
|
307
|
+
def to_hir(self) -> "BlankLiteral":
|
308
|
+
"""Convert to HIR representation."""
|
309
|
+
return self
|
@@ -0,0 +1,35 @@
|
|
1
|
+
from machine_dialect.ast import ASTNode, Statement
|
2
|
+
|
3
|
+
|
4
|
+
class Program(ASTNode):
|
5
|
+
def __init__(self, statements: list[Statement]) -> None:
|
6
|
+
self.statements = statements
|
7
|
+
|
8
|
+
def __str__(self) -> str:
|
9
|
+
out: list[str] = []
|
10
|
+
for statement in self.statements:
|
11
|
+
out.append(str(statement))
|
12
|
+
|
13
|
+
return ".\n".join(out) + ".\n"
|
14
|
+
|
15
|
+
def desugar(self) -> "Program":
|
16
|
+
"""Desugar the program by recursively desugaring all statements.
|
17
|
+
|
18
|
+
Returns:
|
19
|
+
A new Program with desugared statements.
|
20
|
+
"""
|
21
|
+
# Desugar each statement - the desugar method returns Statement
|
22
|
+
desugared_statements = [stmt.desugar() for stmt in self.statements]
|
23
|
+
return Program(desugared_statements)
|
24
|
+
|
25
|
+
def to_hir(self) -> "Program":
|
26
|
+
"""Convert AST to HIR by desugaring.
|
27
|
+
|
28
|
+
This method applies desugaring transformations which includes
|
29
|
+
normalizing operators to their canonical forms.
|
30
|
+
|
31
|
+
Returns:
|
32
|
+
A HIR representation of the program.
|
33
|
+
"""
|
34
|
+
# Desugar the program (includes normalization)
|
35
|
+
return self.desugar()
|