multilingualprogramming 0.5.1__tar.gz → 0.6.0__tar.gz

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 (86) hide show
  1. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/PKG-INFO +4 -1
  2. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/README.md +3 -0
  3. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/codegen/executor.py +10 -7
  4. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/codegen/python_generator.py +25 -2
  5. multilingualprogramming-0.6.0/multilingualprogramming/codegen/wat_generator.py +1649 -0
  6. multilingualprogramming-0.6.0/multilingualprogramming/codegen/wat_generator_core.py +100 -0
  7. multilingualprogramming-0.6.0/multilingualprogramming/codegen/wat_generator_expression.py +109 -0
  8. multilingualprogramming-0.6.0/multilingualprogramming/codegen/wat_generator_loop.py +106 -0
  9. multilingualprogramming-0.6.0/multilingualprogramming/codegen/wat_generator_manifest.py +259 -0
  10. multilingualprogramming-0.6.0/multilingualprogramming/codegen/wat_generator_match.py +191 -0
  11. multilingualprogramming-0.6.0/multilingualprogramming/codegen/wat_generator_oop.py +403 -0
  12. multilingualprogramming-0.6.0/multilingualprogramming/codegen/wat_generator_support.py +161 -0
  13. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/lexer/lexer.py +102 -0
  14. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/lexer/token.py +3 -1
  15. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/lexer/token_types.py +1 -0
  16. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/parser/ast_nodes.py +8 -1
  17. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/parser/parser.py +36 -39
  18. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/parser/semantic_analyzer.py +22 -6
  19. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/usm/builtins_aliases.json +646 -2
  20. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/version.py +1 -1
  21. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming.egg-info/PKG-INFO +4 -1
  22. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming.egg-info/SOURCES.txt +7 -0
  23. multilingualprogramming-0.5.1/multilingualprogramming/codegen/wat_generator.py +0 -1339
  24. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/LICENSE +0 -0
  25. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/__init__.py +0 -0
  26. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/__main__.py +0 -0
  27. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/codegen/__init__.py +0 -0
  28. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/codegen/build_orchestrator.py +0 -0
  29. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/codegen/encoding_guard.py +0 -0
  30. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/codegen/repl.py +0 -0
  31. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/codegen/runtime_builtins.py +0 -0
  32. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/codegen/wasm_generator.py +0 -0
  33. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/core/__init__.py +0 -0
  34. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/core/ir.py +0 -0
  35. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/core/lowering.py +0 -0
  36. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/datetime/__init__.py +0 -0
  37. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/datetime/date_parser.py +0 -0
  38. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/datetime/mp_date.py +0 -0
  39. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/datetime/mp_datetime.py +0 -0
  40. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/datetime/mp_time.py +0 -0
  41. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/datetime/resource_loader.py +0 -0
  42. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/exceptions.py +0 -0
  43. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/imports.py +0 -0
  44. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/keyword/__init__.py +0 -0
  45. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/keyword/keyword_registry.py +0 -0
  46. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/keyword/keyword_validator.py +0 -0
  47. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/keyword/language_pack_validator.py +0 -0
  48. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/lexer/__init__.py +0 -0
  49. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/lexer/source_reader.py +0 -0
  50. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/numeral/__init__.py +0 -0
  51. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/numeral/abstract_numeral.py +0 -0
  52. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/numeral/complex_numeral.py +0 -0
  53. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/numeral/fraction_numeral.py +0 -0
  54. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/numeral/mp_numeral.py +0 -0
  55. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/numeral/numeral_converter.py +0 -0
  56. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/numeral/roman_numeral.py +0 -0
  57. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/numeral/unicode_numeral.py +0 -0
  58. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/parser/__init__.py +0 -0
  59. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/parser/ast_printer.py +0 -0
  60. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/parser/error_messages.py +0 -0
  61. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/parser/surface_normalizer.py +0 -0
  62. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/datetime/eras.json +0 -0
  63. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/datetime/formats.json +0 -0
  64. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/datetime/months.json +0 -0
  65. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/datetime/weekdays.json +0 -0
  66. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/parser/error_messages.json +0 -0
  67. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/repl/commands.json +0 -0
  68. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/usm/keywords.json +0 -0
  69. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/usm/operators.json +0 -0
  70. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/usm/schema.json +0 -0
  71. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/resources/usm/surface_patterns.json +0 -0
  72. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/runtime/backend_selector.py +0 -0
  73. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/runtime/numeric_primitives.py +0 -0
  74. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/runtime/python_fallbacks.py +0 -0
  75. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/unicode_string.py +0 -0
  76. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/wasm/loader.py +0 -0
  77. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/wasm/tuple_abi.py +0 -0
  78. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming/wasm/tuple_memory.py +0 -0
  79. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming.egg-info/dependency_links.txt +0 -0
  80. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming.egg-info/entry_points.txt +0 -0
  81. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming.egg-info/requires.txt +0 -0
  82. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/multilingualprogramming.egg-info/top_level.txt +0 -0
  83. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/pyproject.toml +0 -0
  84. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/setup.cfg +0 -0
  85. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/setup.py +0 -0
  86. {multilingualprogramming-0.5.1 → multilingualprogramming-0.6.0}/tests/tests.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multilingualprogramming
