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,86 @@
1
+ """MIR generation phase of compilation.
2
+
3
+ This module handles the MIR lowering phase of compilation.
4
+ """
5
+
6
+ from machine_dialect.ast.ast_node import ASTNode
7
+ from machine_dialect.compiler.context import CompilationContext
8
+ from machine_dialect.mir.hir_to_mir import lower_to_mir
9
+ from machine_dialect.mir.mir_dumper import DumpVerbosity, MIRDumper
10
+ from machine_dialect.mir.mir_module import MIRModule
11
+ from machine_dialect.mir.mir_printer import MIRDotExporter
12
+
13
+
14
+ class MIRGenerationPhase:
15
+ """MIR generation phase."""
16
+
17
+ def run(self, context: CompilationContext, hir: ASTNode) -> MIRModule | None:
18
+ """Run MIR generation phase.
19
+
20
+ Args:
21
+ context: Compilation context.
22
+ hir: High-level IR (currently AST).
23
+
24
+ Returns:
25
+ MIR module or None if generation failed.
26
+ """
27
+ if context.config.verbose:
28
+ print("Lowering to MIR...")
29
+
30
+ try:
31
+ # Pass module name if available
32
+ module_name = context.get_module_name()
33
+ mir_module = lower_to_mir(hir, module_name) # type: ignore[arg-type]
34
+
35
+ if context.config.verbose:
36
+ print(f"Generated MIR with {len(mir_module.functions)} functions")
37
+
38
+ # Dump MIR if requested
39
+ if context.config.dump_mir and not context.config.mir_phase_only:
40
+ self._dump_mir(mir_module, "initial", context)
41
+
42
+ # Export CFG if requested
43
+ if context.config.dump_cfg:
44
+ self._export_cfg(mir_module, context)
45
+
46
+ return mir_module
47
+
48
+ except Exception as e:
49
+ context.add_error(f"MIR generation error: {e}")
50
+ return None
51
+
52
+ def _dump_mir(self, module: MIRModule, phase: str, context: CompilationContext) -> None:
53
+ """Dump MIR representation.
54
+
55
+ Args:
56
+ module: MIR module to dump.
57
+ phase: Phase name for labeling.
58
+ context: Compilation context.
59
+ """
60
+ verbosity = DumpVerbosity.from_string(context.config.mir_dump_verbosity)
61
+ dumper = MIRDumper(verbosity=verbosity, use_color=True)
62
+
63
+ if phase == "initial":
64
+ print("\n=== MIR Representation ===")
65
+ else:
66
+ print(f"\n=== MIR ({phase}) ===")
67
+ dumper.dump_module(module)
68
+
69
+ def _export_cfg(self, module: MIRModule, context: CompilationContext) -> None:
70
+ """Export control flow graph.
71
+
72
+ Args:
73
+ module: MIR module.
74
+ context: Compilation context.
75
+ """
76
+ if not context.config.dump_cfg:
77
+ return
78
+
79
+ exporter = MIRDotExporter()
80
+ dot_content = exporter.export_module(module)
81
+
82
+ with open(context.config.dump_cfg, "w") as f:
83
+ f.write(dot_content)
84
+
85
+ # Always print CFG export message (not just in verbose mode)
86
+ print(f"Control flow graph exported to '{context.config.dump_cfg}'")
@@ -0,0 +1,110 @@
1
+ """Optimization phase of compilation.
2
+
3
+ This module handles the optimization phase of compilation.
4
+ """
5
+
6
+ from machine_dialect.compiler.context import CompilationContext
7
+ from machine_dialect.mir.mir_dumper import DumpVerbosity, MIRDumper
8
+ from machine_dialect.mir.mir_module import MIRModule
9
+ from machine_dialect.mir.optimize_mir import optimize_mir
10
+ from machine_dialect.mir.profiling.profile_reader import ProfileReader
11
+ from machine_dialect.mir.reporting.optimization_reporter import OptimizationReporter
12
+
13
+
14
+ class OptimizationPhase:
15
+ """Optimization phase."""
16
+
17
+ def run(self, context: CompilationContext, mir_module: MIRModule) -> MIRModule:
18
+ """Run optimization phase.
19
+
20
+ Args:
21
+ context: Compilation context.
22
+ mir_module: MIR module to optimize.
23
+
24
+ Returns:
25
+ Optimized MIR module.
26
+ """
27
+ if not context.should_optimize():
28
+ if context.config.verbose:
29
+ print("Skipping optimization (level 0)")
30
+ return mir_module
31
+
32
+ if context.config.verbose:
33
+ print(f"Running optimization level {context.config.optimization_level}...")
34
+
35
+ # Load profile data if available
36
+ profile_data = None
37
+ if context.config.profile_path and context.config.profile_path.exists():
38
+ reader = ProfileReader()
39
+ profile_data = reader.read_from_file(str(context.config.profile_path)) # type: ignore[attr-defined]
40
+ context.profile_data = profile_data
41
+ if context.config.verbose:
42
+ print(f"Loaded profile data from {context.config.profile_path}")
43
+
44
+ # Create optimization reporter
45
+ reporter = OptimizationReporter() if context.config.show_optimization_report else None
46
+ context.optimization_reporter = reporter
47
+
48
+ # Get optimization passes
49
+ passes = context.config.get_optimization_passes()
50
+
51
+ if context.config.verbose:
52
+ print(f"Running passes: {', '.join(passes)}")
53
+
54
+ # Create optimization config
55
+ from machine_dialect.mir.optimization_config import OptimizationConfig
56
+
57
+ opt_config = OptimizationConfig.from_level(int(context.config.optimization_level))
58
+
59
+ # Apply custom pass list if provided
60
+ custom_passes = None
61
+ if context.config.pass_pipeline:
62
+ custom_passes = passes
63
+
64
+ # Run optimization
65
+ optimized_module, stats = optimize_mir(
66
+ mir_module,
67
+ optimization_level=int(context.config.optimization_level),
68
+ config=opt_config,
69
+ debug=context.config.debug,
70
+ custom_passes=custom_passes,
71
+ )
72
+
73
+ # Store stats in reporter if provided
74
+ if reporter and stats:
75
+ for pass_name, pass_stats in stats.items():
76
+ reporter.start_pass(pass_name)
77
+ reporter.end_pass(metrics=pass_stats)
78
+
79
+ # Dump optimized MIR if requested
80
+ if context.config.dump_mir:
81
+ self._dump_mir(optimized_module, "optimized", context)
82
+
83
+ # Show optimization report if requested
84
+ if context.config.show_optimization_report and reporter:
85
+ self._show_optimization_report(reporter)
86
+
87
+ return optimized_module
88
+
89
+ def _dump_mir(self, module: MIRModule, phase: str, context: CompilationContext) -> None:
90
+ """Dump MIR representation.
91
+
92
+ Args:
93
+ module: MIR module to dump.
94
+ phase: Phase name for labeling.
95
+ context: Compilation context.
96
+ """
97
+ verbosity = DumpVerbosity.from_string(context.config.mir_dump_verbosity)
98
+ dumper = MIRDumper(verbosity=verbosity, use_color=True)
99
+
100
+ print(f"\n=== MIR ({phase}) ===")
101
+ dumper.dump_module(module)
102
+
103
+ def _show_optimization_report(self, reporter: OptimizationReporter) -> None:
104
+ """Show optimization report.
105
+
106
+ Args:
107
+ reporter: Optimization reporter.
108
+ """
109
+ print("\n=== Optimization Report ===")
110
+ print(reporter.generate_detailed_report())
@@ -0,0 +1,39 @@
1
+ """Parsing phase of compilation.
2
+
3
+ This module handles the syntactic analysis phase of compilation.
4
+ """
5
+
6
+ from machine_dialect.ast.ast_node import ASTNode
7
+ from machine_dialect.compiler.context import CompilationContext
8
+ from machine_dialect.parser.parser import Parser
9
+
10
+
11
+ class ParsingPhase:
12
+ """Syntactic analysis phase."""
13
+
14
+ def run(self, context: CompilationContext) -> ASTNode | None:
15
+ """Run parsing phase.
16
+
17
+ Args:
18
+ context: Compilation context.
19
+
20
+ Returns:
21
+ AST root node or None if parsing failed.
22
+ """
23
+ if context.config.verbose:
24
+ print("Parsing source into AST...")
25
+
26
+ parser = Parser()
27
+
28
+ ast = parser.parse(context.source_content)
29
+
30
+ # Check for parsing errors
31
+ if parser.has_errors():
32
+ for error in parser.errors:
33
+ context.add_error(f"Parse error: {error}")
34
+ return None
35
+
36
+ if context.config.verbose:
37
+ print("Successfully parsed AST")
38
+
39
+ return ast
@@ -0,0 +1,143 @@
1
+ """Compilation pipeline module.
2
+
3
+ This module orchestrates the entire compilation process through its phases.
4
+ """
5
+
6
+ from pathlib import Path
7
+
8
+ from machine_dialect.compiler.config import CompilerConfig
9
+ from machine_dialect.compiler.context import CompilationContext
10
+ from machine_dialect.compiler.phases.bytecode_optimization import BytecodeOptimizationPhase
11
+ from machine_dialect.compiler.phases.codegen import CodeGenerationPhase
12
+ from machine_dialect.compiler.phases.hir_generation import HIRGenerationPhase
13
+ from machine_dialect.compiler.phases.mir_generation import MIRGenerationPhase
14
+ from machine_dialect.compiler.phases.optimization import OptimizationPhase
15
+ from machine_dialect.compiler.phases.parsing import ParsingPhase
16
+ from machine_dialect.mir.mir_dumper import DumpVerbosity, MIRDumper
17
+
18
+
19
+ class CompilationPipeline:
20
+ """Manages the compilation pipeline."""
21
+
22
+ def __init__(self, config: CompilerConfig | None = None) -> None:
23
+ """Initialize the compilation pipeline.
24
+
25
+ Args:
26
+ config: Compiler configuration.
27
+ """
28
+ self.config = config or CompilerConfig()
29
+
30
+ # Initialize phases
31
+ self.parsing_phase = ParsingPhase()
32
+ self.hir_phase = HIRGenerationPhase()
33
+ self.mir_phase = MIRGenerationPhase()
34
+ self.optimization_phase = OptimizationPhase()
35
+ self.codegen_phase = CodeGenerationPhase()
36
+ self.bytecode_optimization_phase = BytecodeOptimizationPhase()
37
+
38
+ def compile_file(self, source_path: Path) -> CompilationContext:
39
+ """Compile a source file.
40
+
41
+ Args:
42
+ source_path: Path to source file.
43
+
44
+ Returns:
45
+ Compilation context with results.
46
+ """
47
+ # Create compilation context
48
+ context = CompilationContext(source_path=source_path, config=self.config)
49
+
50
+ # Read source file
51
+ try:
52
+ context.source_content = source_path.read_text()
53
+ except OSError as e:
54
+ context.add_error(f"Failed to read source file: {e}")
55
+ return context
56
+
57
+ # Run compilation pipeline
58
+ return self.compile(context)
59
+
60
+ def compile(self, context: CompilationContext) -> CompilationContext:
61
+ """Run the compilation pipeline.
62
+
63
+ Args:
64
+ context: Compilation context.
65
+
66
+ Returns:
67
+ Updated compilation context.
68
+ """
69
+ # Print "Compiling" message if verbose
70
+ if context.config.verbose:
71
+ print(f"Compiling {context.source_path}...")
72
+
73
+ # Phase 1: Syntactic Analysis (includes lexical analysis)
74
+ if not context.has_errors():
75
+ ast = self.parsing_phase.run(context)
76
+ if ast:
77
+ context.ast = ast
78
+ else:
79
+ return context
80
+ else:
81
+ return context
82
+
83
+ # Phase 2: HIR Generation (Desugaring)
84
+ if not context.has_errors():
85
+ hir = self.hir_phase.run(context, context.ast)
86
+ else:
87
+ return context
88
+
89
+ # Phase 3: MIR Generation
90
+ if not context.has_errors():
91
+ mir_module = self.mir_phase.run(context, hir)
92
+ if mir_module:
93
+ context.mir_module = mir_module
94
+ else:
95
+ return context
96
+ else:
97
+ return context
98
+
99
+ # Check if we should stop after MIR
100
+ if context.config.mir_phase_only:
101
+ self._dump_final_mir(context)
102
+ print("Stopping after MIR generation (--mir-phase flag)")
103
+ return context
104
+
105
+ # Phase 4: Optimization
106
+ if not context.has_errors() and context.should_optimize():
107
+ optimized_mir = self.optimization_phase.run(context, context.mir_module)
108
+ context.mir_module = optimized_mir
109
+ else:
110
+ if context.has_errors():
111
+ return context
112
+
113
+ # Phase 5: Code Generation
114
+ if not context.has_errors() and context.should_generate_bytecode():
115
+ bytecode_module = self.codegen_phase.run(context, context.mir_module)
116
+ if bytecode_module:
117
+ context.bytecode_module = bytecode_module
118
+ else:
119
+ return context
120
+ else:
121
+ return context
122
+
123
+ # Phase 6: Bytecode Optimization (after code generation)
124
+ if not context.has_errors() and context.bytecode_module and context.should_optimize():
125
+ optimized_bytecode = self.bytecode_optimization_phase.run(context, context.bytecode_module)
126
+ context.bytecode_module = optimized_bytecode
127
+
128
+ return context
129
+
130
+ def _dump_final_mir(self, context: CompilationContext) -> None:
131
+ """Dump final MIR when stopping at MIR phase.
132
+
133
+ Args:
134
+ context: Compilation context.
135
+ """
136
+ if not context.mir_module:
137
+ return
138
+
139
+ verbosity = DumpVerbosity.from_string(context.config.mir_dump_verbosity)
140
+ dumper = MIRDumper(verbosity=verbosity, use_color=True)
141
+
142
+ print("\n=== Final MIR ===")
143
+ dumper.dump_module(context.mir_module)
@@ -0,0 +1 @@
1
+ """Tests for the Machine Dialectâ„¢ compiler module."""