Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
Revision | 968c856be5891930cd0c7826797c29671c041625 (tree) |
---|---|
Time | 2021-12-10 00:22:12 |
Author | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
Now can jinja-generate (demo) python with AST-classes. Nice (ToBeContinued)
@@ -0,0 +1,51 @@ | ||
1 | +from classes import Demo1 | |
2 | + | |
3 | +import sys | |
4 | +sys.path.append("./../AST/") | |
5 | +from castle import peg # has the AST clases | |
6 | + | |
7 | +demo_3_rules = ( | |
8 | + { 'name' : 'peg_grammar', | |
9 | + 'expr' : ['rules', 'EOF'] }, | |
10 | + { 'name' : 'rules', | |
11 | + 'expr' : ['OneOrMore(rule)'] }) | |
12 | +demo_3_settings = ( | |
13 | + { 'name' : 'S1', | |
14 | + 'value' : ''' "'" '''.strip()}, | |
15 | + { 'name' : 'D1', | |
16 | + 'value' : ''' '"' '''.strip()}, | |
17 | + { 'name' : 'S3', | |
18 | + 'value' : """ "'''" """.strip()}, | |
19 | + { 'name' : 'D3', | |
20 | + 'value' : ''' '"""' '''.strip()}) | |
21 | + | |
22 | + | |
23 | + | |
24 | +def demo_4A(): | |
25 | + rules = [ peg.Rule( name=r['name'], expr=r['expr']) for r in demo_3_rules] | |
26 | + settings = [ peg.Setting( name=s['name'], value=s['value']) for s in demo_3_settings] | |
27 | + | |
28 | + produer = Demo1(default_template='file.jinja2') | |
29 | + return produer.render(rules=rules, settings=settings) | |
30 | + | |
31 | +def demo_4B(): | |
32 | + rules = [ peg.Rule( name=r['name'], expr=r['expr']) for r in demo_3_rules] | |
33 | + settings = [ peg.Setting( name=s['name'], value=s['value']) for s in demo_3_settings] | |
34 | + grammar = peg.Grammar(rules=rules, settings=settings) | |
35 | + | |
36 | + produer = Demo1(default_template='ast.jinja2') | |
37 | + return produer.render(grammar=grammar) | |
38 | + | |
39 | +def demo_4diff(): | |
40 | + A = demo_4A() | |
41 | + B = demo_4B() | |
42 | + return "no Diff" if A == B else "DO DIFF" | |
43 | + | |
44 | + | |
45 | +if __name__ == "__main__": | |
46 | + demos = [ func for (name, func) in locals().items() if name.startswith('demo_') and callable(func) ] | |
47 | + for demo in demos: | |
48 | + print(f"{'*'*12}\n** {demo.__name__} ::\n{'*'*12}") | |
49 | + retval=demo() | |
50 | + if isinstance(retval, str): print(retval) | |
51 | + #print("== Done\n") |
@@ -0,0 +1,16 @@ | ||
1 | +{% extends "file.jinja2" %} | |
2 | +---- | |
3 | + | |
4 | +{%- block rules -%} | |
5 | + {% for r in grammar.rules -%} | |
6 | + {{ m.peg_rule(r.name, r.expr) }} | |
7 | + | |
8 | + {% endfor %} | |
9 | +{% endblock %} | |
10 | + | |
11 | +{%- block settings -%} | |
12 | + {% for s in grammar.settings -%} | |
13 | + {{ m.settings(s.name, s.value) }} | |
14 | + {% endfor %} | |
15 | +{%- endblock -%} | |
16 | + |