3
- Version: 0.5.1
3
+ Version: 0.6.0
4
4
  Summary: Python application for multilingual programming
5
5
  Author-email: John Samuel <johnsamuelwrites@example.com>
6
6
  License: GPL-3.0-or-later
@@ -301,6 +301,7 @@ multilingual run main_en.ml --lang en
301
301
  - Date/time: `MPDate`, `MPTime`, `MPDatetime`
302
302
  - Frontend: `Lexer`, `Parser`, AST nodes, `SemanticAnalyzer`
303
303
  - Runtime: `PythonCodeGenerator`, `RuntimeBuiltins`, `ProgramExecutor`, `REPL`
304
+ - WAT/WASM backend: `WATCodeGenerator` — compiles multilingual AST to executable WebAssembly (core language + OOP with stateful class instances)
304
305
 
305
306
  Additional syntax now supported:
306
307
 
@@ -396,6 +397,8 @@ Use this README for setup and workflow; use `docs/` for design rationale and pol
396
397
  - Development and debugging guide: [docs/development.md](docs/development.md)
397
398
  - Guide complet en francais: [docs/fr/programmation.md](docs/fr/programmation.md)
398
399
  - Language onboarding guide: [docs/language_onboarding.md](docs/language_onboarding.md)
400
+ - WAT/WASM architecture overview: [docs/WASM_ARCHITECTURE_OVERVIEW.md](docs/WASM_ARCHITECTURE_OVERVIEW.md)
401
+ - WAT/WASM OOP object model reference: [docs/wat_oop_model.md](docs/wat_oop_model.md)
399
402
  - Contribution guide: [CONTRIBUTING.md](CONTRIBUTING.md)
400
403
  - Release process: [docs/releasing.md](docs/releasing.md)
401
404
  - Changelog: [CHANGELOG.md](CHANGELOG.md)
@@ -265,6 +265,7 @@ multilingual run main_en.ml --lang en
265
265
  - Date/time: `MPDate`, `MPTime`, `MPDatetime`
266
266
  - Frontend: `Lexer`, `Parser`, AST nodes, `SemanticAnalyzer`
267
267
  - Runtime: `PythonCodeGenerator`, `RuntimeBuiltins`, `ProgramExecutor`, `REPL`
268
+ - WAT/WASM backend: `WATCodeGenerator` — compiles multilingual AST to executable WebAssembly (core language + OOP with stateful class instances)
268
269
 
269
270
  Additional syntax now supported:
270
271
 
@@ -360,6 +361,8 @@ Use this README for setup and workflow; use `docs/` for design rationale and pol
360
361
  - Development and debugging guide: [docs/development.md](docs/development.md)
361
362
  - Guide complet en francais: [docs/fr/programmation.md](docs/fr/programmation.md)
362
363
  - Language onboarding guide: [docs/language_onboarding.md](docs/language_onboarding.md)
364
+ - WAT/WASM architecture overview: [docs/WASM_ARCHITECTURE_OVERVIEW.md](docs/WASM_ARCHITECTURE_OVERVIEW.md)
365
+ - WAT/WASM OOP object model reference: [docs/wat_oop_model.md](docs/wat_oop_model.md)
363
366
  - Contribution guide: [CONTRIBUTING.md](CONTRIBUTING.md)
364
367
  - Release process: [docs/releasing.md](docs/releasing.md)
