• R/O
  • SSH

Commit

Tags
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

Revisiónf8bd16e1d4e3920655376abe924c89460dbac0a1 (tree)
Tiempo2022-02-15 02:27:24
AutorAlbert Mietus < albert AT mietus DOT nl >
CommiterAlbert Mietus < albert AT mietus DOT nl >

Log Message

SETTINGS: ASIS, promoting 'Settings' up-to grammar; but introduced BUG in visit_rules ... Need to fix some test

Cambiar Resumen

Diferencia incremental

diff -r b15dd4fa21b1 -r f8bd16e1d4e3 castle/ast/peg.py
--- a/castle/ast/peg.py Sun Feb 13 22:05:55 2022 +0100
+++ b/castle/ast/peg.py Mon Feb 14 18:27:24 2022 +0100
@@ -108,7 +108,7 @@
108108 rules: Rules=None,
109109 settings: Settings=None,
110110 **kwargs):
111- logger.debug(f'{self._typeName(self)}:: kwargs={kwargs}')
111+ logger.debug(f'{self._typeName(self)}:: rules={rules}; settings={settings}, kwargs={kwargs}')
112112 super().__init__(**kwargs)
113113 self.rules = rules
114114 self.settings = settings
diff -r b15dd4fa21b1 -r f8bd16e1d4e3 castle/readers/parser/visitor.py
--- a/castle/readers/parser/visitor.py Sun Feb 13 22:05:55 2022 +0100
+++ b/castle/readers/parser/visitor.py Mon Feb 14 18:27:24 2022 +0100
@@ -24,7 +24,7 @@
2424 #NO_VISITOR_NEEDED: visit_float_lit -- handled in visit_number
2525 #NO_VISITOR_NEEDED: visit_int_lit -- handled in visit_number
2626 #NO_VISITOR_NEEDED: visit_value
27-#NO_VISITOR_NEEDED: visit_setting_xref
27+
2828
2929
3030 class PegVisitor(arpeggio.PTNodeVisitor):
@@ -113,14 +113,16 @@
113113
114114 def visit_rules(self, node, children):
115115 logger.debug('visit_rules::' + self._logstr_node_children(node, children))
116- return peg.Rules(children=children[:], parse_tree=node)
116+ parse_rules = peg.Rules(children=[r for r in children if isinstance(r, peg.Rule)] )
117+ settings = peg.Settings(children=[r for r in children if isinstance(r, peg.Setting)] )
118+ assert len(children) == len(parse_rules) + len(settings), f'Number of parse_rules ({len(parse_rules)}) and settings ({len(settings)}), does not match total: {len(children)}'
119+ return (parse_rules, settings) # XXX not an AST! XXX
117120
118121
119122 def visit_peg_grammar(self, node, children): # No support for settings XXX
120- rules=children[0]
121- assert len(children) == 1
122- logger.debug(f'visit_peg_grammar:: >>{node}<< #children={len(children)} ; rules={rules}:{type(rules)}')
123- return peg.Grammar(rules=rules, parse_tree=node)
123+ logger.debug('visit_peg_grammar::' + self._logstr_node_children(node, children))
124+ parse_rules, settings = children[0] #unpack the tuple of above
125+ return peg.Grammar(rules=parse_rules, settings=settings, parse_tree=node)
124126
125127
126128 def visit_setting_name(self, node, children):
@@ -129,6 +131,9 @@
129131 def visit_number(self, node, children):
130132 return peg.Number(value=str(node), parse_tree=node)
131133
134+ def visit_setting_xref(self, node, children):
135+ return peg.ID(name=str(node), parse_tree=node)
136+
132137 def visit_setting(self, node, children):
133138 logger.debug('visit_setting::' + self._logstr_node_children(node, children))
134139 return peg.Setting(name=children[0], value=children[1] , parse_tree=node)
diff -r b15dd4fa21b1 -r f8bd16e1d4e3 pytst/readers/parser/d2_ast/__init__.py
--- a/pytst/readers/parser/d2_ast/__init__.py Sun Feb 13 22:05:55 2022 +0100
+++ b/pytst/readers/parser/d2_ast/__init__.py Mon Feb 14 18:27:24 2022 +0100
@@ -43,12 +43,14 @@
4343 assert_ID(ast[i], name)
4444
4545
46-def assert_Rule(ast, rune_name=None):
46+def assert_ParseRule(ast, rule_name=None):
4747 assert isinstance(ast, peg.Rule), "It should be an Rule"
48- if rune_name:
49- assert_ID(ast.name, rune_name)
50-precondition_Rule = assert_Rule
48+ if rule_name: assert_ID(ast.name, rule_name)
5149
50+def assert_Rule(ast, rule_name=None):
51+ assert isinstance(ast, (peg.Rule, peg.Setting))
52+ if isinstance(ast, peg.Rule): assert_ParseRule(ast, rule_name)
53+ if isinstance(ast, peg.Setting): assert_Setting(ast, rule_name)
5254
5355 def precondition_Expressions(expr, *, type=peg.Sequence, length=None):
5456 assert isinstance(expr, type), "PreCondition failed"
@@ -62,10 +64,20 @@
6264 rules = ast.rules
6365 assert isinstance(rules, peg.Rules)
6466 if no_of_rules:
65- assert len(rules) == no_of_rules, "We expect the same number as Rules as lines"
67+ assert len(rules) == no_of_rules, f"The number of (parse_)rules ({len(rules)}) does not match the spec: {no_of_rules}"
6668
6769 settings = ast.settings
68- assert isinstance(settings, (type(None), peg.Settings))
70+ if settings:
71+ assert isinstance(settings, peg.Settings)
6972 if no_of_settings:
70- assert isinstance(settings, peg.Settings)
71- len(settings) == no_of_settings
73+ assert len(settings) == no_of_settings, f"The number of settings ({len(settings)}) does not match the spec: {no_of_settings}"
74+
75+
76+def assert_Setting(ast, pegType=None, name=None, value=None):
77+ assert isinstance(ast, peg.Setting)
78+ assert isinstance(ast.name, peg.ID)
79+ assert isinstance(ast.value, (peg.StrTerm, peg.RegExpTerm, peg.Number, peg.ID)), f'Unexpected Type for ast.value: {type(ast.value)}'
80+
81+ if pegType: assert isinstance(ast.value, pegType)
82+ if name: assert ast.name.name == name
83+ if value: assert ast.value.value == value
diff -r b15dd4fa21b1 -r f8bd16e1d4e3 pytst/readers/parser/d2_ast/test_3_rule.py
--- a/pytst/readers/parser/d2_ast/test_3_rule.py Sun Feb 13 22:05:55 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_3_rule.py Mon Feb 14 18:27:24 2022 +0100
@@ -4,7 +4,7 @@
44 from castle.readers.parser import grammar
55 from castle.ast import peg
66
7-from . import parse, assert_ID, assert_Seq, assert_Rule
7+from . import parse, assert_ID, assert_Seq, assert_ParseRule
88
99
1010 def test_trivial_rule_with_2IDS():
@@ -13,7 +13,7 @@
1313 txt="trivial <- cross ;"
1414 ast = parse(txt, grammar.parse_rule)
1515
16- assert_Rule(ast, rune_name=txt.split()[0]) # The name of a rule is a ID with the left-side ID as name
16+ assert_ParseRule(ast, rule_name=txt.split()[0]) # The name of a rule is a ID with the left-side ID as name
1717
1818 expr = ast.expr
1919 assert_Seq(expr, length=1)
@@ -24,7 +24,7 @@
2424 txt = """aRule <- 'aStr' aCross /regexp/ ;"""
2525 ast = parse(txt, grammar.parse_rule)
2626
27- assert_Rule(ast, rune_name=txt.split()[0])
27+ assert_ParseRule(ast, rule_name=txt.split()[0])
2828
2929 expr = ast.expr;
3030 assert_Seq(expr, length=3)
diff -r b15dd4fa21b1 -r f8bd16e1d4e3 pytst/readers/parser/d2_ast/test_3_settings.py
--- a/pytst/readers/parser/d2_ast/test_3_settings.py Sun Feb 13 22:05:55 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_3_settings.py Mon Feb 14 18:27:24 2022 +0100
@@ -3,34 +3,32 @@
33 from castle.readers.parser import grammar
44 from castle.ast import peg
55
6-from . import parse
7-
8-def validate_setting(ast, pegType=None, name=None, value=None):
9- assert isinstance(ast, peg.Setting)
10- assert isinstance(ast.name, peg.ID)
11- assert isinstance(ast.value, (peg.StrTerm, peg.RegExpTerm, peg.Number))
12-
13- if pegType: assert isinstance(ast.value, pegType)
14- if name: assert ast.name.name == name
15- if value: assert ast.value.value == value
6+from . import parse, assert_Setting
167
178
189 def test_setting_a_value42():
1910 txt="aNumber = 42;"
2011 ast = parse(txt, grammar.setting)
21- validate_setting(ast, pegType=peg.Number, name='aNumber', value='42')
12+ assert_Setting(ast, pegType=peg.Number, name='aNumber', value='42')
2213
2314 def test_setting_str1():
2415 txt="String = '42';"
2516 ast = parse(txt, grammar.setting)
26- validate_setting(ast, pegType=peg.StrTerm, name='String', value='42')
17+ assert_Setting(ast, pegType=peg.StrTerm, name='String', value='42')
2718
2819 def test_setting_str2():
2920 txt='''String = "42";'''
3021 ast = parse(txt, grammar.setting)
31- validate_setting(ast, pegType=peg.StrTerm, name='String', value='42')
22+ assert_Setting(ast, pegType=peg.StrTerm, name='String', value='42')
3223
3324 def test_setting_re():
3425 txt="RegExp = /abc/;"
3526 ast = parse(txt, grammar.setting)
36- validate_setting(ast, pegType=peg.RegExpTerm, name='RegExp', value='abc')
27+ assert_Setting(ast, pegType=peg.RegExpTerm, name='RegExp', value='abc')
28+
29+def test_setting_setting_xref():
30+ txt="aSetting = anOtherSetting;"
31+ ast = parse(txt, grammar.setting)
32+ assert_Setting(ast, pegType=peg.ID, name='aSetting')
33+ assert ast.value.name == 'anOtherSetting'
34+
diff -r b15dd4fa21b1 -r f8bd16e1d4e3 pytst/readers/parser/d2_ast/test_5_group.py
--- a/pytst/readers/parser/d2_ast/test_5_group.py Sun Feb 13 22:05:55 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_5_group.py Mon Feb 14 18:27:24 2022 +0100
@@ -4,7 +4,7 @@
44 from castle.readers.parser import grammar
55 from castle.ast import peg
66
7-from . import parse, assert_ID, precondition_Rule, assert_Seq
7+from . import parse, assert_ID, assert_ParseRule, assert_Seq
88
99
1010 def assert_Group(grp, length=1, groupType=peg.Sequence, ids=None):
@@ -18,7 +18,7 @@
1818 txt = "R <- ( A B ) ;"
1919
2020 ast = parse(txt, grammar.parse_rule)
21- precondition_Rule(ast, 'R')
21+ assert_ParseRule(ast, 'R')
2222
2323 grp = ast.expr
2424 assert_Group(grp, ids=('A', 'B'))
@@ -28,7 +28,7 @@
2828 txt = "R <- ( ( A B ) ) ;"
2929
3030 ast = parse(txt, grammar.parse_rule)
31- precondition_Rule(ast, 'R')
31+ assert_ParseRule(ast, 'R')
3232
3333 grp = ast.expr
3434 assert_Group(grp)
@@ -41,7 +41,7 @@
4141 txt = "R <- ( A B )# ;"
4242
4343 ast = parse(txt, grammar.parse_rule)
44- precondition_Rule(ast, 'R')
44+ assert_ParseRule(ast, 'R')
4545
4646 grp = ast.expr
4747 assert_Group(grp, groupType=peg.UnorderedGroup)
diff -r b15dd4fa21b1 -r f8bd16e1d4e3 pytst/readers/parser/d2_ast/test_7_rules.py
--- a/pytst/readers/parser/d2_ast/test_7_rules.py Sun Feb 13 22:05:55 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_7_rules.py Mon Feb 14 18:27:24 2022 +0100
@@ -4,11 +4,31 @@
44 from castle.readers.parser import grammar
55 from castle.ast import peg
66
7-from . import parse, assert_Rule
7+from . import parse, assert_Rule, assert_ParseRule, assert_Setting
88
9-def test_some_rules():
9+def test_some_parse_rules():
1010 txt="""R1 <- A;
1111 R2 <- B;"""
12+ ast = parse(txt, grammar.rules)
13+
14+ assert isinstance(ast, peg.Rules)
15+ assert len(ast) == 2, "We expect the same number as Rules as lines"
16+ for p in ast:
17+ assert_ParseRule(p)
18+
19+def test_some_setting_rules():
20+ txt="""S1 = A;
21+ S2 = 42;"""
22+ ast = parse(txt, grammar.rules, visitor_debug=False)
23+
24+ assert isinstance(ast, peg.Rules)
25+ assert len(ast) == 2, "We expect the same number as Rules as lines"
26+ for s in ast:
27+ assert_Setting(s)
28+
29+def test_mixed_rules():
30+ txt="""M1 <- A;
31+ M2 = B;"""
1232 ast = parse(txt, grammar.rules, visitor_debug=False)
1333
1434 assert isinstance(ast, peg.Rules)
@@ -17,3 +37,4 @@
1737 assert_Rule(r)
1838
1939
40+
diff -r b15dd4fa21b1 -r f8bd16e1d4e3 pytst/readers/parser/d2_ast/test_8_grammar.py
--- a/pytst/readers/parser/d2_ast/test_8_grammar.py Sun Feb 13 22:05:55 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_8_grammar.py Mon Feb 14 18:27:24 2022 +0100
@@ -26,6 +26,7 @@
2626 ast = parse(txt, grammar.peg_grammar, with_comments=True)
2727 assert_PEG(ast, no_of_rules=2)
2828
29+
2930 def test_with_start_comment():
3031 txt="""// COMMENT
3132 R1 <- A;
@@ -33,4 +34,24 @@
3334 ast = parse(txt, grammar.peg_grammar, with_comments=True)
3435 assert_PEG(ast, no_of_rules=2)
3536
37+def test_grammar_with_mixed_rules():
38+ txt="""M1 <- A;
39+ M2 = B;"""
40+ ast = parse(txt, grammar.peg_grammar)
3641
42+ assert isinstance(ast, peg.Grammar)
43+ assert_PEG(ast, no_of_rules=1, no_of_settings=1)
44+
45+def test_grammar_with_many_rules():
46+ txt="""R1 <- a;
47+ R2 <- bb;
48+ S1 = 1;
49+ R3 <- ccc;
50+ R4 <- dddd;
51+ S2 = 2;
52+ R5 <- eeeee;
53+ S3 = 3;"""
54+ ast = parse(txt, grammar.peg_grammar)
55+
56+ assert isinstance(ast, peg.Grammar)
57+ assert_PEG(ast, no_of_rules=5, no_of_settings=3)