Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
Révision | 5979095e73bd13d12dbaee2fa6278bdc3b3ec8bb (tree) |
---|---|
l'heure | 2021-12-11 04:45:25 |
Auteur | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
Arpeggio:: Added a pytest as demo of PTNodeVisitor -- Not an AST yet
@@ -0,0 +1,60 @@ | ||
1 | +import pytest | |
2 | + | |
3 | +import grammar | |
4 | +import arpeggio | |
5 | + | |
6 | +def format_node(n): | |
7 | + return f"\tNODE:: {n!r}:{type(n)}" | |
8 | + | |
9 | +def format_children(l): | |
10 | + if l is None: return "~~~Forget to pass children~~~" | |
11 | + if len(l)<1: return "\tCHILDREN: None" | |
12 | + return ("\n\tCHILDREN::" + ", ".join(f'>>{c}<<' for c in l)) | |
13 | + | |
14 | +def show_visited(label="VISIT_", node=None, children=None): | |
15 | + nl= "\n" if label[-1] != '_' else "" | |
16 | + print(f'XXX {label}{nl}{format_node(node)}{format_children(children)}') | |
17 | + | |
18 | + | |
19 | + | |
20 | +class DemoVisitor(arpeggio.PTNodeVisitor): | |
21 | + def visit__default__(self, node, children): | |
22 | + show_visited('visit__default__', node, children) | |
23 | + return (node, children) | |
24 | + def visit_rule(self, node, children): | |
25 | + show_visited('visit_rule', node, children) | |
26 | + return (node, children) | |
27 | + def visit_ordered_choice(self, node, children): | |
28 | + show_visited('ordered_choice', node, children) | |
29 | + return (node, children) | |
30 | + | |
31 | + def visit_rule_name(self, node, children): | |
32 | + show_visited('VISIT_rule_name', node, children) | |
33 | + return (node, children) | |
34 | + def visit_rule_crossref(self, node, children): | |
35 | + show_visited('VISIT_rule_crossref', node, children) | |
36 | + return (node, children) | |
37 | + | |
38 | + | |
39 | + | |
40 | +def _test_Rule(): | |
41 | + TXT= """RULE_NAME <- EXP1 EXP2 ;""" | |
42 | + parse_tree = arpeggio.ParserPython(language_def=grammar.rule).parse(TXT) | |
43 | + | |
44 | + print("\nPARSE-TREE\n" + parse_tree.tree_str()+'\n') | |
45 | + | |
46 | + ast = arpeggio.visit_parse_tree(parse_tree, DemoVisitor()) | |
47 | + print("\nAST:\t" + ast) | |
48 | + | |
49 | + | |
50 | +def QAZ(txt, rule, label=None): | |
51 | + if label: print(f'\nLABEL: {label}') | |
52 | + parse_tree = arpeggio.ParserPython(language_def=rule).parse(txt) | |
53 | + print("PARSE-TREE\n" + parse_tree.tree_str()+'\n') | |
54 | + | |
55 | + ast = arpeggio.visit_parse_tree(parse_tree, DemoVisitor()) | |
56 | + print("AST:\t", ast) | |
57 | + | |
58 | +def test_QAZ_rule_name(): QAZ("""aName""", grammar.rule_name, label="rule_name") | |
59 | +def test_QAZ_rule_crossref(): QAZ("""aName""", grammar.rule_crossref, label="rule_crossref") | |
60 | +def test_QAZ_expressions(): QAZ("""aName""", grammar.expressions, label="expressions") |