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.
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/PKG-INFO +5 -4
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/README.md +4 -3
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__init__.py +16 -8
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__init__.pyi +22 -13
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__main__.py +54 -8
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/__init__.py +1 -1
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/analyzer.py +66 -71
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/buffer.py +14 -5
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/cache.py +18 -19
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/checks.py +3 -3
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/constants.py +21 -8
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/context.py +23 -14
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/exceptions.py +36 -22
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/handlers.py +9 -18
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/highlight.py +127 -76
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/interpreter.py +114 -69
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/lexer.py +82 -72
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/mapping.py +22 -3
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/nodes.py +81 -45
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/objects.py +46 -43
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/parser.py +243 -168
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/position.py +5 -9
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/pysbuiltins.py +137 -80
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/results.py +6 -4
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/runner.py +41 -26
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/symtab.py +35 -38
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/token.py +4 -15
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/__init__.py +2 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/ansi.py +29 -27
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/debug.py +0 -1
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/decorators.py +4 -3
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/generic.py +14 -14
- pyscript_programming_language-1.10.0/pyscript/core/utils/jsdict.py +29 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/module.py +2 -1
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/shell.py +5 -3
- pyscript_programming_language-1.10.0/pyscript/core/utils/similarity.py +22 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/string.py +3 -3
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/version.py +6 -5
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ansi.pys +1 -1
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/__init__.pys +8 -9
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_dump.py +14 -2
- pyscript_programming_language-1.10.0/pyscript/lib/ast/ast_literal_eval.py +82 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_unparse.py +73 -15
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/ast/ast_walk.py +15 -18
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/brainfuck.pys +69 -76
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/explorer.pys +38 -70
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/inspect.pys +1 -1
- pyscript_programming_language-1.10.0/pyscript/lib/jsdict.pys +5 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/parser.pys +10 -13
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/site.pys +10 -13
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/PKG-INFO +5 -4
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/SOURCES.txt +2 -2
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/setup.py +1 -1
- pyscript_programming_language-1.8.1/pyscript/core/utils/similarity.py +0 -22
- pyscript_programming_language-1.8.1/pyscript/lib/ast/ast_literal_eval.py +0 -51
- pyscript_programming_language-1.8.1/pyscript/lib/jsdict.pys +0 -25
- pyscript_programming_language-1.8.1/pyscript/site-packages/67.pys +0 -1
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/MANIFEST.in +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/bases.py +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/core/utils/path.py +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/__hello__.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/dis.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/fpstimer.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/getch.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/keyword.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/symtable.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/sys.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/token.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/tokenize/__init__.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/lib/tokenize/tok_untokenize.py +0 -0
- {pyscript_programming_language-1.8.1/pyscript/lib → pyscript_programming_language-1.10.0/pyscript/site-packages}/this.pys +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/this.py +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/requires.txt +0 -0
- {pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript_programming_language.egg-info/top_level.txt +0 -0
- {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.
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
|
|
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">"Enter a first number : "</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">"Enter a second number: "</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">"Enter an operation (+, -, *, /): "</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">'+'</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">"Result of {} + {} = {}"</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">'-'</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">"Result of {} - {} = {}"</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">'*'</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">"Result of {} * {} = {}"</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">'/'</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">"Cannot be divided by 0!"</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">"Result of {} / {} = {}"</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">"Unknown operation"</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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
|
|
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">"Enter a first number : "</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">"Enter a second number: "</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">"Enter an operation (+, -, *, /): "</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">'+'</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">"Result of {} + {} = {}"</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">'-'</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">"Result of {} - {} = {}"</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">'*'</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">"Result of {} * {} = {}"</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">'/'</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">"Cannot be divided by 0!"</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">"Result of {} / {} = {}"</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">"Unknown operation"</span><span style="color:#D45DBA">)</span><br><span style="color:#FFD705">}</span></pre>
|
|
47
48
|
|
|
48
49
|
## Behind it
|
{pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__init__.py
RENAMED
|
@@ -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
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
'
|
|
27
|
+
'RETURN_RESULT',
|
|
28
|
+
'DONT_SHOW_BANNER_ON_SHELL',
|
|
23
29
|
'HIGHLIGHT',
|
|
24
|
-
'
|
|
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
|
)
|
{pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__init__.pyi
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING, Any, Callable,
|
|
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
|
|
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
|
-
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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
|
{pyscript_programming_language-1.8.1 → pyscript_programming_language-1.10.0}/pyscript/__main__.py
RENAMED
|
@@ -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
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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
|
-
).
|
|
192
|
+
).end_process()[0]
|
|
150
193
|
|
|
151
194
|
else:
|
|
152
|
-
code = pys_shell(
|
|
195
|
+
code = pys_shell(
|
|
196
|
+
globals=undefined,
|
|
197
|
+
flags=flags
|
|
198
|
+
)
|
|
153
199
|
|
|
154
200
|
sys.exit(code)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from .bases import Pys
|
|
2
|
-
from .checks import
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
|
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
|
|
464
|
-
|
|
465
|
-
|
|
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
|
|
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
|
|
526
|
+
self.throw(f"cannot {operator_name} to {node.name.value}", node.position)
|
|
528
527
|
|
|
529
|
-
elif
|
|
530
|
-
|
|
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)
|