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.
Files changed (268) hide show
  1. machine_dialect/__main__.py +667 -0
  2. machine_dialect/agent/__init__.py +5 -0
  3. machine_dialect/agent/agent.py +360 -0
  4. machine_dialect/ast/__init__.py +95 -0
  5. machine_dialect/ast/ast_node.py +35 -0
  6. machine_dialect/ast/call_expression.py +82 -0
  7. machine_dialect/ast/dict_extraction.py +60 -0
  8. machine_dialect/ast/expressions.py +439 -0
  9. machine_dialect/ast/literals.py +309 -0
  10. machine_dialect/ast/program.py +35 -0
  11. machine_dialect/ast/statements.py +1433 -0
  12. machine_dialect/ast/tests/test_ast_string_representation.py +62 -0
  13. machine_dialect/ast/tests/test_boolean_literal.py +29 -0
  14. machine_dialect/ast/tests/test_collection_hir.py +138 -0
  15. machine_dialect/ast/tests/test_define_statement.py +142 -0
  16. machine_dialect/ast/tests/test_desugar.py +541 -0
  17. machine_dialect/ast/tests/test_foreach_desugar.py +245 -0
  18. machine_dialect/cfg/__init__.py +6 -0
  19. machine_dialect/cfg/config.py +156 -0
  20. machine_dialect/cfg/examples.py +221 -0
  21. machine_dialect/cfg/generate_with_ai.py +187 -0
  22. machine_dialect/cfg/openai_generation.py +200 -0
  23. machine_dialect/cfg/parser.py +94 -0
  24. machine_dialect/cfg/tests/__init__.py +1 -0
  25. machine_dialect/cfg/tests/test_cfg_parser.py +252 -0
  26. machine_dialect/cfg/tests/test_config.py +188 -0
  27. machine_dialect/cfg/tests/test_examples.py +391 -0
  28. machine_dialect/cfg/tests/test_generate_with_ai.py +354 -0
  29. machine_dialect/cfg/tests/test_openai_generation.py +256 -0
  30. machine_dialect/codegen/__init__.py +5 -0
  31. machine_dialect/codegen/bytecode_module.py +89 -0
  32. machine_dialect/codegen/bytecode_serializer.py +300 -0
  33. machine_dialect/codegen/opcodes.py +101 -0
  34. machine_dialect/codegen/register_codegen.py +1996 -0
  35. machine_dialect/codegen/symtab.py +208 -0
  36. machine_dialect/codegen/tests/__init__.py +1 -0
  37. machine_dialect/codegen/tests/test_array_operations_codegen.py +295 -0
  38. machine_dialect/codegen/tests/test_bytecode_serializer.py +185 -0
  39. machine_dialect/codegen/tests/test_register_codegen_ssa.py +324 -0
  40. machine_dialect/codegen/tests/test_symtab.py +418 -0
  41. machine_dialect/codegen/vm_serializer.py +621 -0
  42. machine_dialect/compiler/__init__.py +18 -0
  43. machine_dialect/compiler/compiler.py +197 -0
  44. machine_dialect/compiler/config.py +149 -0
  45. machine_dialect/compiler/context.py +149 -0
  46. machine_dialect/compiler/phases/__init__.py +19 -0
  47. machine_dialect/compiler/phases/bytecode_optimization.py +90 -0
  48. machine_dialect/compiler/phases/codegen.py +40 -0
  49. machine_dialect/compiler/phases/hir_generation.py +39 -0
  50. machine_dialect/compiler/phases/mir_generation.py +86 -0
  51. machine_dialect/compiler/phases/optimization.py +110 -0
  52. machine_dialect/compiler/phases/parsing.py +39 -0
  53. machine_dialect/compiler/pipeline.py +143 -0
  54. machine_dialect/compiler/tests/__init__.py +1 -0
  55. machine_dialect/compiler/tests/test_compiler.py +568 -0
  56. machine_dialect/compiler/vm_runner.py +173 -0
  57. machine_dialect/errors/__init__.py +32 -0
  58. machine_dialect/errors/exceptions.py +369 -0
  59. machine_dialect/errors/messages.py +82 -0
  60. machine_dialect/errors/tests/__init__.py +0 -0
  61. machine_dialect/errors/tests/test_expected_token_errors.py +188 -0
  62. machine_dialect/errors/tests/test_name_errors.py +118 -0
  63. machine_dialect/helpers/__init__.py +0 -0
  64. machine_dialect/helpers/stopwords.py +225 -0
  65. machine_dialect/helpers/validators.py +30 -0
  66. machine_dialect/lexer/__init__.py +9 -0
  67. machine_dialect/lexer/constants.py +23 -0
  68. machine_dialect/lexer/lexer.py +907 -0
  69. machine_dialect/lexer/tests/__init__.py +0 -0
  70. machine_dialect/lexer/tests/helpers.py +86 -0
  71. machine_dialect/lexer/tests/test_apostrophe_identifiers.py +122 -0
  72. machine_dialect/lexer/tests/test_backtick_identifiers.py +140 -0
  73. machine_dialect/lexer/tests/test_boolean_literals.py +108 -0
  74. machine_dialect/lexer/tests/test_case_insensitive_keywords.py +188 -0
  75. machine_dialect/lexer/tests/test_comments.py +200 -0
  76. machine_dialect/lexer/tests/test_double_asterisk_keywords.py +127 -0
  77. machine_dialect/lexer/tests/test_lexer_position.py +113 -0
  78. machine_dialect/lexer/tests/test_list_tokens.py +282 -0
  79. machine_dialect/lexer/tests/test_stopwords.py +80 -0
  80. machine_dialect/lexer/tests/test_strict_equality.py +129 -0
  81. machine_dialect/lexer/tests/test_token.py +41 -0
  82. machine_dialect/lexer/tests/test_tokenization.py +294 -0
  83. machine_dialect/lexer/tests/test_underscore_literals.py +343 -0
  84. machine_dialect/lexer/tests/test_url_literals.py +169 -0
  85. machine_dialect/lexer/tokens.py +487 -0
  86. machine_dialect/linter/__init__.py +10 -0
  87. machine_dialect/linter/__main__.py +144 -0
  88. machine_dialect/linter/linter.py +154 -0
  89. machine_dialect/linter/rules/__init__.py +8 -0
  90. machine_dialect/linter/rules/base.py +112 -0
  91. machine_dialect/linter/rules/statement_termination.py +99 -0
  92. machine_dialect/linter/tests/__init__.py +1 -0
  93. machine_dialect/linter/tests/mdrules/__init__.py +0 -0
  94. machine_dialect/linter/tests/mdrules/test_md101_statement_termination.py +181 -0
  95. machine_dialect/linter/tests/test_linter.py +81 -0
  96. machine_dialect/linter/tests/test_rules.py +110 -0
  97. machine_dialect/linter/tests/test_violations.py +71 -0
  98. machine_dialect/linter/violations.py +51 -0
  99. machine_dialect/mir/__init__.py +69 -0
  100. machine_dialect/mir/analyses/__init__.py +20 -0
  101. machine_dialect/mir/analyses/alias_analysis.py +315 -0
  102. machine_dialect/mir/analyses/dominance_analysis.py +49 -0
  103. machine_dialect/mir/analyses/escape_analysis.py +286 -0
  104. machine_dialect/mir/analyses/loop_analysis.py +272 -0
  105. machine_dialect/mir/analyses/tests/test_type_analysis.py +736 -0
  106. machine_dialect/mir/analyses/type_analysis.py +448 -0
  107. machine_dialect/mir/analyses/use_def_chains.py +232 -0
  108. machine_dialect/mir/basic_block.py +385 -0
  109. machine_dialect/mir/dataflow.py +445 -0
  110. machine_dialect/mir/debug_info.py +208 -0
  111. machine_dialect/mir/hir_to_mir.py +1738 -0
  112. machine_dialect/mir/mir_dumper.py +366 -0
  113. machine_dialect/mir/mir_function.py +167 -0
  114. machine_dialect/mir/mir_instructions.py +1877 -0
  115. machine_dialect/mir/mir_interpreter.py +556 -0
  116. machine_dialect/mir/mir_module.py +225 -0
  117. machine_dialect/mir/mir_printer.py +480 -0
  118. machine_dialect/mir/mir_transformer.py +410 -0
  119. machine_dialect/mir/mir_types.py +367 -0
  120. machine_dialect/mir/mir_validation.py +455 -0
  121. machine_dialect/mir/mir_values.py +268 -0
  122. machine_dialect/mir/optimization_config.py +233 -0
  123. machine_dialect/mir/optimization_pass.py +251 -0
  124. machine_dialect/mir/optimization_pipeline.py +355 -0
  125. machine_dialect/mir/optimizations/__init__.py +84 -0
  126. machine_dialect/mir/optimizations/algebraic_simplification.py +733 -0
  127. machine_dialect/mir/optimizations/branch_prediction.py +372 -0
  128. machine_dialect/mir/optimizations/constant_propagation.py +634 -0
  129. machine_dialect/mir/optimizations/cse.py +398 -0
  130. machine_dialect/mir/optimizations/dce.py +288 -0
  131. machine_dialect/mir/optimizations/inlining.py +551 -0
  132. machine_dialect/mir/optimizations/jump_threading.py +487 -0
  133. machine_dialect/mir/optimizations/licm.py +405 -0
  134. machine_dialect/mir/optimizations/loop_unrolling.py +366 -0
  135. machine_dialect/mir/optimizations/strength_reduction.py +422 -0
  136. machine_dialect/mir/optimizations/tail_call.py +207 -0
  137. machine_dialect/mir/optimizations/tests/test_loop_unrolling.py +483 -0
  138. machine_dialect/mir/optimizations/type_narrowing.py +397 -0
  139. machine_dialect/mir/optimizations/type_specialization.py +447 -0
  140. machine_dialect/mir/optimizations/type_specific.py +906 -0
  141. machine_dialect/mir/optimize_mir.py +89 -0
  142. machine_dialect/mir/pass_manager.py +391 -0
  143. machine_dialect/mir/profiling/__init__.py +26 -0
  144. machine_dialect/mir/profiling/profile_collector.py +318 -0
  145. machine_dialect/mir/profiling/profile_data.py +372 -0
  146. machine_dialect/mir/profiling/profile_reader.py +272 -0
  147. machine_dialect/mir/profiling/profile_writer.py +226 -0
  148. machine_dialect/mir/register_allocation.py +302 -0
  149. machine_dialect/mir/reporting/__init__.py +17 -0
  150. machine_dialect/mir/reporting/optimization_reporter.py +314 -0
  151. machine_dialect/mir/reporting/report_formatter.py +289 -0
  152. machine_dialect/mir/ssa_construction.py +342 -0
  153. machine_dialect/mir/tests/__init__.py +1 -0
  154. machine_dialect/mir/tests/test_algebraic_associativity.py +204 -0
  155. machine_dialect/mir/tests/test_algebraic_complex_patterns.py +221 -0
  156. machine_dialect/mir/tests/test_algebraic_division.py +126 -0
  157. machine_dialect/mir/tests/test_algebraic_simplification.py +863 -0
  158. machine_dialect/mir/tests/test_basic_block.py +425 -0
  159. machine_dialect/mir/tests/test_branch_prediction.py +459 -0
  160. machine_dialect/mir/tests/test_call_lowering.py +168 -0
  161. machine_dialect/mir/tests/test_collection_lowering.py +604 -0
  162. machine_dialect/mir/tests/test_cross_block_constant_propagation.py +255 -0
  163. machine_dialect/mir/tests/test_custom_passes.py +166 -0
  164. machine_dialect/mir/tests/test_debug_info.py +285 -0
  165. machine_dialect/mir/tests/test_dict_extraction_lowering.py +192 -0
  166. machine_dialect/mir/tests/test_dictionary_lowering.py +299 -0
  167. machine_dialect/mir/tests/test_double_negation.py +231 -0
  168. machine_dialect/mir/tests/test_escape_analysis.py +233 -0
  169. machine_dialect/mir/tests/test_hir_to_mir.py +465 -0
  170. machine_dialect/mir/tests/test_hir_to_mir_complete.py +389 -0
  171. machine_dialect/mir/tests/test_hir_to_mir_simple.py +130 -0
  172. machine_dialect/mir/tests/test_inlining.py +435 -0
  173. machine_dialect/mir/tests/test_licm.py +472 -0
  174. machine_dialect/mir/tests/test_mir_dumper.py +313 -0
  175. machine_dialect/mir/tests/test_mir_instructions.py +445 -0
  176. machine_dialect/mir/tests/test_mir_module.py +860 -0
  177. machine_dialect/mir/tests/test_mir_printer.py +387 -0
  178. machine_dialect/mir/tests/test_mir_types.py +123 -0
  179. machine_dialect/mir/tests/test_mir_types_enhanced.py +132 -0
  180. machine_dialect/mir/tests/test_mir_validation.py +378 -0
  181. machine_dialect/mir/tests/test_mir_values.py +168 -0
  182. machine_dialect/mir/tests/test_one_based_indexing.py +202 -0
  183. machine_dialect/mir/tests/test_optimization_helpers.py +60 -0
  184. machine_dialect/mir/tests/test_optimization_pipeline.py +554 -0
  185. machine_dialect/mir/tests/test_optimization_reporter.py +318 -0
  186. machine_dialect/mir/tests/test_pass_manager.py +294 -0
  187. machine_dialect/mir/tests/test_pass_registration.py +64 -0
  188. machine_dialect/mir/tests/test_profiling.py +356 -0
  189. machine_dialect/mir/tests/test_register_allocation.py +307 -0
  190. machine_dialect/mir/tests/test_report_formatters.py +372 -0
  191. machine_dialect/mir/tests/test_ssa_construction.py +433 -0
  192. machine_dialect/mir/tests/test_tail_call.py +236 -0
  193. machine_dialect/mir/tests/test_type_annotated_instructions.py +192 -0
  194. machine_dialect/mir/tests/test_type_narrowing.py +277 -0
  195. machine_dialect/mir/tests/test_type_specialization.py +421 -0
  196. machine_dialect/mir/tests/test_type_specific_optimization.py +545 -0
  197. machine_dialect/mir/tests/test_type_specific_optimization_advanced.py +382 -0
  198. machine_dialect/mir/type_inference.py +368 -0
  199. machine_dialect/parser/__init__.py +12 -0
  200. machine_dialect/parser/enums.py +45 -0
  201. machine_dialect/parser/parser.py +3655 -0
  202. machine_dialect/parser/protocols.py +11 -0
  203. machine_dialect/parser/symbol_table.py +169 -0
  204. machine_dialect/parser/tests/__init__.py +0 -0
  205. machine_dialect/parser/tests/helper_functions.py +193 -0
  206. machine_dialect/parser/tests/test_action_statements.py +334 -0
  207. machine_dialect/parser/tests/test_boolean_literal_expressions.py +152 -0
  208. machine_dialect/parser/tests/test_call_statements.py +154 -0
  209. machine_dialect/parser/tests/test_call_statements_errors.py +187 -0
  210. machine_dialect/parser/tests/test_collection_mutations.py +264 -0
  211. machine_dialect/parser/tests/test_conditional_expressions.py +343 -0
  212. machine_dialect/parser/tests/test_define_integration.py +468 -0
  213. machine_dialect/parser/tests/test_define_statements.py +311 -0
  214. machine_dialect/parser/tests/test_dict_extraction.py +115 -0
  215. machine_dialect/parser/tests/test_empty_literal.py +155 -0
  216. machine_dialect/parser/tests/test_float_literal_expressions.py +163 -0
  217. machine_dialect/parser/tests/test_identifier_expressions.py +57 -0
  218. machine_dialect/parser/tests/test_if_empty_block.py +61 -0
  219. machine_dialect/parser/tests/test_if_statements.py +299 -0
  220. machine_dialect/parser/tests/test_illegal_tokens.py +86 -0
  221. machine_dialect/parser/tests/test_infix_expressions.py +680 -0
  222. machine_dialect/parser/tests/test_integer_literal_expressions.py +137 -0
  223. machine_dialect/parser/tests/test_interaction_statements.py +269 -0
  224. machine_dialect/parser/tests/test_list_literals.py +277 -0
  225. machine_dialect/parser/tests/test_no_none_in_ast.py +94 -0
  226. machine_dialect/parser/tests/test_panic_mode_recovery.py +171 -0
  227. machine_dialect/parser/tests/test_parse_errors.py +114 -0
  228. machine_dialect/parser/tests/test_possessive_syntax.py +182 -0
  229. machine_dialect/parser/tests/test_prefix_expressions.py +415 -0
  230. machine_dialect/parser/tests/test_program.py +13 -0
  231. machine_dialect/parser/tests/test_return_statements.py +89 -0
  232. machine_dialect/parser/tests/test_set_statements.py +152 -0
  233. machine_dialect/parser/tests/test_strict_equality.py +258 -0
  234. machine_dialect/parser/tests/test_symbol_table.py +217 -0
  235. machine_dialect/parser/tests/test_url_literal_expressions.py +209 -0
  236. machine_dialect/parser/tests/test_utility_statements.py +423 -0
  237. machine_dialect/parser/token_buffer.py +159 -0
  238. machine_dialect/repl/__init__.py +3 -0
  239. machine_dialect/repl/repl.py +426 -0
  240. machine_dialect/repl/tests/__init__.py +0 -0
  241. machine_dialect/repl/tests/test_repl.py +606 -0
  242. machine_dialect/semantic/__init__.py +12 -0
  243. machine_dialect/semantic/analyzer.py +906 -0
  244. machine_dialect/semantic/error_messages.py +189 -0
  245. machine_dialect/semantic/tests/__init__.py +1 -0
  246. machine_dialect/semantic/tests/test_analyzer.py +364 -0
  247. machine_dialect/semantic/tests/test_error_messages.py +104 -0
  248. machine_dialect/tests/edge_cases/__init__.py +10 -0
  249. machine_dialect/tests/edge_cases/test_boundary_access.py +256 -0
  250. machine_dialect/tests/edge_cases/test_empty_collections.py +166 -0
  251. machine_dialect/tests/edge_cases/test_invalid_operations.py +243 -0
  252. machine_dialect/tests/edge_cases/test_named_list_edge_cases.py +295 -0
  253. machine_dialect/tests/edge_cases/test_nested_structures.py +313 -0
  254. machine_dialect/tests/edge_cases/test_type_mixing.py +277 -0
  255. machine_dialect/tests/integration/test_array_operations_emulation.py +248 -0
  256. machine_dialect/tests/integration/test_list_compilation.py +395 -0
  257. machine_dialect/tests/integration/test_lists_and_dictionaries.py +322 -0
  258. machine_dialect/type_checking/__init__.py +21 -0
  259. machine_dialect/type_checking/tests/__init__.py +1 -0
  260. machine_dialect/type_checking/tests/test_type_system.py +230 -0
  261. machine_dialect/type_checking/type_system.py +270 -0
  262. machine_dialect-0.1.0a1.dist-info/METADATA +128 -0
  263. machine_dialect-0.1.0a1.dist-info/RECORD +268 -0
  264. machine_dialect-0.1.0a1.dist-info/WHEEL +5 -0
  265. machine_dialect-0.1.0a1.dist-info/entry_points.txt +3 -0
  266. machine_dialect-0.1.0a1.dist-info/licenses/LICENSE +201 -0
  267. machine_dialect-0.1.0a1.dist-info/top_level.txt +2 -0
  268. 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()