• R/O
  • SSH

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2


Commit MetaInfo

修订版5979095e73bd13d12dbaee2fa6278bdc3b3ec8bb (tree)
时间2021-12-11 04:45:25
作者Albert Mietus < albert AT mietus DOT nl >
CommiterAlbert Mietus < albert AT mietus DOT nl >

Log Message

Arpeggio:: Added a pytest as demo of PTNodeVisitor -- Not an AST yet

更改概述

差异

diff -r c96d582a07d7 -r 5979095e73bd Arpeggio/demo/test_Rule.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Arpeggio/demo/test_Rule.py Fri Dec 10 20:45:25 2021 +0100
@@ -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")