pyscript-programming-language 1.9.0__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.9.0/pyscript_programming_language.egg-info → pyscript_programming_language-1.10.0}/PKG-INFO +5 -4
  2. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/README.md +4 -3
  3. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/__init__.py +10 -4
  4. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/__init__.pyi +13 -6
  5. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/__main__.py +54 -8
  6. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/analyzer.py +46 -62
  7. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/buffer.py +13 -9
  8. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/cache.py +2 -4
  9. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/checks.py +2 -2
  10. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/constants.py +19 -8
  11. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/context.py +4 -2
  12. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/exceptions.py +16 -17
  13. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/handlers.py +9 -18
  14. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/highlight.py +110 -83
  15. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/interpreter.py +111 -65
  16. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/lexer.py +82 -72
  17. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/mapping.py +19 -2
  18. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/nodes.py +33 -4
  19. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/objects.py +46 -48
  20. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/parser.py +210 -160
  21. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/position.py +5 -9
  22. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/pysbuiltins.py +75 -32
  23. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/results.py +6 -4
  24. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/runner.py +39 -24
  25. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/symtab.py +34 -31
  26. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/token.py +2 -5
  27. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/__init__.py +2 -0
  28. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/ansi.py +22 -22
  29. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/debug.py +0 -1
  30. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/decorators.py +4 -3
  31. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/generic.py +14 -14
  32. pyscript_programming_language-1.10.0/pyscript/core/utils/jsdict.py +29 -0
  33. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/module.py +2 -1
  34. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/shell.py +5 -3
  35. pyscript_programming_language-1.10.0/pyscript/core/utils/similarity.py +22 -0
  36. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/version.py +5 -3
  37. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/ansi.pys +1 -1
  38. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/__init__.pys +3 -3
  39. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_dump.py +12 -1
  40. pyscript_programming_language-1.10.0/pyscript/lib/ast/ast_literal_eval.py +82 -0
  41. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_unparse.py +66 -10
  42. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_walk.py +15 -18
  43. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/brainfuck.pys +69 -76
  44. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/inspect.pys +1 -1
  45. pyscript_programming_language-1.10.0/pyscript/lib/jsdict.pys +5 -0
  46. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/parser.pys +10 -13
  47. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/site.pys +10 -13
  48. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0/pyscript_programming_language.egg-info}/PKG-INFO +5 -4
  49. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/SOURCES.txt +2 -2
  50. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/setup.py +1 -1
  51. pyscript_programming_language-1.9.0/pyscript/core/utils/similarity.py +0 -22
  52. pyscript_programming_language-1.9.0/pyscript/lib/ast/ast_literal_eval.py +0 -51
  53. pyscript_programming_language-1.9.0/pyscript/lib/jsdict.pys +0 -22
  54. pyscript_programming_language-1.9.0/pyscript/site-packages/67.pys +0 -1
  55. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/MANIFEST.in +0 -0
  56. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/__init__.py +0 -0
  57. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/bases.py +0 -0
  58. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/path.py +0 -0
  59. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/core/utils/string.py +0 -0
  60. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/__hello__.pys +0 -0
  61. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/dis.pys +0 -0
  62. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/explorer.pys +0 -0
  63. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/fpstimer.pys +0 -0
  64. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/getch.pys +0 -0
  65. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/keyword.pys +0 -0
  66. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/symtable.pys +0 -0
  67. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/sys.pys +0 -0
  68. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/token.pys +0 -0
  69. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/tokenize/__init__.pys +0 -0
  70. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/lib/tokenize/tok_untokenize.py +0 -0
  71. {pyscript_programming_language-1.9.0/pyscript/lib → pyscript_programming_language-1.10.0/pyscript/site-packages}/this.pys +0 -0
  72. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript/this.py +0 -0
  73. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  74. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/requires.txt +0 -0
  75. {pyscript_programming_language-1.9.0 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  76. {pyscript_programming_language-1.9.0 → 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.9.0
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
@@ -8,21 +8,26 @@ if __import__('sys').version_info < (3, 10):
8
8
 
9
9
  from . import core
10
10
 
11
- from .core.constants import DEFAULT, DEBUG, SILENT, RETURN_RESULT, HIGHLIGHT, NO_COLOR, REVERSE_POW_XOR
11
+ from .core.constants import (
12
+ DEFAULT, NO_COLOR, DEBUG, SILENT, RETURN_RESULT, DONT_SHOW_BANNER_ON_SHELL, HIGHLIGHT, DICT_TO_JSDICT
13
+ )
12
14
  from .core.cache import undefined, hook
13
- from .core.highlight import HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptLexer
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
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
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',
@@ -35,5 +40,6 @@ __all__ = (
35
40
  'pys_eval',
36
41
  'pys_require',
37
42
  'pys_shell',
43
+ 'PygmentsPyScriptStyle',
38
44
  'PygmentsPyScriptLexer'
39
45
  )
@@ -13,15 +13,19 @@ if TYPE_CHECKING:
13
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
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
@@ -53,13 +57,15 @@ def pys_highlight(
53
57
  def pys_exec(
54
58
  source: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | PysFileBuffer,
55
59
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
56
- flags: int = DEFAULT
60
+ flags: int = DEFAULT,
61
+ parser_flags: int = DEFAULT
57
62
  ) -> None | PysExecuteResult: ...
58
63
 
59
64
  def pys_eval(
60
65
  source: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | PysFileBuffer,
61
66
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
62
- flags: int = DEFAULT
67
+ flags: int = DEFAULT,
68
+ parser_flags: int = DEFAULT
63
69
  ) -> Any | PysExecuteResult: ...
64
70
 
65
71
  def pys_require(
@@ -69,7 +75,8 @@ def pys_require(
69
75
 
70
76
  def pys_shell(
71
77
  globals: Optional[dict[str, Any] | PysSymbolTable | PysUndefined] = None,
72
- flags: int = DEFAULT
78
+ flags: int = DEFAULT,
79
+ parser_flags: int = DEFAULT
73
80
  ) -> int | Any: ...
74
81
 
75
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)
@@ -22,22 +22,9 @@ 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
- def throw(self, message, position):
29
- if self.error is None:
30
- self.error = PysTraceback(
31
- SyntaxError(message),
32
- PysContext(
33
- file=self.node.position.file,
34
- flags=self.flags,
35
- parent=self.context,
36
- parent_entry_position=self.context_parent_entry_position
37
- ),
38
- position
39
- )
40
-
41
28
  @typechecked
42
29
  def analyze(self) -> PysTraceback | None:
43
30
  self.in_loop = 0
@@ -50,6 +37,19 @@ class PysAnalyzer(Pys):
50
37
  self.visit(self.node)
51
38
  return self.error
52
39
 
40
+ def throw(self, message, position):
41
+ if self.error is None:
42
+ self.error = PysTraceback(
43
+ SyntaxError(message),
44
+ PysContext(
45
+ file=self.node.position.file,
46
+ flags=self.flags,
47
+ parent=self.context_parent,
48
+ parent_entry_position=self.context_parent_entry_position
49
+ ),
50
+ position
51
+ )
52
+
53
53
  def visit(self, node):
54
54
  func = getattr(self, 'visit_' + type(node).__name__.removeprefix('Pys'), None)
55
55
  if not self.error and func:
@@ -106,11 +106,9 @@ class PysAnalyzer(Pys):
106
106
  if isinstance(element, tuple):
107
107
  token, value = element
108
108
  name = token.value
109
-
110
109
  if name in keyword_names:
111
110
  self.throw(f"duplicate argument {name!r} in call definition", token.position)
112
111
  return
113
-
114
112
  keyword_names.add(name)
115
113
 
116
114
  else:
@@ -136,6 +134,8 @@ class PysAnalyzer(Pys):
136
134
  if self.error:
137
135
  return
138
136
 
137
+ self.visit(node.invalid)
138
+
139
139
  elif node.style == 'pythonic':
140
140
  self.visit(node.valid)
141
141
  if self.error:
@@ -145,10 +145,7 @@ class PysAnalyzer(Pys):
145
145
  if self.error:
146
146
  return
147
147
 
148
- else:
149
- raise ValueError(f"unknown ternary operator style {node.style!r}")
150
-
151
- self.visit(node.invalid)
148
+ self.visit(node.invalid)
152
149
 
153
150
  def visit_BinaryOperatorNode(self, node):
154
151
  self.visit(node.left)
@@ -158,25 +155,12 @@ class PysAnalyzer(Pys):
158
155
  self.visit(node.right)
159
156
 
160
157
  def visit_UnaryOperatorNode(self, node):
161
- value = node.value
162
-
163
158
  if is_incremental(node.operand.type):
164
- type = value.__class__
165
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
166
162
 
167
- if type is PysKeywordNode:
168
- self.throw(f"cannot {operator} {value.name.value}", value.position)
169
- return
170
-
171
- elif isinstance(value, PysNode):
172
- if type not in (PysIdentifierNode, PysAttributeNode, PysSubscriptNode):
173
- self.throw(f"cannot {operator} literal", value.position)
174
- return
175
-
176
- else:
177
- raise TypeError("UnaryOperator: node.value is not PysNode")
178
-
179
- self.visit(value)
163
+ self.visit(node.value)
180
164
 
181
165
  def visit_StatementsNode(self, node):
182
166
  for element in node.body:
@@ -185,11 +169,8 @@ class PysAnalyzer(Pys):
185
169
  return
186
170
 
187
171
  def visit_AssignNode(self, node):
188
- self.visit_declaration_AssignNode(
189
- node.target,
190
- "cannot assign to expression here. Maybe you meant '==' instead of '='?"
191
- )
192
-
172
+ self.visit_declaration_AssignNode(node.target,
173
+ "cannot assign to expression here. Maybe you meant '==' instead of '='?")
193
174
  if self.error:
194
175
  return
195
176
 
@@ -248,8 +229,6 @@ class PysAnalyzer(Pys):
248
229
 
249
230
  if node.default:
250
231
  self.visit(node.default)
251
- if self.error:
252
- return
253
232
 
254
233
  def visit_TryNode(self, node):
255
234
  self.visit(node.body)
@@ -295,9 +274,6 @@ class PysAnalyzer(Pys):
295
274
  if self.error:
296
275
  return
297
276
 
298
- else:
299
- raise ValueError(f"unknown header struct {node.header}")
300
-
301
277
  self.in_loop += 1
302
278
 
303
279
  self.visit(node.body)
@@ -341,6 +317,22 @@ class PysAnalyzer(Pys):
341
317
  if node.else_body:
342
318
  self.visit(node.else_body)
343
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
+
344
336
  def visit_ClassNode(self, node):
345
337
  for decorator in node.decorators:
346
338
  self.visit(decorator)
@@ -471,13 +463,9 @@ class PysAnalyzer(Pys):
471
463
  self.throw(f"cannot {KEYWORDS['delete']} {target.name.value}", target.position)
472
464
  return
473
465
 
474
- elif isinstance(target, PysNode):
475
- if type is not PysIdentifierNode:
476
- self.throw(f"cannot {KEYWORDS['delete']} literal", target.position)
477
- return
478
-
479
- else:
480
- 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
481
469
 
482
470
  def visit_ContinueNode(self, node):
483
471
  if self.in_loop == 0:
@@ -515,7 +503,7 @@ class PysAnalyzer(Pys):
515
503
  else:
516
504
  self.visit(nslice)
517
505
 
518
- def visit_declaration_AssignNode(self, node, message):
506
+ def visit_declaration_AssignNode(self, node, message, operator_name='assign'):
519
507
  type = node.__class__
520
508
 
521
509
  if type is PysAttributeNode:
@@ -530,16 +518,12 @@ class PysAnalyzer(Pys):
530
518
 
531
519
  elif is_unpack_assignment(type):
532
520
  for element in node.elements:
533
- self.visit_declaration_AssignNode(element, message)
521
+ self.visit_declaration_AssignNode(element, message, operator_name)
534
522
  if self.error:
535
523
  return
536
524
 
537
525
  elif type is PysKeywordNode:
538
- self.throw(f"cannot assign to {node.name.value}", node.position)
526
+ self.throw(f"cannot {operator_name} to {node.name.value}", node.position)
539
527
 
540
- elif isinstance(node, PysNode):
541
- if type is not PysIdentifierNode:
542
- self.throw(message, node.position)
543
-
544
- else:
545
- raise TypeError("declaration AssignNode: node is not PysNode")
528
+ elif type is not PysIdentifierNode:
529
+ self.throw(message, node.position)
@@ -4,7 +4,8 @@ from .utils.generic import setimuattr
4
4
  from .utils.string import normstr
5
5
 
6
6
  from io import IOBase
7
- from typing import Callable, Iterable, Optional
7
+ from types import BuiltinMethodType
8
+ from typing import Iterable, Optional
8
9
 
9
10
  @immutable
10
11
  class PysBuffer(Pys):
@@ -14,15 +15,14 @@ class PysFileBuffer(PysBuffer):
14
15
 
15
16
  __slots__ = ('text', 'name')
16
17
 
17
- def __init__(
18
- self,
19
- text: str | bytes | bytearray | Iterable | Callable | IOBase | 'PysFileBuffer',
18
+ def __new__(
19
+ cls,
20
+ text: str | bytes | bytearray | Iterable | BuiltinMethodType | IOBase | 'PysFileBuffer',
20
21
  name: Optional[str | bytes] = None
21
- ) -> None:
22
+ ) -> 'PysFileBuffer':
22
23
 
23
24
  if isinstance(text, PysFileBuffer):
24
- name = normstr(text.name if name is None else name)
25
- text = normstr(text.text)
25
+ return text
26
26
 
27
27
  elif isinstance(text, IOBase):
28
28
  name = normstr(getattr(text, 'name', '<io>') if name is None else name)
@@ -32,8 +32,12 @@ class PysFileBuffer(PysBuffer):
32
32
  name = '<string>' if name is None else normstr(name)
33
33
  text = normstr(text)
34
34
 
35
- setimuattr(self, 'text', text)
36
- setimuattr(self, 'name', name)
35
+ instance = super().__new__(cls)
36
+
37
+ setimuattr(instance, 'text', text)
38
+ setimuattr(instance, 'name', name)
39
+
40
+ return instance
37
41
 
38
42
  def __repr__(self) -> str:
39
43
  return f'<FileBuffer from {self.name!r}>'
@@ -4,14 +4,12 @@ from .exceptions import PysTraceback
4
4
  from .utils.debug import print_display, print_traceback
5
5
  from .utils.decorators import inheritable, singleton
6
6
 
7
- from threading import RLock
8
7
  from typing import Any, Callable, Literal
9
8
 
10
9
  loading_modules = set()
11
- lock = RLock()
12
- modules = dict()
10
+ modules = {}
13
11
  path = [SITE_PACKAGES_PATH, LIBRARIES_PATH]
14
- singletons = dict()
12
+ singletons = {}
15
13
 
16
14
  @singleton
17
15
  @inheritable
@@ -10,8 +10,8 @@ is_expression = frozenset([
10
10
 
11
11
  is_statement = frozenset([
12
12
  PysStatementsNode, PysAssignNode, PysImportNode, PysIfNode, PysSwitchNode, PysTryNode, PysWithNode, PysForNode,
13
- PysWhileNode, PysDoWhileNode, PysClassNode, PysGlobalNode, PysReturnNode, PysThrowNode, PysAssertNode,
14
- PysDeleteNode, PysContinueNode, PysBreakNode
13
+ PysWhileNode, PysDoWhileNode, PysRepeatNode, PysClassNode, PysGlobalNode, PysReturnNode, PysThrowNode,
14
+ PysAssertNode, PysDeleteNode, PysContinueNode, PysBreakNode
15
15
  ]).__contains__
16
16
 
17
17
  is_unpack_assignment = frozenset([
@@ -85,7 +85,9 @@ TOKENS = MappingProxyType({
85
85
  'EQUAL-DOUBLE-LESS-THAN': ord('<') + DOUBLE + WITH_EQUAL,
86
86
  'EQUAL-DOUBLE-GREATER-THAN': ord('>') + DOUBLE + WITH_EQUAL,
87
87
  'NONE': SPECIAL,
88
+ 'MINUS-GREATER-THAN': ord('-') + SPECIAL,
88
89
  'EQUAL-ARROW': ord('>') + SPECIAL,
90
+ 'EXCLAMATION-GREATER-THAN': ord('!') + SPECIAL,
89
91
  'EXCLAMATION-TILDE': ord('~') + SPECIAL
90
92
  })
91
93
 
@@ -110,6 +112,7 @@ KEYWORDS = MappingProxyType({
110
112
  'do': 'do',
111
113
  'elif': 'elif',
112
114
  'else': 'else',
115
+ 'except': 'except',
113
116
  'extends': 'extends',
114
117
  'false': 'false',
115
118
  'finally': 'finally',
@@ -123,15 +126,20 @@ KEYWORDS = MappingProxyType({
123
126
  'in': 'in',
124
127
  'is': 'is',
125
128
  'match': 'match',
129
+ 'nil': 'nil',
126
130
  'none': 'none',
131
+ 'null': 'null',
127
132
  'not': 'not',
128
133
  'true': 'true',
129
134
  'of': 'of',
130
135
  'or': 'or',
136
+ 'raise': 'raise',
137
+ 'repeat': 'repeat',
131
138
  'return': 'return',
132
139
  'switch': 'switch',
133
140
  'throw': 'throw',
134
141
  'try': 'try',
142
+ 'until': 'until',
135
143
  'while': 'while',
136
144
  'with': 'with'
137
145
  })
@@ -139,15 +147,18 @@ KEYWORDS = MappingProxyType({
139
147
  CONSTANT_KEYWORDS = (
140
148
  KEYWORDS['__debug__'], KEYWORDS['False'], KEYWORDS['None'], KEYWORDS['True'], KEYWORDS['and'], KEYWORDS['class'],
141
149
  KEYWORDS['constructor'], KEYWORDS['extends'], KEYWORDS['func'], KEYWORDS['function'], KEYWORDS['false'],
142
- KEYWORDS['global'], KEYWORDS['in'], KEYWORDS['is'], KEYWORDS['not'], KEYWORDS['none'], KEYWORDS['of'],
143
- KEYWORDS['or'], KEYWORDS['true']
150
+ KEYWORDS['global'], KEYWORDS['in'], KEYWORDS['is'], KEYWORDS['not'], KEYWORDS['nil'], KEYWORDS['none'],
151
+ KEYWORDS['null'], KEYWORDS['of'], KEYWORDS['or'], KEYWORDS['true']
144
152
  )
145
153
 
146
154
  # flags
147
155
  DEFAULT = 0
148
- DEBUG = 1 << 0
149
- SILENT = 1 << 1
150
- RETURN_RESULT = 1 << 2
151
- HIGHLIGHT = 1 << 3
152
- NO_COLOR = 1 << 4
153
- REVERSE_POW_XOR = 1 << 5
156
+ NO_COLOR = 1 << 0
157
+ DEBUG = 1 << 1
158
+ SILENT = 1 << 2
159
+ RETURN_RESULT = 1 << 3
160
+ DONT_SHOW_BANNER_ON_SHELL = 1 << 4
161
+
162
+ # parser flags
163
+ HIGHLIGHT = 1 << 0
164
+ DICT_TO_JSDICT = 1 << 1