• R/O
  • SSH

Commit

Tags
Aucun tag

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

Révision7652c23a796e7c9b11479fa239b11d051c51f9bd (tree)
l'heure2022-01-16 00:51:27
AuteurAlbert Mietus < albert AT mietus DOT nl >
CommiterAlbert Mietus < albert AT mietus DOT nl >

Message de Log

Added support for Predicate

Change Summary

Modification

diff -r bf6d9d5f9438 -r 7652c23a796e AST/castle/peg.py
--- a/AST/castle/peg.py Fri Jan 14 23:52:02 2022 +0100
+++ b/AST/castle/peg.py Sat Jan 15 16:51:27 2022 +0100
@@ -107,6 +107,6 @@
107107 class OneOrMore(Quantity):pass
108108
109109
110-class Predicate(Expression): pass # abstract
110+class Predicate(MixIn_expr_attribute, Expression): pass # abstract
111111 class AndPredicate(Predicate): pass
112112 class NotPredicate(Predicate): pass
diff -r bf6d9d5f9438 -r 7652c23a796e Arpeggio/grammar.py
--- a/Arpeggio/grammar.py Fri Jan 14 23:52:02 2022 +0100
+++ b/Arpeggio/grammar.py Sat Jan 15 16:51:27 2022 +0100
@@ -7,9 +7,9 @@
77 def rule(): return rule_name, '<-', expressions, ";"
88
99 def expressions(): return ( OneOrMore(single_expr), Optional( '|' , expressions ) )
10-def single_expr(): return ( [ rule_crossref, term, group, predicate ], expr_quantity)
10+def single_expr(): return ( [ rule_crossref, term, group, predicate ], op_quantity)
1111
12-def expr_quantity(): return Optional([ '?' , '*' , '+' , '#' ])
12+def op_quantity(): return Optional([ '?' , '*' , '+' , '#' ])
1313 def term(): return [ str_term, regex_term ]
1414 def group(): return '(', expressions, ')'
1515 def predicate(): return ['&','!'], single_expr
diff -r bf6d9d5f9438 -r 7652c23a796e Arpeggio/pytst/d2_ast/__init__.py
--- a/Arpeggio/pytst/d2_ast/__init__.py Fri Jan 14 23:52:02 2022 +0100
+++ b/Arpeggio/pytst/d2_ast/__init__.py Sat Jan 15 16:51:27 2022 +0100
@@ -21,8 +21,13 @@
2121
2222 def assert_ID(id, name:str=None, err_message="Not correct Name"):
2323 assert name is not None
24- assert isinstance(id, peg.ID), "The id should be an ID"
24+ assert isinstance(id, peg.ID), f"The id should be an ID, but is a {type(id)}"
2525 peg.ID.validate_or_raise(id) # with correct syntax
2626 assert id.name == name, err_message if err_message else f"Note correct name, expected {name}"
27+precondition_ID = assert_ID # It's not a "validation assert", but a precondition for the test
2728
29+def precondition_Expressions(expr, *, type=peg.Sequence, length=None):
30+ assert isinstance(expr, type), "PreCondition failed"
31+ if length:
32+ assert len(expr)==length, "PreCondition failed"
2833
diff -r bf6d9d5f9438 -r 7652c23a796e Arpeggio/pytst/d2_ast/test_6_predicate.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Arpeggio/pytst/d2_ast/test_6_predicate.py Sat Jan 15 16:51:27 2022 +0100
@@ -0,0 +1,29 @@
1+import pytest
2+import logging; logger = logging.getLogger(__name__)
3+
4+import grammar
5+from castle import peg # has the AST classes
6+
7+from . import parse, assert_ID, precondition_ID, precondition_Expressions
8+
9+def simple_ID_Predicate_ID(txt, predicateType, rule_name='R', id0='A', predicateID='B', id2='C'):
10+ ast = parse(txt, grammar.rule)
11+ precondition_ID(ast.name, rule_name)
12+
13+ expr = ast.expr
14+ precondition_Expressions(expr, length=3, type=peg.Sequence)
15+ precondition_ID(expr[0], id0)
16+ precondition_ID(expr[2], id2)
17+
18+ predicate= expr[1]
19+ logger.debug(f'predicate: {predicate}')
20+
21+ assert isinstance(predicate, peg.Predicate)
22+ assert isinstance(predicate, predicateType)
23+ assert_ID(predicate.expr, predicateID)
24+
25+def test_simple_AndPredicate():
26+ simple_ID_Predicate_ID("R <- A &B C;", peg.AndPredicate)
27+
28+def test_simple_NotPredicate():
29+ simple_ID_Predicate_ID("R <- A !B C;", peg.NotPredicate)
diff -r bf6d9d5f9438 -r 7652c23a796e Arpeggio/visitor.py
--- a/Arpeggio/visitor.py Fri Jan 14 23:52:02 2022 +0100
+++ b/Arpeggio/visitor.py Sat Jan 15 16:51:27 2022 +0100
@@ -6,6 +6,7 @@
66 import logging;logger = logging.getLogger(__name__)
77
88 class QuantityError(ValueError): pass
9+class PredicateError(ValueError): pass
910
1011
1112 #NO_VISITOR_NEEDED: visit_str_no_s1
@@ -39,7 +40,7 @@
3940 def visit_rule(self, node, children): # Name '<-' expressions ';'
4041 return peg.Rule(name=children[0],expr=children[1], parse_tree=node)
4142
42- def visit_single_expr(self, node, children): # [ rule_crossref, term, group, predicate ], expr_quantity
43+ def visit_single_expr(self, node, children): # [ rule_crossref, term, group, predicate ], op_quantity
4344 if len(children) == 1: # No Optional part
4445 try:
4546 n = f'name={children[0].name}'
@@ -70,3 +71,21 @@
7071 logger.debug(f'visit_expressions:: >>{node}<< len={len(children)} children={children}:{type(children)}')
7172 return peg.Sequence(value=children, parse_tree=node)
7273
74+
75+ def visit_predicate(self, node, children):
76+ token_2_predicate = {'&': peg.AndPredicate,
77+ '!': peg.NotPredicate}
78+ logger.debug(f'visit_predicate:: >>{node}<< len={len(children)}')
79+
80+ if len(children) == 2:
81+ token = children[0]
82+ cls = token_2_predicate.get(token)
83+ if cls:
84+ ast = cls(expr=children[1], parse_tree=node)
85+ return ast
86+ else:
87+ raise PredicateError(f"token '{token}' not recognised")
88+ else:
89+ raise NotImplementedError("visit_predicate, len!=2") # XXX -- Is this possible?
90+
91+