365
368
  - Changelog: [CHANGELOG.md](CHANGELOG.md)
@@ -16,7 +16,7 @@ import sys
16
16
 
17
17
  from multilingualprogramming.lexer.lexer import Lexer
18
18
  from multilingualprogramming.parser.parser import Parser
19
- from multilingualprogramming.parser.semantic_analyzer import SemanticAnalyzer
19
+ from multilingualprogramming.parser.semantic_analyzer import SemanticAnalyzer, Scope, Symbol
20
20
  from multilingualprogramming.codegen.python_generator import PythonCodeGenerator
21
21
  from multilingualprogramming.codegen.runtime_builtins import RuntimeBuiltins
22
22
  from multilingualprogramming.core.lowering import lower_to_core_ir
@@ -92,14 +92,17 @@ class ProgramExecutor:
92
92
  analyzer = SemanticAnalyzer(
93
93
  source_language=detected_language
94
94
  )
95
- # Pre-seed symbol table with runtime builtins so that
96
- # names like print, range, len, etc. are not flagged
97
- # as undefined.
95
+ # Pre-seed a builtins scope *below* the global scope so that
96
+ # names like print, range, len, etc. are found by lookup()
97
+ # but NOT by lookup_local(). This lets user code redeclare a
98
+ # builtin with `let x = ...` (VariableDeclaration) without
99
+ # triggering a spurious DUPLICATE_DEFINITION error.
98
100
  builtins_ns = RuntimeBuiltins(detected_language).namespace()
101
+ builtins_scope = Scope("builtins", "global")
99
102
  for name in builtins_ns:
100
- analyzer.symbol_table.define(
101
- name, "variable", line=0, column=0
102
- )
103
+ builtins_scope.define(Symbol(name, "variable"))
104
+ # Attach the builtins scope as the parent of the global scope.
105
+ analyzer.symbol_table.global_scope.parent = builtins_scope
103
106
  semantic_errors = analyzer.analyze(core_program.ast)
104
107
  if semantic_errors:
105
108
  return ExecutionResult(
@@ -6,9 +6,25 @@
6
6
 
7
7
  """Python code generator: transpiles the multilingual AST to valid Python source."""
8
8
 
9
+ from multilingualprogramming.core.ir import CoreIRProgram
9
10
  from multilingualprogramming.exceptions import CodeGenerationError
10
11
  from multilingualprogramming.numeral.mp_numeral import MPNumeral
11
- from multilingualprogramming.core.ir import CoreIRProgram
12
+
13
+
14
+ def _emit_raw_literal(prefix: str, value: str) -> str:
15
+ """Emit a raw string or raw bytes literal with the given prefix (r or rb).
16
+
17
+ Chooses the quote style (single, double, triple) to avoid unescapable
18
+ quote conflicts, since backslash escapes are not allowed in raw literals.
19
+ """
20
+ if '"' not in value:
21
+ return f'{prefix}"{value}"'
22
+ if "'" not in value:
23
+ return f"{prefix}'{value}'"
24
+ # Both quote chars present — use triple double-quotes if possible
25
+ if '"""' not in value:
26
+ return f'{prefix}"""{value}"""'
27
+ return f"{prefix}'''{value}'''"
12
28
 
13
29
 
14
30
  class PythonCodeGenerator:
@@ -364,8 +380,15 @@ class _ExpressionGenerator:
364
380
  return self._convert_numeral(node.value)
365
381
 
366
382
  def visit_StringLiteral(self, node):
383
+ if getattr(node, "raw", False):
384
+ return _emit_raw_literal("r", node.value)
367
385
  return repr(node.value)
368
386
 
387
+ def visit_BytesLiteral(self, node):
388
+ if getattr(node, "raw", False):
389
+ return _emit_raw_literal("rb", node.value)
390
+ return f"b{repr(node.value)}"
391
+
369
392
  def visit_DateLiteral(self, node):
370
393
  # Emit as a string for runtime parsing
371
394
  return repr(node.value)
@@ -511,7 +534,7 @@ class _ExpressionGenerator:
511
534
  # Single-element tuples need trailing comma: (x,)
512
535
  if len(node.elements) == 1:
513
536
  elems += ","
514
- return elems
537
+ return f"({elems})"
515
538
 
516
539
  def visit_ListComprehension(self, node):
517
540
  elem = self._expr(node.element)