• 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

修订版5b918e28475e9dac3e412ae971767e2bcd9a1ceb (tree)
时间2022-04-23 06:25:53
作者Albert Mietus < albert AT mietus DOT nl >
CommiterAlbert Mietus < albert AT mietus DOT nl >

Log Message

REFACTORED: Now we have a sub-package 'grammar' (in castle.reader.parser). It holds the (peg)grammar&vistitor to parser that chunk of of Castlee

更改概述

差异

diff -r 59d7c5703ac0 -r 5b918e28475e castle/readers/parser/grammar.py
--- a/castle/readers/parser/grammar.py Fri Apr 22 21:44:04 2022 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
1-from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF
2-from arpeggio import RegExMatch as _
3-from arpeggio import ParserPython
4-
5-
6-def peg_grammar(): return rules, EOF
7-def rules(): return OneOrMore([parse_rule, setting])
8-def parse_rule(): return rule_name, '<-', expression, ";"
9-
10-def expression(): return sequence, op_alternative
11-def sequence(): return OneOrMore(single_expr)
12-def single_expr(): return [ rule_crossref, term, group, predicate ], op_quantity
13-
14-def op_alternative(): return Optional( '|' , expression )
15-def op_quantity(): return Optional([ '?' , '*' , '+' , '#' ])
16-
17-def term(): return [ str_term, regex_term ]
18-def group(): return '(', expression, ')'
19-def predicate(): return ['&','!'], single_expr
20-
21-def str_term(): return [ (S3, str_no_s3, S3),
22- (D3, str_no_d3, D3),
23- (S1, str_no_s1, S1),
24- (D1, str_no_d1, D1) ]
25-def regex_term(): return [ (RE, re_no_slash, RE),
26- (REs3, str_no_s3, S3),
27- (REd3, str_no_d3, D3),
28- (REs1, str_no_s1, S1),
29- (REd1, str_no_d1, D1) ]
30-
31-def rule_name(): return ID
32-def rule_crossref(): return ID
33-def ID(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*")
34-
35-def re_no_slash(): return _(r"((\\/)|[^\/])*")
36-def str_no_s1(): return _(r"((\\')|[^'\n])*") # Does NOT match multiline -- note 'multiline=False' is not the same
37-def str_no_d1(): return _(r'((\\")|[^"\n])*') # idem
38-def str_no_s3(): return _(r"([^']|('[^'])|(''[^']))*") # ALLOW multiline
39-def str_no_d3(): return _(r'''([^"]|("[^"])|(""[^"]))*''') # idem
40-
41-def setting(): return setting_name, '=', value, ';'
42-def setting_name(): return ID
43-def value(): return [ str_term, regex_term, number, setting_xref ]
44-def number(): return [ complex_lit, float_lit, int_lit ]
45-def setting_xref(): return ID
46-def complex_lit(): return _(r"[+-]?([0-9](\.[0-9]*)?)[+-][iIjJ]([0-9](\.[0-9]*)?)")
47-def float_lit(): return _(r"[+-]?[0-9]\.[0-9]+")
48-def int_lit(): return _(r"[+-]?[1-9][0-9]*")
49-
50-
51-S1 = "'"
52-D1 = '"'
53-S3 = "'''"
54-D3 = '"""'
55-RE = '/'
56-REs1 = _(r"[rR]'")
57-REd1 = _(r'[rR]"')
58-REs3 = _(r"[rR]'''")
59-REd3 = _(r'[rR]"""')
60-
61-def comment(): return ["#", '//'], _(".*\n")
62-
63-
diff -r 59d7c5703ac0 -r 5b918e28475e castle/readers/parser/grammar/__init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/castle/readers/parser/grammar/__init__.py Fri Apr 22 23:25:53 2022 +0200
@@ -0,0 +1,6 @@
1+from .language import peg_grammar
2+from .language import comment
3+
4+from .visitor import PegVisitor
5+from .visitor import QuantityError, PredicateError
6+
diff -r 59d7c5703ac0 -r 5b918e28475e castle/readers/parser/grammar/language.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/castle/readers/parser/grammar/language.py Fri Apr 22 23:25:53 2022 +0200
@@ -0,0 +1,61 @@
1+from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF
2+from arpeggio import RegExMatch as _
3+from arpeggio import ParserPython
4+
5+
6+def peg_grammar(): return rules, EOF
7+def rules(): return OneOrMore([parse_rule, setting])
8+def parse_rule(): return rule_name, '<-', expression, ";"
9+
10+def expression(): return sequence, op_alternative
11+def sequence(): return OneOrMore(single_expr)
12+def single_expr(): return [ rule_crossref, term, group, predicate ], op_quantity
13+
14+def op_alternative(): return Optional( '|' , expression )
15+def op_quantity(): return Optional([ '?' , '*' , '+' , '#' ])
16+
17+def term(): return [ str_term, regex_term ]
18+def group(): return '(', expression, ')'
19+def predicate(): return ['&','!'], single_expr
20+
21+def str_term(): return [ (S3, str_no_s3, S3),
22+ (D3, str_no_d3, D3),
23+ (S1, str_no_s1, S1),
24+ (D1, str_no_d1, D1) ]
25+def regex_term(): return [ (RE, re_no_slash, RE),
26+ (REs3, str_no_s3, S3),
27+ (REd3, str_no_d3, D3),
28+ (REs1, str_no_s1, S1),
29+ (REd1, str_no_d1, D1) ]
30+
31+def rule_name(): return ID
32+def rule_crossref(): return ID
33+def ID(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*")
34+
35+def re_no_slash(): return _(r"((\\/)|[^\/])*")
36+def str_no_s1(): return _(r"((\\')|[^'\n])*") # Does NOT match multiline -- note 'multiline=False' is not the same
37+def str_no_d1(): return _(r'((\\")|[^"\n])*') # idem
38+def str_no_s3(): return _(r"([^']|('[^'])|(''[^']))*") # ALLOW multiline
39+def str_no_d3(): return _(r'''([^"]|("[^"])|(""[^"]))*''') # idem
40+
41+def setting(): return setting_name, '=', value, ';'
42+def setting_name(): return ID
43+def value(): return [ str_term, regex_term, number, setting_xref ]
44+def number(): return [ complex_lit, float_lit, int_lit ]
45+def setting_xref(): return ID
46+def complex_lit(): return _(r"[+-]?([0-9](\.[0-9]*)?)[+-][iIjJ]([0-9](\.[0-9]*)?)")
47+def float_lit(): return _(r"[+-]?[0-9]\.[0-9]+")
48+def int_lit(): return _(r"[+-]?[1-9][0-9]*")
49+
50+
51+S1 = "'"
52+D1 = '"'
53+S3 = "'''"
54+D3 = '"""'
55+RE = '/'
56+REs1 = _(r"[rR]'")
57+REd1 = _(r'[rR]"')
58+REs3 = _(r"[rR]'''")
59+REd3 = _(r'[rR]"""')
60+
61+def comment(): return ["#", '//'], _(".*\n")
diff -r 59d7c5703ac0 -r 5b918e28475e castle/readers/parser/grammar/visitor.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/castle/readers/parser/grammar/visitor.py Fri Apr 22 23:25:53 2022 +0200
@@ -0,0 +1,133 @@
1+import arpeggio
2+
3+from castle.ast import grammar
4+
5+import logging;logger = logging.getLogger(__name__)
6+from typing import Union
7+
8+class QuantityError(ValueError): pass
9+class PredicateError(ValueError): pass
10+
11+
12+#NO_VISITOR_NEEDED: visit_str_no_s1
13+#NO_VISITOR_NEEDED: visit_str_no_d1
14+#NO_VISITOR_NEEDED: visit_str_no_s3
15+#NO_VISITOR_NEEDED: visit_str_no_d3
16+#NO_VISITOR_NEEDED: visit_comment
17+#NO_VISITOR_NEEDED: visit_ID
18+#NO_VISITOR_NEEDED: visit_term
19+#NO_VISITOR_NEEDED: visit_re_no_slash
20+#NO_VISITOR_NEEDED: visit_group
21+#NO_VISITOR_NEEDED: visit_op_quantity -- handled in visit_single_expr
22+#NO_VISITOR_NEEDED: visit_op_alternative -- handled in visit_expression
23+#NO_VISITOR_NEEDED: visit_complex_lit -- handled in visit_number
24+#NO_VISITOR_NEEDED: visit_float_lit -- handled in visit_number
25+#NO_VISITOR_NEEDED: visit_int_lit -- handled in visit_number
26+#NO_VISITOR_NEEDED: visit_value
27+
28+
29+
30+class PegVisitor(arpeggio.PTNodeVisitor):
31+ def _logstr_node_children(self, node, children):
32+ return f'>>{node}<< children[{len(children)}] >>' + ", ".join(f'{c}:{type(c).__name__}' for c in children) + '<<'
33+
34+ def visit_str_term(self, node, children):
35+ return grammar.StrTerm(value=node[1], parse_tree=node)
36+
37+ def visit_regex_term(self, node, children):
38+ return grammar.RegExpTerm(value=node[1], parse_tree=node)
39+
40+ def visit_rule_name(self, node, children):
41+ return grammar.ID(name=str(node), parse_tree=node)
42+
43+ def visit_rule_crossref(self, node, children):
44+ return grammar.ID(name=str(node), parse_tree=node)
45+
46+ def visit_parse_rule(self, node, children): # Name '<-' expression ';'
47+ return grammar.Rule(name=children[0],expr=children[1], parse_tree=node)
48+
49+
50+ def visit_single_expr(self, node, children): # [ rule_crossref, term, group, predicate ], op_quantity
51+ token_2_class = {'?': grammar.Optional,
52+ '*': grammar.ZeroOrMore,
53+ '+': grammar.OneOrMore,
54+ '#': grammar.UnorderedGroup}
55+
56+ if len(children) == 1: # No Optional part
57+ logger.debug(f'visit_single_expr==1:: {getattr(children[0], "name", children[0])}:{type(children[0])}')
58+ return children[0]
59+
60+ elif len(children) == 2: # Optional part
61+ logger.debug(f'visit_single_expr==2::Got: {children[0]}, {children[1]}')
62+ expr = children[0]
63+ token = str(children[1])
64+ quantum_cls = token_2_class.get(token)
65+ if quantum_cls:
66+ ast=quantum_cls(expr=expr, parse_tree=node)
67+ logger.debug(f'visit_single_expr==2::Pass: {quantum_cls}(expr={expr})')
68+ return ast
69+ else:
70+ raise QuantityError(f"token '{token}' not recognised")
71+ else: # #children not in (1,2)
72+ raise NotImplementedError("visit_single_expr, len>2") # -- Is this possible?
73+
74+
75+ # expression <- sequence, op_alternative; op_alternative <- ('|' expression)?
76+ def visit_expression(self, node, children) -> Union[grammar.Sequence, grammar.OrderedChoice]:
77+ logger.debug('visit_expression::' + self._logstr_node_children(node, children))
78+ if len(children) == 1: #Only sequence
79+ return children[0]
80+ elif len(children) == 2: # So, having 1 or more alternatives in children[1]
81+ # In all cased a (single) OrderedChoice with a list of alternatives should be returned.
82+ if isinstance(children[1], grammar.OrderedChoice):
83+ alternatives = [children[0]] + [alt for alt in children[1]]
84+ else:
85+ alternatives = children
86+ return grammar.OrderedChoice(children = alternatives, parse_tree=node)
87+ else:
88+ raise NotImplementedError("visit_expression, len>2")
89+
90+
91+ # OneOrMore(single_expr)
92+ def visit_sequence(self, node, children) -> grammar.Sequence:
93+ logger.debug(f'visit_sequence::{self._logstr_node_children(node, children)}')
94+ return grammar.Sequence(children=children, parse_tree=node)
95+
96+
97+ def visit_predicate(self, node, children):
98+ token_2_predicate = {'&': grammar.AndPredicate,
99+ '!': grammar.NotPredicate}
100+ logger.debug(f'visit_predicate:: >>{node}<< #children={len(children)}')
101+
102+ if len(children) == 2:
103+ token = children[0]
104+ cls = token_2_predicate.get(token)
105+ if cls:
106+ ast = cls(expr=children[1], parse_tree=node)
107+ return ast
108+ else:
109+ raise PredicateError(f"token '{token}' not recognised")
110+ else:
111+ raise NotImplementedError("visit_predicate, len!=2") # -- Is this possible?
112+
113+
114+ def visit_rules(self, node, children): # Mix of `ParseRule`(s)`Setting`(s) ; will be sorted out n `Grammar`
115+ logger.debug('visit_rules::' + self._logstr_node_children(node, children))
116+ return grammar.Rules(children=children[:], parse_tree=node)
117+
118+
119+ def visit_peg_grammar(self, node, children):
120+ return grammar.Grammar(all_rules=children[0], parse_tree=node)
121+
122+ def visit_setting_name(self, node, children):
123+ return grammar.ID(name=str(node), parse_tree=node)
124+
125+ def visit_number(self, node, children):
126+ return grammar.Number(value=str(node), parse_tree=node)
127+
128+ def visit_setting_xref(self, node, children):
129+ return grammar.ID(name=str(node), parse_tree=node)
130+
131+ def visit_setting(self, node, children):
132+ logger.debug('visit_setting::' + self._logstr_node_children(node, children))
133+ return grammar.Setting(name=children[0], value=children[1] , parse_tree=node)
diff -r 59d7c5703ac0 -r 5b918e28475e castle/readers/parser/visitor.py
--- a/castle/readers/parser/visitor.py Fri Apr 22 21:44:04 2022 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
1-import arpeggio
2-
3-from castle.ast import grammar
4-
5-import logging;logger = logging.getLogger(__name__)
6-from typing import Union
7-
8-class QuantityError(ValueError): pass
9-class PredicateError(ValueError): pass
10-
11-
12-#NO_VISITOR_NEEDED: visit_str_no_s1
13-#NO_VISITOR_NEEDED: visit_str_no_d1
14-#NO_VISITOR_NEEDED: visit_str_no_s3
15-#NO_VISITOR_NEEDED: visit_str_no_d3
16-#NO_VISITOR_NEEDED: visit_comment
17-#NO_VISITOR_NEEDED: visit_ID
18-#NO_VISITOR_NEEDED: visit_term
19-#NO_VISITOR_NEEDED: visit_re_no_slash
20-#NO_VISITOR_NEEDED: visit_group
21-#NO_VISITOR_NEEDED: visit_op_quantity -- handled in visit_single_expr
22-#NO_VISITOR_NEEDED: visit_op_alternative -- handled in visit_expression
23-#NO_VISITOR_NEEDED: visit_complex_lit -- handled in visit_number
24-#NO_VISITOR_NEEDED: visit_float_lit -- handled in visit_number
25-#NO_VISITOR_NEEDED: visit_int_lit -- handled in visit_number
26-#NO_VISITOR_NEEDED: visit_value
27-
28-
29-
30-class PegVisitor(arpeggio.PTNodeVisitor):
31- def _logstr_node_children(self, node, children):
32- return f'>>{node}<< children[{len(children)}] >>' + ", ".join(f'{c}:{type(c).__name__}' for c in children) + '<<'
33-
34- def visit_str_term(self, node, children):
35- return grammar.StrTerm(value=node[1], parse_tree=node)
36-
37- def visit_regex_term(self, node, children):
38- return grammar.RegExpTerm(value=node[1], parse_tree=node)
39-
40- def visit_rule_name(self, node, children):
41- return grammar.ID(name=str(node), parse_tree=node)
42-
43- def visit_rule_crossref(self, node, children):
44- return grammar.ID(name=str(node), parse_tree=node)
45-
46- def visit_parse_rule(self, node, children): # Name '<-' expression ';'
47- return grammar.Rule(name=children[0],expr=children[1], parse_tree=node)
48-
49-
50- def visit_single_expr(self, node, children): # [ rule_crossref, term, group, predicate ], op_quantity
51- token_2_class = {'?': grammar.Optional,
52- '*': grammar.ZeroOrMore,
53- '+': grammar.OneOrMore,
54- '#': grammar.UnorderedGroup}
55-
56- if len(children) == 1: # No Optional part
57- logger.debug(f'visit_single_expr==1:: {getattr(children[0], "name", children[0])}:{type(children[0])}')
58- return children[0]
59-
60- elif len(children) == 2: # Optional part
61- logger.debug(f'visit_single_expr==2::Got: {children[0]}, {children[1]}')
62- expr = children[0]
63- token = str(children[1])
64- quantum_cls = token_2_class.get(token)
65- if quantum_cls:
66- ast=quantum_cls(expr=expr, parse_tree=node)
67- logger.debug(f'visit_single_expr==2::Pass: {quantum_cls}(expr={expr})')
68- return ast
69- else:
70- raise QuantityError(f"token '{token}' not recognised")
71- else: # #children not in (1,2)
72- raise NotImplementedError("visit_single_expr, len>2") # -- Is this possible?
73-
74-
75- # expression <- sequence, op_alternative; op_alternative <- ('|' expression)?
76- def visit_expression(self, node, children) -> Union[grammar.Sequence, grammar.OrderedChoice]:
77- logger.debug('visit_expression::' + self._logstr_node_children(node, children))
78- if len(children) == 1: #Only sequence
79- return children[0]
80- elif len(children) == 2: # So, having 1 or more alternatives in children[1]
81- # In all cased a (single) OrderedChoice with a list of alternatives should be returned.
82- if isinstance(children[1], grammar.OrderedChoice):
83- alternatives = [children[0]] + [alt for alt in children[1]]
84- else:
85- alternatives = children
86- return grammar.OrderedChoice(children = alternatives, parse_tree=node)
87- else:
88- raise NotImplementedError("visit_expression, len>2")
89-
90-
91- # OneOrMore(single_expr)
92- def visit_sequence(self, node, children) -> grammar.Sequence:
93- logger.debug(f'visit_sequence::{self._logstr_node_children(node, children)}')
94- return grammar.Sequence(children=children, parse_tree=node)
95-
96-
97- def visit_predicate(self, node, children):
98- token_2_predicate = {'&': grammar.AndPredicate,
99- '!': grammar.NotPredicate}
100- logger.debug(f'visit_predicate:: >>{node}<< #children={len(children)}')
101-
102- if len(children) == 2:
103- token = children[0]
104- cls = token_2_predicate.get(token)
105- if cls:
106- ast = cls(expr=children[1], parse_tree=node)
107- return ast
108- else:
109- raise PredicateError(f"token '{token}' not recognised")
110- else:
111- raise NotImplementedError("visit_predicate, len!=2") # -- Is this possible?
112-
113-
114- def visit_rules(self, node, children): # Mix of `ParseRule`(s)`Setting`(s) ; will be sorted out n `Grammar`
115- logger.debug('visit_rules::' + self._logstr_node_children(node, children))
116- return grammar.Rules(children=children[:], parse_tree=node)
117-
118-
119- def visit_peg_grammar(self, node, children):
120- return grammar.Grammar(all_rules=children[0], parse_tree=node)
121-
122- def visit_setting_name(self, node, children):
123- return grammar.ID(name=str(node), parse_tree=node)
124-
125- def visit_number(self, node, children):
126- return grammar.Number(value=str(node), parse_tree=node)
127-
128- def visit_setting_xref(self, node, children):
129- return grammar.ID(name=str(node), parse_tree=node)
130-
131- def visit_setting(self, node, children):
132- logger.debug('visit_setting::' + self._logstr_node_children(node, children))
133- return grammar.Setting(name=children[0], value=children[1] , parse_tree=node)
diff -r 59d7c5703ac0 -r 5b918e28475e demos/ThinOnion/demo1.py
--- a/demos/ThinOnion/demo1.py Fri Apr 22 21:44:04 2022 +0200
+++ b/demos/ThinOnion/demo1.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging; logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar, visitor
4+from castle.readers.parser import grammar
55 from castle.ast import grammar as AST
66
77 import arpeggio
@@ -34,7 +34,7 @@
3434 parser = arpeggio.ParserPython(grammar.peg_grammar, comment_def = grammar.comment)
3535 pt = parser.parse(txt)
3636 logger.info(f"Reader:_do_parse::\t parse_tree: start={pt.position} end={pt.position_end}; len(txt)={len(txt)}")
37- ast = arpeggio.visit_parse_tree(pt, visitor.PegVisitor())
37+ ast = arpeggio.visit_parse_tree(pt, grammar.PegVisitor())
3838 logger.debug(f"Reader:_do_parse::\t ast: start={ast.position} end={ast.position_end} -- not counting comments.")
3939 return ast
4040
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d1_parse_tree/__init__.py
--- a/pytst/readers/parser/d1_parse_tree/__init__.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d1_parse_tree/__init__.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,8 @@
11 import logging;logger = logging.getLogger(__name__)
2-from castle.readers.parser import grammar
2+import arpeggio
33
4-import arpeggio
4+from castle.readers.parser.grammar import language as grammar
5+
56
67 def parse(txt, grammer_rule):
78 logger.debug(f'>>{txt}<<')
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d1_parse_tree/test_1_regexp.py
--- a/pytst/readers/parser/d1_parse_tree/test_1_regexp.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d1_parse_tree/test_1_regexp.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging;logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar
4+from castle.readers.parser.grammar import language as grammar
55
66 import arpeggio
77 RE, S = arpeggio.RegExMatch, arpeggio.StrMatch # shortcut
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d1_parse_tree/test_2_str.py
--- a/pytst/readers/parser/d1_parse_tree/test_2_str.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d1_parse_tree/test_2_str.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,8 @@
11 import pytest
22 import logging;logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar
4+from castle.readers.parser.grammar import language as grammar
5+
56
67 import arpeggio
78 RE, S = arpeggio.RegExMatch, arpeggio.StrMatch # shortcut
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d1_parse_tree/test_3_expr.py
--- a/pytst/readers/parser/d1_parse_tree/test_3_expr.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d1_parse_tree/test_3_expr.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging;logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar
4+from castle.readers.parser.grammar import language as grammar
55
66 import arpeggio
77
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d1_parse_tree/test_4_rule.py
--- a/pytst/readers/parser/d1_parse_tree/test_4_rule.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d1_parse_tree/test_4_rule.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging;logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar
4+from castle.readers.parser.grammar import language as grammar
55
66 import arpeggio
77 RE, S = arpeggio.RegExMatch, arpeggio.StrMatch # shortcut
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d1_parse_tree/test_5_settings.py
--- a/pytst/readers/parser/d1_parse_tree/test_5_settings.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d1_parse_tree/test_5_settings.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging;logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar
4+from castle.readers.parser.grammar import language as grammar
55
66 import arpeggio
77 RE, S = arpeggio.RegExMatch, arpeggio.StrMatch # shortcut
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d1_parse_tree/test_6_comments.py
--- a/pytst/readers/parser/d1_parse_tree/test_6_comments.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d1_parse_tree/test_6_comments.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging;logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar
4+from castle.readers.parser.grammar import language as grammar
55
66 import arpeggio
77 RE, S = arpeggio.RegExMatch, arpeggio.StrMatch # shortcut
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d1_parse_tree/test_9_file.py
--- a/pytst/readers/parser/d1_parse_tree/test_9_file.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d1_parse_tree/test_9_file.py Fri Apr 22 23:25:53 2022 +0200
@@ -3,7 +3,8 @@
33 from pathlib import Path
44 import os
55
6-from castle.readers.parser import grammar
6+from castle.readers.parser.grammar import language as grammar
7+
78 import arpeggio
89
910 def parse_file(filename, dir=Path('..')):
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/__init__.py
--- a/pytst/readers/parser/d2_ast/__init__.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/__init__.py Fri Apr 22 23:25:53 2022 +0200
@@ -2,20 +2,19 @@
22
33 import arpeggio
44
5-from castle.readers.parser import visitor
6-from castle.readers.parser import grammar as rules
5+from castle.readers.parser import grammar
76 from castle.ast import grammar as AST
87
98 def parse(txt, rule, *,
109 with_comments=False,
1110 visitor_debug=False):
1211
13- parser = arpeggio.ParserPython(rule, comment_def = rules.comment if with_comments else None)
12+ parser = arpeggio.ParserPython(rule, comment_def = grammar.comment if with_comments else None)
1413 pt = parser.parse(txt)
1514 logger.debug('PARSE_TREE\n'+pt.tree_str())
1615 assert pt.position_end == len(txt), f"Did not parse all input txt=>>{txt}<<len={len(txt)} ==> parse_tree: >>{pt}<<_end={pt.position_end}"
1716
18- ast = arpeggio.visit_parse_tree(pt, visitor.PegVisitor(debug=visitor_debug))
17+ ast = arpeggio.visit_parse_tree(pt, grammar.PegVisitor(debug=visitor_debug))
1918 logger.debug('AST\n' + f'{ast}:{type(ast).__name__}')
2019
2120 if with_comments: # When the txt starts with comments, the AST does start 'after' that comment -- so skip the start-check
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_1_term.py
--- a/pytst/readers/parser/d2_ast/test_1_term.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_1_term.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging; logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar as rules
4+from castle.readers.parser.grammar import language as rules
55 from castle.ast import grammar as AST
66
77 from . import parse
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_2_ID.py
--- a/pytst/readers/parser/d2_ast/test_2_ID.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_2_ID.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,6 +1,6 @@
11 import pytest
22
3-from castle.readers.parser import grammar as rules
3+from castle.readers.parser.grammar import language as rules
44 from castle.ast import grammar as AST
55
66 from . import parse, assert_ID
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_3_Seq.py
--- a/pytst/readers/parser/d2_ast/test_3_Seq.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_3_Seq.py Fri Apr 22 23:25:53 2022 +0200
@@ -4,7 +4,7 @@
44 import pytest
55 import logging; logger = logging.getLogger(__name__)
66
7-from castle.readers.parser import grammar as rules
7+from castle.readers.parser.grammar import language as rules
88 from castle.ast import grammar as AST
99
1010 from . import parse, assert_ID, assert_Seq
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_3_rule.py
--- a/pytst/readers/parser/d2_ast/test_3_rule.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_3_rule.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging; logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar as rules
4+from castle.readers.parser.grammar import language as rules
55 from castle.ast import grammar as AST
66
77 from . import parse, assert_ID, assert_Seq, assert_ParseRule
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_3_settings.py
--- a/pytst/readers/parser/d2_ast/test_3_settings.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_3_settings.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,6 +1,6 @@
11 import pytest
22
3-from castle.readers.parser import grammar as rules
3+from castle.readers.parser.grammar import language as rules
44 from castle.ast import grammar as AST
55
66 from . import parse, assert_Setting
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_4_quantity.py
--- a/pytst/readers/parser/d2_ast/test_4_quantity.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_4_quantity.py Fri Apr 22 23:25:53 2022 +0200
@@ -3,7 +3,7 @@
33 import pytest
44 import logging; logger = logging.getLogger(__name__)
55
6-from castle.readers.parser import grammar as rules
6+from castle.readers.parser.grammar import language as rules
77 from castle.ast import grammar as AST
88
99 from . import parse, assert_ID
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_5_group.py
--- a/pytst/readers/parser/d2_ast/test_5_group.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_5_group.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging; logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar as rules
4+from castle.readers.parser.grammar import language as rules
55 from castle.ast import grammar as AST
66
77 from . import parse, assert_ID, assert_ParseRule, assert_Seq
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_6_predicate.py
--- a/pytst/readers/parser/d2_ast/test_6_predicate.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_6_predicate.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging; logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar as rules
4+from castle.readers.parser.grammar import language as rules
55 from castle.ast import grammar as AST
66
77 from . import parse, assert_ID, precondition_ID, precondition_Expressions
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_7_rules.py
--- a/pytst/readers/parser/d2_ast/test_7_rules.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_7_rules.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging; logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar as rules
4+from castle.readers.parser.grammar import language as rules
55 from castle.ast import grammar as AST
66
77 from . import parse, assert_Rule, assert_ParseRule, assert_Setting
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_8_grammar.py
--- a/pytst/readers/parser/d2_ast/test_8_grammar.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_8_grammar.py Fri Apr 22 23:25:53 2022 +0200
@@ -1,7 +1,7 @@
11 import pytest
22 import logging; logger = logging.getLogger(__name__)
33
4-from castle.readers.parser import grammar as rules
4+from castle.readers.parser.grammar import language as rules
55 from castle.ast import grammar as AST
66
77 from . import parse, assert_PEG
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/d2_ast/test_9_file.py
--- a/pytst/readers/parser/d2_ast/test_9_file.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/d2_ast/test_9_file.py Fri Apr 22 23:25:53 2022 +0200
@@ -3,8 +3,7 @@
33 from pathlib import Path
44 import os
55
6-from castle.readers.parser import grammar as rules
7-
6+from castle.readers.parser.grammar import language as rules
87
98 from . import parse, assert_PEG
109
diff -r 59d7c5703ac0 -r 5b918e28475e pytst/readers/parser/general/test_file.py
--- a/pytst/readers/parser/general/test_file.py Fri Apr 22 21:44:04 2022 +0200
+++ b/pytst/readers/parser/general/test_file.py Fri Apr 22 23:25:53 2022 +0200
@@ -2,13 +2,13 @@
22 import logging; logger = logging.getLogger(__name__)
33
44 from castle.readers.parser import FileParser
5-from castle.readers.parser import grammar, visitor
5+from castle.readers.parser import grammar
66
77
88 def test_file():
99 reader = FileParser(language_def=grammar.peg_grammar,
1010 comment_def=grammar.comment,
11- visitor=visitor.PegVisitor(),
11+ visitor=grammar.PegVisitor(),
1212 read_dirs=('../../../demos/ThinOnion',
1313 '../../.././demos/ThinOnion/grammar',
1414 '../../.././pytst/readers/parser'))