pyscript-programming-language 1.8.1__tar.gz → 1.10.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 (76) hide show
  1. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/PKG-INFO +5 -4
  2. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/README.md +4 -3
  3. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__init__.py +16 -8
  4. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__init__.pyi +22 -13
  5. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__main__.py +54 -8
  6. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/__init__.py +1 -1
  7. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/analyzer.py +66 -71
  8. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/buffer.py +14 -5
  9. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/cache.py +18 -19
  10. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/checks.py +3 -3
  11. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/constants.py +21 -8
  12. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/context.py +23 -14
  13. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/exceptions.py +36 -22
  14. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/handlers.py +9 -18
  15. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/highlight.py +127 -76
  16. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/interpreter.py +114 -69
  17. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/lexer.py +82 -72
  18. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/mapping.py +22 -3
  19. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/nodes.py +81 -45
  20. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/objects.py +46 -43
  21. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/parser.py +243 -168
  22. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/position.py +5 -9
  23. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/pysbuiltins.py +137 -80
  24. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/results.py +6 -4
  25. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/runner.py +41 -26
  26. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/symtab.py +35 -38
  27. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/token.py +4 -15
  28. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/__init__.py +2 -0
  29. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/ansi.py +29 -27
  30. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/debug.py +0 -1
  31. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/decorators.py +4 -3
  32. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/generic.py +14 -14
  33. pyscript_programming_language-1.10.0/pyscript/core/utils/jsdict.py +29 -0
  34. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/module.py +2 -1
  35. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/shell.py +5 -3
  36. pyscript_programming_language-1.10.0/pyscript/core/utils/similarity.py +22 -0
  37. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/string.py +3 -3
  38. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/version.py +6 -5
  39. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ansi.pys +1 -1
  40. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/__init__.pys +8 -9
  41. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_dump.py +14 -2
  42. pyscript_programming_language-1.10.0/pyscript/lib/ast/ast_literal_eval.py +82 -0
  43. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_unparse.py +73 -15
  44. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_walk.py +15 -18
  45. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/brainfuck.pys +69 -76
  46. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/explorer.pys +38 -70
  47. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/inspect.pys +1 -1
  48. pyscript_programming_language-1.10.0/pyscript/lib/jsdict.pys +5 -0
  49. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/parser.pys +10 -13
  50. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/site.pys +10 -13
  51. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/PKG-INFO +5 -4
  52. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/SOURCES.txt +2 -2
  53. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/setup.py +1 -1
  54. pyscript_programming_language-1.8.1/pyscript/core/utils/similarity.py +0 -22
  55. pyscript_programming_language-1.8.1/pyscript/lib/ast/ast_literal_eval.py +0 -51
  56. pyscript_programming_language-1.8.1/pyscript/lib/jsdict.pys +0 -25
  57. pyscript_programming_language-1.8.1/pyscript/site-packages/67.pys +0 -1
  58. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/MANIFEST.in +0 -0
  59. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/bases.py +0 -0
  60. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/path.py +0 -0
  61. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/__hello__.pys +0 -0
  62. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/dis.pys +0 -0
  63. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/fpstimer.pys +0 -0
  64. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/getch.pys +0 -0
  65. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/keyword.pys +0 -0
  66. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/symtable.pys +0 -0
  67. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/sys.pys +0 -0
  68. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/token.pys +0 -0
  69. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/tokenize/__init__.pys +0 -0
  70. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/tokenize/tok_untokenize.py +0 -0
  71. {pyscript_programming_language-1.8.1/pyscript/lib → pyscript_programming_language-1.10.0/pyscript/site-packages}/this.pys +0 -0
  72. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/this.py +0 -0
  73. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  74. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/requires.txt +0 -0
  75. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  76. {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.8.1
3
+ Version: 1.10.0
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: azzammuhyala
@@ -35,9 +35,9 @@ Dynamic: summary
35
35
 
36
36
  # PyScript
37
37
 
38
- <p align="center">
38
+ <div align="center">
39
39
  <img src="https://github.com/azzammuhyala/pyscript/blob/main/PyScript.png?raw=true" alt="PyScript Logo" width="200">
40
- </p>
40
+ </div>
41
41
 
42
42
  PyScript is a simple programming language built on top of Python. It combines some syntax from Python and JavaScript,
43
43
  so if you're already familiar with Python or JavaScript, or both, it should be quite easy to learn.
@@ -65,7 +65,7 @@ Next, after downloading and configuring the Python application, you can download
65
65
  [PyScript releases](https://github.com/azzammuhyala/pyscript/releases) or from Python Pip with this command
66
66
  (_Recommended_):
67
67
  ```sh
68
- python -m pip install -U pyscript-programming-language
68
+ pip install -U pyscript-programming-language
69
69
  ```
70
70
 
71
71
  After that, you can run the PyScript shell (_REPL_) with this command:
@@ -78,6 +78,7 @@ If successful, you can see the version, release date, and a `>>>` like Python sh
78
78
  [PyScript extension](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang) for Syntax Highlight!
79
79
 
80
80
  ## Syntax
81
+ Familiar? There it is!
81
82
  <pre><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a first number : &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><br><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a second number: &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><br><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">input</span><span style="color:#FFD705">(</span><span style="color:#CE9178">&quot;Enter an operation (+, -, *, /): &quot;</span><span style="color:#FFD705">)</span><br><br><span style="color:#C586C0">switch</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">strip</span><span style="color:#D45DBA">()</span><span style="color:#FFD705">)</span><br><span style="color:#FFD705">{</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;+&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> + </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} + {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;-&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> - </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} - {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;*&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> * </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} * {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;/&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> != </span><span style="color:#B5CEA8">0</span><span style="color:#D4D4D4"> ? </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> / </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> : </span><span style="color:#CE9178">&quot;Cannot be divided by 0!&quot;</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} / {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">default</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Unknown operation&quot;</span><span style="color:#D45DBA">)</span><br><span style="color:#FFD705">}</span></pre>
82
83
 
83
84
  ## Behind it
@@ -1,8 +1,8 @@
1
1
  # PyScript
2
2
 
3
- <p align="center">
3
+ <div align="center">
4
4
  <img src="https://github.com/azzammuhyala/pyscript/blob/main/PyScript.png?raw=true" alt="PyScript Logo" width="200">
5
- </p>
5
+ </div>
6
6
 
7
7
  PyScript is a simple programming language built on top of Python. It combines some syntax from Python and JavaScript,
8
8
  so if you're already familiar with Python or JavaScript, or both, it should be quite easy to learn.
@@ -30,7 +30,7 @@ Next, after downloading and configuring the Python application, you can download
30
30
  [PyScript releases](https://github.com/azzammuhyala/pyscript/releases) or from Python Pip with this command
31
31
  (_Recommended_):
32
32
  ```sh
33
- python -m pip install -U pyscript-programming-language
33
+ pip install -U pyscript-programming-language
34
34
  ```
35
35
 
36
36
  After that, you can run the PyScript shell (_REPL_) with this command:
@@ -43,6 +43,7 @@ If successful, you can see the version, release date, and a `>>>` like Python sh
43
43
  [PyScript extension](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang) for Syntax Highlight!
44
44
 
45
45
  ## Syntax
46
+ Familiar? There it is!
46
47
  <pre><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a first number : &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><br><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> = </span><span style="color:#4EC9B0">float</span><span style="color:#FFD705">(</span><span style="color:#DCDCAA">input</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Enter a second number: &quot;</span><span style="color:#D45DBA">)</span><span style="color:#FFD705">)</span><br><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4"> = </span><span style="color:#DCDCAA">input</span><span style="color:#FFD705">(</span><span style="color:#CE9178">&quot;Enter an operation (+, -, *, /): &quot;</span><span style="color:#FFD705">)</span><br><br><span style="color:#C586C0">switch</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">op</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">strip</span><span style="color:#D45DBA">()</span><span style="color:#FFD705">)</span><br><span style="color:#FFD705">{</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;+&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> + </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} + {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;-&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> - </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} - {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;*&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> * </span><span style="color:#8CDCFE">b</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} * {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">case</span><span style="color:#D4D4D4"> </span><span style="color:#CE9178">&#x27;/&#x27;</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#8CDCFE">result</span><span style="color:#D4D4D4"> = </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> != </span><span style="color:#B5CEA8">0</span><span style="color:#D4D4D4"> ? </span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4"> / </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4"> : </span><span style="color:#CE9178">&quot;Cannot be divided by 0!&quot;</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Result of {} / {} = {}&quot;</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">format</span><span style="color:#1A9FFF">(</span><span style="color:#8CDCFE">a</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">b</span><span style="color:#D4D4D4">, </span><span style="color:#8CDCFE">result</span><span style="color:#1A9FFF">)</span><span style="color:#D45DBA">)</span><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">break</span><br><br><span style="color:#D4D4D4"> </span><span style="color:#C586C0">default</span><span style="color:#D4D4D4">:</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Unknown operation&quot;</span><span style="color:#D45DBA">)</span><br><span style="color:#FFD705">}</span></pre>
47
48
 
48
49
  ## Behind it
@@ -1,5 +1,5 @@
1
1
  """
2
- PyScript is a programming language written in Python. \
2
+ PyScript is a programming language written 100% in Python. \
3
3
  This language is not isolated and is directly integrated with the Python's library and namespace levels.
4
4
  """
5
5
 
@@ -8,30 +8,38 @@ if __import__('sys').version_info < (3, 10):
8
8
 
9
9
  from . import core
10
10
 
11
- from .core.constants import DEFAULT, DEBUG, SILENT, RETRES, HIGHLIGHT, NO_COLOR, REVERSE_POW_XOR
12
- from .core.cache import undefined
13
- from .core.highlight import HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptLexer
11
+ from .core.constants import (
12
+ DEFAULT, NO_COLOR, DEBUG, SILENT, RETURN_RESULT, DONT_SHOW_BANNER_ON_SHELL, HIGHLIGHT, DICT_TO_JSDICT
13
+ )
14
+ from .core.cache import undefined, hook
15
+ from .core.highlight import (
16
+ HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
17
+ )
14
18
  from .core.runner import pys_exec, pys_eval, pys_require, pys_shell
15
- from .core.version import version_info, __version__, __date__
19
+ from .core.version import version, version_info, __version__, __date__
16
20
 
17
21
  __all__ = (
18
22
  'core',
19
23
  'DEFAULT',
24
+ 'NO_COLOR',
20
25
  'DEBUG',
21
26
  'SILENT',
22
- 'RETRES',
27
+ 'RETURN_RESULT',
28
+ 'DONT_SHOW_BANNER_ON_SHELL',
23
29
  'HIGHLIGHT',
24
- 'NO_COLOR',
25
- 'REVERSE_POW_XOR',
30
+ 'DICT_TO_JSDICT',
26
31
  'HLFMT_HTML',
27
32
  'HLFMT_ANSI',
28
33
  'HLFMT_BBCODE',
29
34
  'undefined',
35
+ 'hook',
36
+ 'version',
30
37
  'version_info',
31
38
  'pys_highlight',
32
39
  'pys_exec',
33
40
  'pys_eval',
34
41
  'pys_require',
35
42
  'pys_shell',
43
+ 'PygmentsPyScriptStyle',
36
44
  'PygmentsPyScriptLexer'
37
45
  )
@@ -1,8 +1,8 @@
1
- from typing import TYPE_CHECKING, Any, Callable, Iterator, Literal, Optional
1
+ from typing import TYPE_CHECKING, Any, Callable, Iterable, Literal, Optional
2
2
 
3
3
  if TYPE_CHECKING:
4
4
  from .core.buffer import PysFileBuffer
5
- from .core.cache import PysUndefined
5
+ from .core.cache import PysUndefined, PysHook
6
6
  from .core.highlight import _PysHighlightFormatter
7
7
  from .core.position import PysPosition
8
8
  from .core.results import PysExecuteResult
@@ -10,28 +10,34 @@ if TYPE_CHECKING:
10
10
  from .core.version import PysVersionInfo
11
11
 
12
12
  from io import IOBase
13
- from types import ModuleType
13
+ from types import BuiltinMethodType, ModuleType
14
14
 
15
15
  from . import core as core
16
- from .core.highlight import PygmentsPyScriptLexer as PygmentsPyScriptLexer
16
+ from .core.highlight import (
17
+ PygmentsPyScriptStyle as PygmentsPyScriptStyle,
18
+ PygmentsPyScriptLexer as PygmentsPyScriptLexer
19
+ )
17
20
 
18
21
  DEFAULT: int
22
+ NO_COLOR: int
19
23
  DEBUG: int
20
24
  SILENT: int
21
- RETRES: int
25
+ RETURN_RESULT: int
26
+ DONT_SHOW_BANNER_ON_SHELL: int
22
27
  HIGHLIGHT: int
23
- NO_COLOR: int
24
- REVERSE_POW_XOR: int
28
+ DICT_TO_JSDICT: int
25
29
 
26
30
  HLFMT_HTML: _PysHighlightFormatter
27
31
  HLFMT_ANSI: _PysHighlightFormatter
28
32
  HLFMT_BBCODE: _PysHighlightFormatter
29
33
 
30
34
  undefined: PysUndefined
35
+ hook: PysHook
36
+ version: str
31
37
  version_info: PysVersionInfo
32
38
 
33
39
  def pys_highlight(
34
- source: str | bytes | bytearray | Iterator | Callable | IOBase | PysFileBuffer,
40
+ source: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | PysFileBuffer,
35
41
  format: Optional[
36
42
  Callable[
37
43
  [
@@ -49,15 +55,17 @@ def pys_highlight(
49
55
  ) -> str: ...
50
56
 
51
57
  def pys_exec(
52
- source: str | bytes | bytearray | Iterator | Callable | IOBase | PysFileBuffer,
58
+ source: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | PysFileBuffer,
53
59
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
54
- flags: int = DEFAULT
60
+ flags: int = DEFAULT,
61
+ parser_flags: int = DEFAULT
55
62
  ) -> None | PysExecuteResult: ...
56
63
 
57
64
  def pys_eval(
58
- source: str | bytes | bytearray | Iterator | Callable | IOBase | PysFileBuffer,
65
+ source: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | PysFileBuffer,
59
66
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
60
- flags: int = DEFAULT
67
+ flags: int = DEFAULT,
68
+ parser_flags: int = DEFAULT
61
69
  ) -> Any | PysExecuteResult: ...
62
70
 
63
71
  def pys_require(
@@ -67,7 +75,8 @@ def pys_require(
67
75
 
68
76
  def pys_shell(
69
77
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
70
- flags: int = DEFAULT
78
+ flags: int = DEFAULT,
79
+ parser_flags: int = DEFAULT
71
80
  ) -> int | Any: ...
72
81
 
73
82
  __version__: str
@@ -1,12 +1,28 @@
1
1
  from .core.buffer import PysFileBuffer
2
2
  from .core.cache import path, undefined
3
- from .core.constants import DEFAULT, DEBUG, NO_COLOR
4
- from .core.highlight import HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight
3
+ from .core.constants import DEFAULT, DEBUG, DONT_SHOW_BANNER_ON_SHELL, NO_COLOR
4
+ from .core.highlight import (
5
+ HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
6
+ )
5
7
  from .core.runner import _normalize_globals, pys_runner, pys_shell
6
8
  from .core.utils.module import get_module_name_from_path
7
9
  from .core.utils.path import normpath
8
10
  from .core.version import __version__
9
11
 
12
+ try:
13
+ from pygments import highlight
14
+ from pygments.formatters import TerminalFormatter, TerminalTrueColorFormatter, Terminal256Formatter
15
+
16
+ FORMAT_PYGMENTS_MAP = {
17
+ 'pm-terminal': TerminalFormatter,
18
+ 'pm-true-terminal': TerminalTrueColorFormatter,
19
+ 'pm-256-terminal': Terminal256Formatter
20
+ }
21
+
22
+ PYGMENTS = True
23
+ except ImportError:
24
+ PYGMENTS = False
25
+
10
26
  from argparse import ArgumentParser
11
27
  from os import environ
12
28
 
@@ -58,7 +74,7 @@ parser.add_argument(
58
74
 
59
75
  parser.add_argument(
60
76
  '-l', '--highlight',
61
- choices=tuple(FORMAT_HIGHLIGHT_MAP.keys()),
77
+ choices=tuple(FORMAT_HIGHLIGHT_MAP.keys()) + tuple(FORMAT_PYGMENTS_MAP.keys() if PYGMENTS else ()),
62
78
  default=None,
63
79
  help="Generate highlight code from a 'file'"
64
80
  )
@@ -76,6 +92,12 @@ parser.add_argument(
76
92
  help="Set a Python recursion limit"
77
93
  )
78
94
 
95
+ parser.add_argument(
96
+ '-q',
97
+ action='store_true',
98
+ help="Don't print version and copyright messages on interactive startup"
99
+ )
100
+
79
101
  def argument_error(argument, message):
80
102
  parser.print_usage(sys.stderr)
81
103
  parser.exit(2, f"{parser.prog}: error: argument {argument}: {message}\n")
@@ -98,6 +120,8 @@ if args.debug:
98
120
  flags |= DEBUG
99
121
  if args.no_color or environ.get('NO_COLOR') is not None:
100
122
  flags |= NO_COLOR
123
+ if args.q:
124
+ flags |= DONT_SHOW_BANNER_ON_SHELL
101
125
 
102
126
  if args.file is not None:
103
127
  path = normpath(args.file)
@@ -122,7 +146,22 @@ if args.file is not None:
122
146
 
123
147
  if args.highlight:
124
148
  try:
125
- print(pys_highlight(file, FORMAT_HIGHLIGHT_MAP.get(args.highlight)))
149
+ if args.highlight in FORMAT_HIGHLIGHT_MAP:
150
+ print(
151
+ pys_highlight(
152
+ source=file,
153
+ format=FORMAT_HIGHLIGHT_MAP[args.highlight]
154
+ )
155
+ )
156
+ else:
157
+ print(
158
+ flush=True,
159
+ end=highlight(
160
+ code=file.text,
161
+ lexer=PygmentsPyScriptLexer(),
162
+ formatter=FORMAT_PYGMENTS_MAP[args.highlight](style=PygmentsPyScriptStyle)
163
+ )
164
+ )
126
165
  except BaseException as e:
127
166
  parser.error(f"file {path!r}: Highlight error: {e}")
128
167
 
@@ -135,9 +174,13 @@ if args.file is not None:
135
174
  )
136
175
 
137
176
  if args.inspect:
138
- code = pys_shell(result.context.symbol_table, result.context.flags)
177
+ code = pys_shell(
178
+ globals=result.context.symbol_table,
179
+ flags=result.context.flags,
180
+ parser_flags=result.parser_flags
181
+ )
139
182
  else:
140
- code = result.process()[0]
183
+ code = result.end_process()[0]
141
184
 
142
185
  elif args.command is not None:
143
186
  file = PysFileBuffer(args.command)
@@ -146,9 +189,12 @@ elif args.command is not None:
146
189
  mode='exec',
147
190
  symbol_table=_normalize_globals(file, undefined),
148
191
  flags=flags
149
- ).process()[0]
192
+ ).end_process()[0]
150
193
 
151
194
  else:
152
- code = pys_shell(undefined, flags)
195
+ code = pys_shell(
196
+ globals=undefined,
197
+ flags=flags
198
+ )
153
199
 
154
200
  sys.exit(code)
@@ -1,5 +1,5 @@
1
1
  """
2
- PyScript implementations.
2
+ The Core of PyScript Implementations.
3
3
  """
4
4
 
5
5
  from . import (
@@ -1,6 +1,6 @@
1
1
  from .bases import Pys
2
- from .checks import is_assign, is_incremental
3
- from .constants import TOKENS, DEFAULT
2
+ from .checks import is_unpack_assignment, is_incremental
3
+ from .constants import TOKENS, KEYWORDS, DEFAULT
4
4
  from .context import PysContext
5
5
  from .exceptions import PysTraceback
6
6
  from .nodes import PysNode, PysKeywordNode, PysIdentifierNode, PysAttributeNode, PysSubscriptNode
@@ -22,9 +22,21 @@ class PysAnalyzer(Pys):
22
22
 
23
23
  self.node = node
24
24
  self.flags = flags
25
- self.context = context_parent
25
+ self.context_parent = context_parent
26
26
  self.context_parent_entry_position = context_parent_entry_position
27
27
 
28
+ @typechecked
29
+ def analyze(self) -> PysTraceback | None:
30
+ self.in_loop = 0
31
+ self.in_function = 0
32
+ self.in_class = 0
33
+ self.in_switch = 0
34
+ self.parameters = set()
35
+ self.error = None
36
+
37
+ self.visit(self.node)
38
+ return self.error
39
+
28
40
  def throw(self, message, position):
29
41
  if self.error is None:
30
42
  self.error = PysTraceback(
@@ -32,23 +44,12 @@ class PysAnalyzer(Pys):
32
44
  PysContext(
33
45
  file=self.node.position.file,
34
46
  flags=self.flags,
35
- parent=self.context,
47
+ parent=self.context_parent,
36
48
  parent_entry_position=self.context_parent_entry_position
37
49
  ),
38
50
  position
39
51
  )
40
52
 
41
- @typechecked
42
- def analyze(self) -> PysTraceback | None:
43
- self.in_loop = 0
44
- self.in_function = 0
45
- self.in_switch = 0
46
- self.error = None
47
- self.parameters = set()
48
-
49
- self.visit(self.node)
50
- return self.error
51
-
52
53
  def visit(self, node):
53
54
  func = getattr(self, 'visit_' + type(node).__name__.removeprefix('Pys'), None)
54
55
  if not self.error and func:
@@ -105,11 +106,9 @@ class PysAnalyzer(Pys):
105
106
  if isinstance(element, tuple):
106
107
  token, value = element
107
108
  name = token.value
108
-
109
109
  if name in keyword_names:
110
110
  self.throw(f"duplicate argument {name!r} in call definition", token.position)
111
111
  return
112
-
113
112
  keyword_names.add(name)
114
113
 
115
114
  else:
@@ -135,6 +134,8 @@ class PysAnalyzer(Pys):
135
134
  if self.error:
136
135
  return
137
136
 
137
+ self.visit(node.invalid)
138
+
138
139
  elif node.style == 'pythonic':
139
140
  self.visit(node.valid)
140
141
  if self.error:
@@ -144,10 +145,7 @@ class PysAnalyzer(Pys):
144
145
  if self.error:
145
146
  return
146
147
 
147
- else:
148
- raise ValueError(f"unknown ternary operator style {node.style!r}")
149
-
150
- self.visit(node.invalid)
148
+ self.visit(node.invalid)
151
149
 
152
150
  def visit_BinaryOperatorNode(self, node):
153
151
  self.visit(node.left)
@@ -157,25 +155,12 @@ class PysAnalyzer(Pys):
157
155
  self.visit(node.right)
158
156
 
159
157
  def visit_UnaryOperatorNode(self, node):
160
- value = node.value
161
-
162
158
  if is_incremental(node.operand.type):
163
- type = value.__class__
164
159
  operator = 'increase' if node.operand.type == TOKENS['DOUBLE-PLUS'] else 'decrease'
160
+ self.visit_declaration_AssignNode(node.value, f"cannot {operator} literal", operator)
161
+ return
165
162
 
166
- if type is PysKeywordNode:
167
- self.throw(f"cannot {operator} {value.name.value}", value.position)
168
- return
169
-
170
- elif isinstance(value, PysNode):
171
- if type not in (PysIdentifierNode, PysAttributeNode, PysSubscriptNode):
172
- self.throw(f"cannot {operator} literal", value.position)
173
- return
174
-
175
- else:
176
- raise TypeError("UnaryOperator: node.value is not PysNode")
177
-
178
- self.visit(value)
163
+ self.visit(node.value)
179
164
 
180
165
  def visit_StatementsNode(self, node):
181
166
  for element in node.body:
@@ -184,11 +169,8 @@ class PysAnalyzer(Pys):
184
169
  return
185
170
 
186
171
  def visit_AssignNode(self, node):
187
- self.visit_declaration_AssignNode(
188
- node.target,
189
- "cannot assign to expression here. Maybe you meant '==' instead of '='?"
190
- )
191
-
172
+ self.visit_declaration_AssignNode(node.target,
173
+ "cannot assign to expression here. Maybe you meant '==' instead of '='?")
192
174
  if self.error:
193
175
  return
194
176
 
@@ -247,8 +229,6 @@ class PysAnalyzer(Pys):
247
229
 
248
230
  if node.default:
249
231
  self.visit(node.default)
250
- if self.error:
251
- return
252
232
 
253
233
  def visit_TryNode(self, node):
254
234
  self.visit(node.body)
@@ -294,9 +274,6 @@ class PysAnalyzer(Pys):
294
274
  if self.error:
295
275
  return
296
276
 
297
- else:
298
- raise ValueError(f"unknown header struct {node.header}")
299
-
300
277
  self.in_loop += 1
301
278
 
302
279
  self.visit(node.body)
@@ -340,6 +317,22 @@ class PysAnalyzer(Pys):
340
317
  if node.else_body:
341
318
  self.visit(node.else_body)
342
319
 
320
+ def visit_RepeatNode(self, node):
321
+ self.in_loop += 1
322
+
323
+ self.visit(node.body)
324
+ if self.error:
325
+ return
326
+
327
+ self.in_loop -= 1
328
+
329
+ self.visit(node.condition)
330
+ if self.error:
331
+ return
332
+
333
+ if node.else_body:
334
+ self.visit(node.else_body)
335
+
343
336
  def visit_ClassNode(self, node):
344
337
  for decorator in node.decorators:
345
338
  self.visit(decorator)
@@ -357,15 +350,23 @@ class PysAnalyzer(Pys):
357
350
  self.in_function = 0
358
351
  self.in_switch = 0
359
352
 
353
+ self.in_class += 1
354
+
360
355
  self.visit(node.body)
361
356
  if self.error:
362
357
  return
363
358
 
359
+ self.in_class -= 1
360
+
364
361
  self.in_loop = in_loop
365
362
  self.in_function = in_function
366
363
  self.in_switch = in_switch
367
364
 
368
365
  def visit_FunctionNode(self, node):
366
+ if node.constructor and self.in_class == 0:
367
+ self.throw(f"{KEYWORDS['constructor']} function outside of class", node.name.position)
368
+ return
369
+
369
370
  for decorator in node.decorators:
370
371
  self.visit(decorator)
371
372
  if self.error:
@@ -387,9 +388,10 @@ class PysAnalyzer(Pys):
387
388
  if self.error:
388
389
  return
389
390
 
390
- in_loop, in_switch, parameters = self.in_loop, self.in_switch, self.parameters
391
+ in_loop, in_class, in_switch, parameters = self.in_loop, self.in_class, self.in_switch, self.parameters
391
392
 
392
393
  self.in_loop = 0
394
+ self.in_class = 0
393
395
  self.in_switch = 0
394
396
 
395
397
  self.in_function += 1
@@ -403,20 +405,21 @@ class PysAnalyzer(Pys):
403
405
  self.parameters = parameters
404
406
 
405
407
  self.in_loop = in_loop
408
+ self.in_class = in_class
406
409
  self.in_switch = in_switch
407
410
 
408
411
  def visit_GlobalNode(self, node):
409
412
  if self.in_function == 0:
410
- self.throw("global outside of function", node.position)
413
+ self.throw(f"{KEYWORDS['global']} outside of function", node.position)
411
414
 
412
415
  for identifier in node.identifiers:
413
416
  if identifier.value in self.parameters:
414
- self.throw("name {!r} is parameter and global".format(identifier.value), identifier.position)
417
+ self.throw(f"name {identifier.value!r} is parameter and global", identifier.position)
415
418
  return
416
419
 
417
420
  def visit_ReturnNode(self, node):
418
421
  if self.in_function == 0:
419
- self.throw("return outside of function", node.position)
422
+ self.throw(f"{KEYWORDS['return']} outside of function", node.position)
420
423
  return
421
424
 
422
425
  if node.value:
@@ -457,24 +460,20 @@ class PysAnalyzer(Pys):
457
460
  return
458
461
 
459
462
  elif type is PysKeywordNode:
460
- self.throw(f"cannot delete {target.name.value}", target.position)
463
+ self.throw(f"cannot {KEYWORDS['delete']} {target.name.value}", target.position)
461
464
  return
462
465
 
463
- elif isinstance(target, PysNode):
464
- if type is not PysIdentifierNode:
465
- self.throw("cannot delete literal", target.position)
466
- return
467
-
468
- else:
469
- raise TypeError("DeleteNode: node.targets, target is not PysNode")
466
+ elif type is not PysIdentifierNode:
467
+ self.throw(f"cannot {KEYWORDS['delete']} literal", target.position)
468
+ return
470
469
 
471
470
  def visit_ContinueNode(self, node):
472
471
  if self.in_loop == 0:
473
- self.throw("continue outside of loop", node.position)
472
+ self.throw(f"{KEYWORDS['continue']} outside of loop", node.position)
474
473
 
475
474
  def visit_BreakNode(self, node):
476
475
  if self.in_loop == 0 and self.in_switch == 0:
477
- self.throw("break outside of loop or switch case", node.position)
476
+ self.throw(f"{KEYWORDS['break']} outside of loop or switch case", node.position)
478
477
 
479
478
  def visit_slice_SubscriptNode(self, nslice):
480
479
  type = nslice.__class__
@@ -504,7 +503,7 @@ class PysAnalyzer(Pys):
504
503
  else:
505
504
  self.visit(nslice)
506
505
 
507
- def visit_declaration_AssignNode(self, node, message):
506
+ def visit_declaration_AssignNode(self, node, message, operator_name='assign'):
508
507
  type = node.__class__
509
508
 
510
509
  if type is PysAttributeNode:
@@ -517,18 +516,14 @@ class PysAnalyzer(Pys):
517
516
 
518
517
  self.visit_slice_SubscriptNode(node.slice)
519
518
 
520
- elif is_assign(type):
519
+ elif is_unpack_assignment(type):
521
520
  for element in node.elements:
522
- self.visit_declaration_AssignNode(element, message)
521
+ self.visit_declaration_AssignNode(element, message, operator_name)
523
522
  if self.error:
524
523
  return
525
524
 
526
525
  elif type is PysKeywordNode:
527
- self.throw(f"cannot assign to {node.name.value}", node.position)
526
+ self.throw(f"cannot {operator_name} to {node.name.value}", node.position)
528
527
 
529
- elif isinstance(node, PysNode):
530
- if type is not PysIdentifierNode:
531
- self.throw(message, node.position)
532
-
533
- else:
534
- raise TypeError("declaration AssignNode: node is not PysNode")
528
+ elif type is not PysIdentifierNode:
529
+ self.throw(message, node.position)