jaclang 0.0.2__tar.gz → 0.0.3__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.

Potentially problematic release.


This version of jaclang might be problematic. Click here for more details.

Files changed (74) hide show
  1. {jaclang-0.0.2 → jaclang-0.0.3}/PKG-INFO +1 -1
  2. jaclang-0.0.3/jaclang/cli/impl/__init__.py +1 -0
  3. jaclang-0.0.3/jaclang/cli/impl/cli_impl.jac +93 -0
  4. jaclang-0.0.3/jaclang/cli/impl/cmds_impl.jac +26 -0
  5. jaclang-0.0.3/jaclang/core/impl/__init__.py +1 -0
  6. jaclang-0.0.3/jaclang/core/impl/arch_impl.jac +112 -0
  7. jaclang-0.0.3/jaclang/core/impl/element_impl.jac +95 -0
  8. jaclang-0.0.3/jaclang/core/impl/exec_ctx_impl.jac +17 -0
  9. jaclang-0.0.3/jaclang/core/impl/memory_impl.jac +57 -0
  10. jaclang-0.0.3/jaclang/jac/passes/purple/impl/__init__.py +1 -0
  11. jaclang-0.0.3/jaclang/jac/passes/purple/impl/purple_pygen_pass_impl.jac +289 -0
  12. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/PKG-INFO +1 -1
  13. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/SOURCES.txt +10 -0
  14. {jaclang-0.0.2 → jaclang-0.0.3}/setup.py +1 -1
  15. {jaclang-0.0.2 → jaclang-0.0.3}/README.md +0 -0
  16. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/__init__.py +0 -0
  17. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/cli/__init__.py +0 -0
  18. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/cli/cli.jac +0 -0
  19. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/cli/cmds.jac +0 -0
  20. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/core/__init__.py +0 -0
  21. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/core/primitives.jac +0 -0
  22. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/__init__.py +0 -0
  23. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/absyntree.py +0 -0
  24. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/constant.py +0 -0
  25. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/importer.py +0 -0
  26. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/lexer.py +0 -0
  27. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/parser.py +0 -0
  28. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/__init__.py +0 -0
  29. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/__init__.py +0 -0
  30. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/ast_build_pass.py +0 -0
  31. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/blue_pygen_pass.py +0 -0
  32. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/decl_def_match_pass.py +0 -0
  33. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/import_pass.py +0 -0
  34. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/sub_node_tab_pass.py +0 -0
  35. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/__init__.py +0 -0
  36. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_ast_build_pass.py +0 -0
  37. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_blue_pygen_pass.py +0 -0
  38. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_decl_def_match_pass.py +0 -0
  39. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_import_pass.py +0 -0
  40. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_sub_node_pass.py +0 -0
  41. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/tests/test_type_analyze_pass.py +0 -0
  42. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/blue/type_analyze_pass.py +0 -0
  43. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/ir_pass.py +0 -0
  44. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/purple/__init__.py +0 -0
  45. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/passes/purple/purple_pygen_pass.jac +0 -0
  46. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/sym_table.py +0 -0
  47. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/__init__.py +0 -0
  48. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/__init__.py +0 -0
  49. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/activity.py +0 -0
  50. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/fam.jac +0 -0
  51. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/hello_world.jac +0 -0
  52. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/lexer_fam.jac +0 -0
  53. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/fixtures/stuff.jac +0 -0
  54. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/test_importer.py +0 -0
  55. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/test_lexer.py +0 -0
  56. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/test_parser.py +0 -0
  57. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/tests/test_utils.py +0 -0
  58. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/transform.py +0 -0
  59. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/transpiler.py +0 -0
  60. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/jac/utils.py +0 -0
  61. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/__init__.py +0 -0
  62. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/fstring_parser.py +0 -0
  63. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/log.py +0 -0
  64. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/sly/__init__.py +0 -0
  65. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/sly/docparse.py +0 -0
  66. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/sly/lex.py +0 -0
  67. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/sly/yacc.py +0 -0
  68. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/test.py +0 -0
  69. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/tests/__init__.py +0 -0
  70. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang/utils/tests/test_fstring_parser.py +0 -0
  71. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/dependency_links.txt +0 -0
  72. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/entry_points.txt +0 -0
  73. {jaclang-0.0.2 → jaclang-0.0.3}/jaclang.egg-info/top_level.txt +0 -0
  74. {jaclang-0.0.2 → jaclang-0.0.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaclang
3
- Version: 0.0.2
3
+ Version: 0.0.3
4
4
  Summary: UNKNOWN
5
5
  Home-page: https://github.com/Jaseci-Labs/jaclang
6
6
  Author: Jason Mars
@@ -0,0 +1 @@
1
+ """For setuptools to find this dir."""
@@ -0,0 +1,93 @@
1
+ """Implemenation for Jac's command line interface."""
2
+
3
+ :o:Command:a:init(func: callable) {
4
+ <s>.func = func;
5
+ <s>.sig = func |> inspect.signature;
6
+ }
7
+
8
+ :o:Command:a:call(*args: list, **kwargs: dict) {
9
+ return (*args, **kwargs) |> <s>.func;
10
+ }
11
+
12
+ :o:CommandRegistry:a:init {
13
+ <s>.registry = {};
14
+ <s>.parser = (prog="CLI") |> argparse.ArgumentParser;
15
+ <s>.sub_parsers =
16
+ (title="commands", dest="command") |> <s>.parser.add_subparsers;
17
+ }
18
+
19
+ :o:CommandRegistry:a:register(func: callable) {
20
+ name = func.__name__;
21
+ cmd = func |> Command;
22
+ <s>.registry[name] = cmd;
23
+ cmd_parser = name |> <s>.sub_parsers.add_parser;
24
+ for param_name, param in |> cmd.sig.parameters.items {
25
+ if param_name == "args" {
26
+ ('args', nargs=argparse.REMAINDER)
27
+ |> cmd_parser.add_argument;
28
+ }
29
+ elif param.default is param.empty {
30
+ (f"-{param_name[:1]}", f"--{param_name}",
31
+ required=True, type=param.annotation|>eval)
32
+ |> cmd_parser.add_argument;
33
+ }
34
+ else {
35
+ (f"-{param_name[:1]}", f"--{param_name}",
36
+ default=param.default, type=param.annotation|>eval)
37
+ |> cmd_parser.add_argument;
38
+ }
39
+ }
40
+ return func;
41
+ }
42
+
43
+ :o:CommandRegistry:a:get(name: str) -> Command {
44
+ return name |> <s>.registry.get;
45
+ }
46
+
47
+ :o:CommandRegistry:a:items -> dict[str, Command] {
48
+ return |> <s>.registry.items;
49
+ }
50
+
51
+
52
+ :o:CommandShell:a:init (cmd_reg: CommandRegistry) {
53
+ <s>.cmd_reg = cmd_reg;
54
+ <s> |> cmd.Cmd.__init__;
55
+ }
56
+
57
+ :o:CommandShell:a:do_exit(arg: list) -> bool {
58
+ return True;
59
+ }
60
+
61
+ :o:CommandShell:a:default(line: str) {
62
+ try {
63
+ args = |> line.split |> <s>.cmd_reg.parser.parse_args |> vars;
64
+ command = args["command"] |> <s>.cmd_reg.get;
65
+ if command {
66
+ args.pop("command");
67
+ ret = **args |> command.call;
68
+ if ret {
69
+ ret |> print;
70
+ }
71
+ }
72
+ }
73
+ except Exception as e {
74
+ e |> print;
75
+ }
76
+ }
77
+
78
+ :a:start_cli {
79
+ parser = cmd_registry.parser;
80
+ args = |> parser.parse_args;
81
+ command = args.command |> cmd_registry.get;
82
+ if command {
83
+ args = args |> vars;
84
+ "command" |> args.pop;
85
+ ret = **args |> command.call;
86
+ if ret {
87
+ ret |> print;
88
+ }
89
+ }
90
+ else {
91
+ shell = |> CommandShell(cmd_registry).cmdloop;
92
+ }
93
+ }
@@ -0,0 +1,26 @@
1
+ """Implementations for the jac command line interface."""
2
+ import:py from os, path;
3
+
4
+ :a:load(filename: str) {
5
+ if filename.endswith(".jac"){
6
+ [base, mod] = path.split(filename);
7
+ base = './' if not base else base;
8
+ mod=mod[:-4];
9
+ __jac_import__(target=mod, base_path=base);
10
+ } else {
11
+ "Not a .jac file." :> print;
12
+ }
13
+ }
14
+
15
+
16
+ :a:run(filename: str, entrypoint: str, args: list) {
17
+ if filename.endswith(".jac"){
18
+ [base, mod] = path.split(filename);
19
+ base = './' if not base else base;
20
+ mod=mod[:-4];
21
+ mod = __jac_import__(target=mod, base_path=base);
22
+ :> ((mod, entrypoint) :> getattr );
23
+ } else {
24
+ "Not a .jac file." :> print;
25
+ }
26
+ }
@@ -0,0 +1 @@
1
+ """For setuptools to find this dir."""
@@ -0,0 +1,112 @@
1
+ """Implementation for Jac's Element Abstractions"""
2
+ import:py from jaclang.jac.constant, EdgeDir;
3
+
4
+ :o:Node:a:__call__
5
+ (walk: Walker) {
6
+ if not (walk, Walker) :> isinstance {
7
+ raise ("Argument must be a Walker instance") :> TypeError;
8
+ }
9
+ <self> :> walk;
10
+ }
11
+
12
+ :o:Node:a:_jac_connect_node_
13
+ (nd: Node, edg: Edge) -> Node {
14
+ (<self>, nd) :> edg._jac_attach_;
15
+ return <self>;
16
+ }
17
+
18
+ :o:Node:a:_jac_edges_to_nodes_
19
+ (dir: EdgeDir) -> list[Node] {
20
+ ret_nodes = [];
21
+ if dir in [EdgeDir.OUT, EdgeDir.ANY] {
22
+ for i in <self>._jac_edges_[EdgeDir.OUT] {
23
+ ret_nodes.append(i._jac_target_);
24
+ }
25
+ } elif dir in [EdgeDir.IN, EdgeDir.ANY] {
26
+ for i in <self>._jac_edges_[EdgeDir.IN] {
27
+ ret_nodes.append(i._jac_source_);
28
+ }
29
+
30
+ }
31
+ return ret_nodes;
32
+ }
33
+
34
+ :o:Edge:a:__call__
35
+ (walk: Walker) {
36
+ if not (walk, Walker) :> isinstance {
37
+ raise ("Argument must be a Walker instance") :> TypeError;
38
+ }
39
+ <self>._jac_target_ :> walk;
40
+ }
41
+
42
+ :o:Edge:a:_jac_apply_dir_
43
+ (dir: EdgeDir) -> Edge {
44
+ <self>._jac_dir_ = dir;
45
+ return <self>;
46
+ }
47
+
48
+ :o:Edge:a:_jac_attach_
49
+ (src: Node, trg: Node) -> Edge {
50
+ if <self>._jac_dir_ == EdgeDir.IN {
51
+ <self>._jac_source_ = trg;
52
+ <self>._jac_target_ = src;
53
+ <self> :> src._jac_edges_[EdgeDir.IN].append;
54
+ <self> :> trg._jac_edges_[EdgeDir.OUT].append;
55
+ } else {
56
+ <self>._jac_source_ = src;
57
+ <self>._jac_target_ = trg;
58
+ <self> :> src._jac_edges_[EdgeDir.OUT].append;
59
+ <self> :> trg._jac_edges_[EdgeDir.IN].append;
60
+ }
61
+
62
+ return <self>;
63
+ }
64
+
65
+ :o:Walker:a:__call__
66
+ (nd: Node) {
67
+ <self>._jac_path_ = [];
68
+ <self>._jac_next_ = [nd];
69
+ walker_type = <self>.__class__.__name__;
70
+ node_type = nd.__class__.__name__;
71
+ while <self>._jac_next_ :> len {
72
+ nd = 0 :> <self>._jac_next_.pop;
73
+
74
+ for i in nd._jac_ds_entry_funcs {
75
+ if i['func'].__qualname__.split(".")[0] == node_type and
76
+ <self>:>type in i['types'] {
77
+ (nd, <self>) :> i['func'];
78
+ }
79
+ }
80
+ for i in <self>._jac_ds_entry_funcs {
81
+ if i['func'].__qualname__.split(".")[0] == walker_type and
82
+ (nd:>type in i['types'] or nd in i['types']) { # if nd==root direct chec
83
+ (<self>, nd) :> i['func'];
84
+ }
85
+ }
86
+ for i in <self>._jac_ds_exit_funcs {
87
+ if i['func'].__qualname__.split(".")[0] == walker_type and
88
+ (nd:>type in i['types'] or nd in i['types']) {
89
+ (<self>, nd) :> i['func'];
90
+ }
91
+ }
92
+ for i in nd._jac_ds_exit_funcs {
93
+ if i['func'].__qualname__.split(".")[0] == node_type and
94
+ <self>:>type in i['types'] {
95
+ (nd, <self>) :> i['func'];
96
+ }
97
+ }
98
+ nd :> <self>._jac_path_.append;
99
+ }
100
+ }
101
+
102
+ :o:Walker:a:_jac_visit_
103
+ (nds: list[Node]|list[Edge]) {
104
+ for i in nds {
105
+ i :> <self>._jac_next_.append;
106
+ }
107
+ return nds :> len;
108
+ }
109
+
110
+ :o:Walker:a:_jac_disengage_ {
111
+ <self>._jac_next_ = [];
112
+ }
@@ -0,0 +1,95 @@
1
+ """Implementation for Jac's Element Abstractions"""
2
+
3
+ :enum:AccessMode {
4
+ READ_ONLY,
5
+ READ_WRITE,
6
+ PRIVATE
7
+ }
8
+
9
+ :object:Element:ability:init
10
+ (_jac_exec_ctx: ExecutionContext) {
11
+ <self>.__jinfo = _jac_exec_ctx :> ExecutionContext;
12
+ }
13
+
14
+ :object:Element:ability:_jac_make_public_ro {
15
+ <self>.__jinfo.access_mode = AccessMode.READ_ONLY;
16
+ }
17
+
18
+ :object:Element:ability:_jac_make_public_rw {
19
+ <self>.__jinfo.access_mode = AccessMode.READ_WRITE;
20
+ }
21
+
22
+ :object:Element:ability:_jac_make_private {
23
+ <self>.__jinfo.access_mode = AccessMode.PRIVATE;
24
+ }
25
+
26
+ :object:Element:ability:_jac_is_public_ro -> bool {
27
+ return <self>.__jinfo.access_mode == AccessMode.READ_ONLY;
28
+ }
29
+
30
+ :object:Element:ability:_jac_is_public_rw -> bool {
31
+ return <self>.__jinfo.access_mode == AccessMode.READ_WRITE;
32
+ }
33
+
34
+ :object:Element:ability:_jac_is_private -> bool {
35
+ return <self>.__jinfo.access_mode == AccessMode.PRIVATE;
36
+ }
37
+
38
+ :object:Element:ability:_jac_is_readable
39
+ (caller_id: UUID) -> bool {
40
+ return (
41
+ caller_id == <self>.owner_id
42
+ or |> <self>.is_public_read
43
+ or caller_id in <self>.ro_access
44
+ or caller_id in <self>.rw_access
45
+ );
46
+ }
47
+
48
+ :object:Element:ability:_jac_is_writable
49
+ (caller_id: UUID) -> bool {
50
+ return (
51
+ caller_id == <self>.owner_id
52
+ or |> <self>.is_public_write
53
+ or caller_id in <self>.rw_access
54
+ );
55
+ }
56
+
57
+ :object:Element:ability:_jac_give_access
58
+ (caller_id: UUID, read_write: bool = False) {
59
+ if read_write {
60
+ caller_id |> <self>.rw_access.add;
61
+ }
62
+ else {
63
+ caller_id |> add .> ro_access .> <self>;
64
+ }
65
+ }
66
+
67
+ :object:Element:ability:_jac_revoke_access
68
+ (caller_id: UUID) {
69
+ caller_id |> <self>.ro_access.discard;
70
+ caller_id |> <self>.rw_access.discard;
71
+ }
72
+
73
+ :object:Object:ability:_jac_on_entry
74
+ (cls: type, triggers: list) {
75
+ can decorator(func: callable) -> callable {
76
+ cls._jac_ds_entry_funcs.append({'types': triggers, 'func': func});
77
+ can wrapper(*args: list, **kwargs: dict) -> callable {
78
+ return func(*args, **kwargs);
79
+ }
80
+ return wrapper;
81
+ }
82
+ return decorator;
83
+ }
84
+
85
+ :object:Object:ability:_jac_on_exit
86
+ (cls: type, triggers: list) {
87
+ can decorator(func: callable) -> callable {
88
+ cls._jac_ds_exit_funcs.append({'types': triggers, 'func': func});
89
+ can wrapper(*args: list, **kwargs: dict) -> callable {
90
+ return func(*args, **kwargs);
91
+ }
92
+ return wrapper;
93
+ }
94
+ return decorator;
95
+ }
@@ -0,0 +1,17 @@
1
+ """Implementation for Jac's Element Abstractions"""
2
+ import:py from uuid, UUID, uuid4;
3
+
4
+ :object:ExecutionContext:a:init
5
+ (master: UUID, memory: Memory) {
6
+ <self>.master = master;
7
+ <self>.memory = memory;
8
+ }
9
+
10
+ :object:ExecutionContext:a:get_root
11
+ () {
12
+ if <self>.master :> type == UUID {
13
+ <self>.master = Master();
14
+ }
15
+ return <self>.master.root_node;
16
+ }
17
+
@@ -0,0 +1,57 @@
1
+ """Implementation for Jac's Element Abstractions"""
2
+ import:py sys;
3
+
4
+ :object:Memory:ability:get_obj
5
+ (caller_id: UUID, item_id: UUID, override: bool = False) -> Element? {
6
+ ret = item_id |> <self>.index.get;
7
+ if override or (ret is not None and caller_id |> ret.__is_readable) {
8
+ return ret;
9
+ }
10
+ }
11
+
12
+ :object:Memory:ability:has_obj
13
+ (item_id: UUID) -> bool {
14
+ return item_id in <self>.index;
15
+ }
16
+
17
+ :object:Memory:ability:save_obj
18
+ (caller_id: UUID, item: Element) {
19
+ if caller_id |> item.is_writable {
20
+ <self>.index[item.id] = item;
21
+ if item._persist {
22
+ item |> <self>.save_obj_list.add;
23
+ }
24
+ }
25
+ <self>.mem[item.id] = item;
26
+ if item._persist {
27
+ item |> <self>.save_obj_list.add;
28
+ }
29
+ }
30
+
31
+ :object:Memory:ability:del_obj
32
+ (caller_id: UUID, item: Element) {
33
+ if caller_id |> item.is_writable {
34
+ <self>.index.pop(item.id);
35
+ if item._persist {
36
+ item |> <self>.save_obj_list.remove;
37
+ }
38
+ }
39
+ }
40
+
41
+ :object:Memory:ability:get_object_distribution -> dict {
42
+ dist = {};
43
+ for i in |> <self>.index.keys {
44
+ t = <self>.index[i] |> type;
45
+ if t in dist {
46
+ dist[t] += 1;
47
+ }
48
+ else {
49
+ dist[t] = 1;
50
+ }
51
+ }
52
+ return dist;
53
+ }
54
+
55
+ :object:Memory:ability:get_mem_size -> float {
56
+ return (<self>.index |> sys.getsizeof) / 1024.0;
57
+ }
@@ -0,0 +1 @@
1
+ """For setuptools to find this dir."""
@@ -0,0 +1,289 @@
1
+ """First Jac pass bootstrapped in Jac"""
2
+ import:py from jaclang.jac.constant, Constants as C, EdgeDir;
3
+
4
+ :object:PurplePygenPass:ability:add_element_import
5
+ (arch: str) {
6
+ (<self>.preamble, f"from jaclang.core import {arch} as _jac_{arch}_")
7
+ |> <self>.emit_ln_unique;
8
+ }
9
+
10
+ :object:PurplePygenPass:ability:add_exec_context {
11
+ (<self>.preamble, f"from jaclang.core import exec_ctx as {C.EXEC_CONTEXT}")
12
+ |> <self>.emit_ln_unique;
13
+ }
14
+
15
+ :object:PurplePygenPass:ability:add_edge_directions {
16
+ (<self>.preamble, f"from jaclang.jac.constant import EdgeDir as {C.EDGE_DIR}")
17
+ |> <self>.emit_ln_unique;
18
+ }
19
+
20
+ :object:PurplePygenPass:ability:needs_jac_import {
21
+ (<self>.preamble, "from jaclang import jac_purple_import as __jac_import__")
22
+ |> <self>.emit_ln_unique;
23
+ }
24
+
25
+ """
26
+ Sub objects.
27
+
28
+ name: Name,
29
+ arch_type: Token,
30
+ doc: Optional[DocString],
31
+ decorators: Optional["Decorators"],
32
+ access: Optional[Token],
33
+ base_classes: "BaseClasses",
34
+ body: Optional["ArchBlock"],
35
+ """
36
+ :object:PurplePygenPass:ability:exit_architype
37
+ (nd: ast.Architype) {
38
+ |> <self>.add_exec_context;
39
+ if nd.decorators {
40
+ (nd, nd.decorators.meta["py_code"]) |> <self>.emit_ln;
41
+ }
42
+ arch_type=nd.arch_type.name;
43
+ arch_insert = "";
44
+ if arch_type == Tok.KW_OBJECT {
45
+ "Object" |> <self>.add_element_import;
46
+ arch_insert = C.OBJECT_CLASS;
47
+ }
48
+ elif arch_type == Tok.KW_NODE {
49
+ "Node" |> <self>.add_element_import;
50
+ arch_insert = C.NODE_CLASS;
51
+ }
52
+ elif arch_type == Tok.KW_EDGE {
53
+ "Edge" |> <self>.add_element_import;
54
+ arch_insert = C.EDGE_CLASS;
55
+ }
56
+ elif arch_type == Tok.KW_WALKER {
57
+ "Walker" |> <self>.add_element_import;
58
+ arch_insert = C.WALKER_CLASS;
59
+ }
60
+ if nd.base_classes.base_classes |> len {
61
+ (nd, f"class {nd.name.meta['py_code']}"
62
+ f"({nd.base_classes.meta['py_code']}, {arch_insert}):")
63
+ |> <self>.emit_ln;
64
+ } else {
65
+ (nd, f"class {nd.name.meta['py_code']}({arch_insert}):") |> <self>.emit_ln;
66
+ }
67
+ <self>.indent_level += 1;
68
+ if nd.doc {
69
+ (nd, nd.doc.meta["py_code"]) |> <self>.emit_ln; }
70
+ if nd.body {
71
+ (nd, nd.body.meta["py_code"]) |> <self>.emit_ln; }
72
+ else {
73
+ nd.name.meta["py_code"] |> <self>.decl_def_missing; }
74
+ <self>.indent_level -= 1;
75
+ }
76
+
77
+
78
+ """Sub objects.
79
+
80
+ name: Name,
81
+ is_func: bool,
82
+ is_async: bool,
83
+ doc: Optional[DocString],
84
+ decorators: Optional["Decorators"],
85
+ access: Optional[Token],
86
+ signature: Optional["FuncSignature | TypeSpec | EventSignature"],
87
+ body: Optional["CodeBlock"],
88
+ arch_attached: Optional["ArchBlock"] = None,
89
+ """
90
+ :object:PurplePygenPass:ability:exit_ability
91
+ (nd: ast.Ability) {
92
+ "Object" |> <self>.add_element_import;
93
+ if nd.decorators {
94
+ (nd, nd.decorators.meta["py_code"]) |> <self>.emit_ln;
95
+ }
96
+ if nd.signature:>type == ast.EventSignature and nd.arch_attached and
97
+ nd.signature.event.name == Tok.KW_ENTRY {
98
+ type_list = nd.signature.arch_tag_info?.meta?["py_code"] ?: "";
99
+ (nd, f"@{C.OBJECT_CLASS}._jac_on_entry([{type_list.replace('|', ', ')}])") |> <self>.emit_ln;
100
+ }
101
+ elif nd.signature:>type == ast.EventSignature and nd.arch_attached and
102
+ nd.signature.event.name == Tok.KW_EXIT {
103
+ type_list = nd.signature.arch_tag_info?.meta?["py_code"] ?: "";
104
+ (nd, f"@{C.OBJECT_CLASS}._jac_on_exit([{type_list.replace('|', ', ')}])") |> <self>.emit_ln;
105
+ }
106
+ if nd.signature:>type in [ast.FuncSignature, ast.EventSignature] {
107
+ if nd.arch_attached and not nd.is_static {
108
+ (nd, f"def {nd.name.meta['py_code']}(self{nd.signature.meta['py_code']}:")
109
+ |> <self>.emit_ln;
110
+ } else {
111
+ if nd.arch_attached and nd.is_static {
112
+ (nd, f"@classmethod") |> <self>.emit_ln;
113
+ }
114
+ (nd, f"def {nd.name.meta['py_code']}({nd.signature.meta['py_code']}:")
115
+ |> <self>.emit_ln;
116
+ }
117
+ } else {
118
+ if nd.arch_attached {
119
+ (nd, f"def {nd.name.meta['py_code']}(self):") |> <self>.emit_ln;
120
+ } else {
121
+ (nd, f"def {nd.name.meta['py_code']}():") |> <self>.emit_ln;
122
+ }
123
+ }
124
+ <self>.indent_level += 1;
125
+ if nd.doc {
126
+ (nd, nd.doc.meta["py_code"]) |> <self>.emit_ln;
127
+ }
128
+ if nd.body {
129
+ (nd, "try:") |> <self>.emit_ln;
130
+ <self>.indent_level += 1;
131
+ (nd, nd.body.meta["py_code"]) |> <self>.emit;
132
+ <self>.indent_level -= 1;
133
+ (nd) |> <self>.emit_jac_error_handler;
134
+ } else {
135
+ nd.name.meta["py_code"] |> <self>.decl_def_missing;
136
+ }
137
+ <self>.indent_level -= 1;
138
+ }
139
+
140
+
141
+ """Sub objects.
142
+
143
+ event: Token,
144
+ arch_tag_info: Optional["TypeList | TypeSpec"],
145
+ return_type: Optional["TypeSpec"],
146
+ """
147
+ :object:PurplePygenPass:ability:exit_event_signature
148
+ (nd: ast.EventSignature) {
149
+ if (nd.parent|>type) == ast.Ability and nd.parent.arch_attached {
150
+ (nd, ", ") |> <self>.emit;
151
+ }
152
+ if nd.arch_tag_info {
153
+ (nd, f"{C.HERE}: {nd.arch_tag_info.meta['py_code']})")
154
+ |> <self>.emit;
155
+ } else {
156
+ (nd, f"{C.HERE})") |> <self>.emit;
157
+ }
158
+ if nd.return_type {
159
+ (nd, f" -> {nd.return_type.meta['py_code']}") |> <self>.emit;
160
+ }
161
+ }
162
+
163
+
164
+ """Sub objects.
165
+
166
+ ctrl: Token,
167
+ """
168
+ :object:PurplePygenPass:ability:exit_ctrl_stmt
169
+ (nd: ast.CtrlStmt) {
170
+ if nd.ctrl.name == Tok.KW_SKIP {
171
+ (nd, "return") |> <self>.emit_ln;
172
+ } else {
173
+ <super>.exit_ctrl_stmt(nd);
174
+ }
175
+ }
176
+
177
+
178
+ """Sub objects.
179
+
180
+ vis_type: Optional[Token],
181
+ target: ExprType,
182
+ else_body: Optional["ElseStmt"],
183
+ from_walker: bool = False,
184
+ """
185
+ :object:PurplePygenPass:ability:exit_visit_stmt
186
+ (nd: ast.VisitStmt) {
187
+ vis_type = nd.vis_type?.value ?: "";
188
+ loc = f"{'self' if nd.from_walker else C.HERE}";
189
+ (nd, f"if not {loc}.{C.WALKER_VISIT}({nd.target.meta['py_code']}): " )
190
+ |> <self>.emit_ln;
191
+ <self>.indent_level += 1;
192
+ if nd.else_body {
193
+ (nd, nd.else_body.body.meta["py_code"]) |> <self>.emit;
194
+ } else {
195
+ (nd, 'pass') |> <self>.emit_ln;
196
+ }
197
+ <self>.indent_level -= 1;
198
+ }
199
+
200
+
201
+ """Sub objects.
202
+ from_walker: bool = False,
203
+ """
204
+ :object:PurplePygenPass:ability:exit_disengage_stmt
205
+ (nd: ast.VisitStmt) {
206
+ loc = f"{'self' if nd.from_walker else C.HERE}";
207
+ (nd, f"return {loc}.{C.DISENGAGE}()") |> <self>.emit_ln;
208
+ }
209
+
210
+
211
+ """Sub objects.
212
+
213
+ left: ExprType,
214
+ right: ExprType,
215
+ op: Token,
216
+ """
217
+ :object:PurplePygenPass:ability:exit_binary_expr
218
+ (nd: ast.BinaryExpr) {
219
+ if (nd.op|>type) == ast.ConnectOp {
220
+ (nd, f"{nd.left.meta['py_code']}.{C.CONNECT_NODE}({nd.right.meta['py_code']}, {nd.op.meta['py_code']})")
221
+ |> <self>.emit;
222
+ } else {
223
+ <super>.exit_binary_expr(nd);
224
+ }
225
+ }
226
+
227
+
228
+ """Sub objects.
229
+
230
+ filter_type: Optional[ExprType],
231
+ filter_cond: Optional[FilterCompr],
232
+ edge_dir: EdgeDir,
233
+ """
234
+ :object:PurplePygenPass:ability:exit_edge_op_ref
235
+ (nd: ast.EdgeOpRef) {
236
+ edge_dir = f"{C.EDGE_DIR}.IN" if nd.edge_dir == EdgeDir.IN
237
+ else f"{C.EDGE_DIR}.OUT" if nd.edge_dir == EdgeDir.OUT
238
+ else f"{C.EDGE_DIR}.ANY";
239
+ if nd.filter_type and nd.filter_cond {
240
+ (nd, f"[{C.JAC_TMP} for {C.JAC_TMP} in {C.HERE}.{C.EDGES_TO_NODE}({edge_dir})"
241
+ f" if isinstance({C.JAC_TMP}, {nd.filter_type.meta['py_code']})"
242
+ f" and {nd.filter_cond.meta['py_code'].replace(C.PATCH, C.JAC_TMP)}]")
243
+ |> <self>.emit;
244
+ }
245
+ elif nd.filter_type {
246
+ (nd, f"[{C.JAC_TMP} for {C.JAC_TMP} in {C.HERE}.{C.EDGES_TO_NODE}({edge_dir})"
247
+ f" if isinstance({C.JAC_TMP}, {nd.filter_type.meta['py_code']})]")
248
+ |> <self>.emit;
249
+ }
250
+ else {
251
+ (nd, f"{C.HERE}.{C.EDGES_TO_NODE}({edge_dir})")
252
+ |> <self>.emit;
253
+ }
254
+ }
255
+
256
+
257
+ """Sub objects.
258
+
259
+ conn_type: Optional[ExprType],
260
+ conn_assign: Optional[AssignmentList],
261
+ edge_dir: EdgeDir,
262
+ """
263
+ :object:PurplePygenPass:ability:exit_connect_op
264
+ (nd: ast.ConnectOp) {
265
+ "Edge" |> <self>.add_element_import;
266
+ |> <self>.add_edge_directions;
267
+
268
+ if nd.conn_type {
269
+ (nd, f"{nd.conn_type.meta['py_code']}.{C.WITH_DIR}({C.EDGE_DIR}.{nd.edge_dir.name}") |> <self>.emit;
270
+ } else {
271
+ (nd, f"{C.EDGE_CLASS}().{C.WITH_DIR}({C.EDGE_DIR}.{nd.edge_dir.name}") |> <self>.emit;
272
+ }
273
+ if nd.conn_assign {
274
+ (nd, f", {nd.conn_assign.meta['py_code']})") |> <self>.emit;
275
+ } else {
276
+ (nd, ")") |> <self>.emit;
277
+ }
278
+ }
279
+
280
+ """Sub objects.
281
+
282
+ conn_type: Optional[ExprType],
283
+ conn_assign: Optional[AssignmentList],
284
+ edge_dir: EdgeDir,
285
+ """
286
+ :object:PurplePygenPass:ability:exit_disconnect_op
287
+ (nd: ast.DisconnectOp) {
288
+
289
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaclang
3
- Version: 0.0.2
3
+ Version: 0.0.3
4
4
  Summary: UNKNOWN
5
5
  Home-page: https://github.com/Jaseci-Labs/jaclang
6
6
  Author: Jason Mars
@@ -9,8 +9,16 @@ jaclang.egg-info/top_level.txt
9
9
  jaclang/cli/__init__.py
10
10
  jaclang/cli/cli.jac
11
11
  jaclang/cli/cmds.jac
12
+ jaclang/cli/impl/__init__.py
13
+ jaclang/cli/impl/cli_impl.jac
14
+ jaclang/cli/impl/cmds_impl.jac
12
15
  jaclang/core/__init__.py
13
16
  jaclang/core/primitives.jac
17
+ jaclang/core/impl/__init__.py
18
+ jaclang/core/impl/arch_impl.jac
19
+ jaclang/core/impl/element_impl.jac
20
+ jaclang/core/impl/exec_ctx_impl.jac
21
+ jaclang/core/impl/memory_impl.jac
14
22
  jaclang/jac/__init__.py
15
23
  jaclang/jac/absyntree.py
16
24
  jaclang/jac/constant.py
@@ -39,6 +47,8 @@ jaclang/jac/passes/blue/tests/test_sub_node_pass.py
39
47
  jaclang/jac/passes/blue/tests/test_type_analyze_pass.py
40
48
  jaclang/jac/passes/purple/__init__.py
41
49
  jaclang/jac/passes/purple/purple_pygen_pass.jac
50
+ jaclang/jac/passes/purple/impl/__init__.py
51
+ jaclang/jac/passes/purple/impl/purple_pygen_pass_impl.jac
42
52
  jaclang/jac/tests/__init__.py
43
53
  jaclang/jac/tests/test_importer.py
44
54
  jaclang/jac/tests/test_lexer.py
@@ -2,7 +2,7 @@
2
2
 
3
3
  from setuptools import find_packages, setup # type: ignore
4
4
 
5
- VERSION = "0.0.2"
5
+ VERSION = "0.0.3"
6
6
 
7
7
  setup(
8
8
  name="jaclang",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes