• 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

修订版5800f73c267c1a8b3e80a2ebeb809f5d9a6fd66a (tree)
时间2022-02-12 07:09:00
作者Albert Mietus < albert AT mietus DOT nl >
CommiterAlbert Mietus < albert AT mietus DOT nl >

Log Message

Refactored: renamed expressions into sequence; in GRAMMER (and all other files)

更改概述

差异

diff -r 5821f8fe1033 -r 5800f73c267c castle/ast/peg.py
--- a/castle/ast/peg.py Fri Feb 11 22:21:13 2022 +0100
+++ b/castle/ast/peg.py Fri Feb 11 23:09:00 2022 +0100
@@ -114,7 +114,7 @@
114114
115115
116116 class UnorderedGroup(MixIn_expr_attribute, Group): # It looks like a Quantity, but is a group
117- """See a set (aka "group") of expressions that **all** have to be matched, but the **order** is a don't care.
117+ """A set (aka "group") of expressions that **all** have to be matched, but the **order** is a don't care.
118118
119119 Possible an extension of Arpeggio (see: https://textx.github.io/Arpeggio/stable/grammars/), possible a generic one."""
120120
diff -r 5821f8fe1033 -r 5800f73c267c castle/readers/parser/grammar.py
--- a/castle/readers/parser/grammar.py Fri Feb 11 22:21:13 2022 +0100
+++ b/castle/readers/parser/grammar.py Fri Feb 11 23:09:00 2022 +0100
@@ -6,8 +6,8 @@
66 def rules(): return OneOrMore(rule)
77 def rule(): return rule_name, '<-', expression, ";"
88
9-def expression(): return expressions, op_alternative
10-def expressions(): return OneOrMore(single_expr)
9+def expression(): return sequence, op_alternative
10+def sequence(): return OneOrMore(single_expr)
1111 def single_expr(): return [ rule_crossref, term, group, predicate ], op_quantity
1212
1313 def op_alternative(): return Optional( '|' , expression )
diff -r 5821f8fe1033 -r 5800f73c267c castle/readers/parser/visitor.py
--- a/castle/readers/parser/visitor.py Fri Feb 11 22:21:13 2022 +0100
+++ b/castle/readers/parser/visitor.py Fri Feb 11 23:09:00 2022 +0100
@@ -3,6 +3,7 @@
33 from castle.ast import peg
44
55 import logging;logger = logging.getLogger(__name__)
6+from typing import Union
67
78 class QuantityError(ValueError): pass
89 class PredicateError(ValueError): pass
@@ -65,9 +66,10 @@
6566 raise NotImplementedError("visit_single_expr, len>2") # XXX -- Is this possible?
6667
6768
68- def visit_expression(self, node, children): # expression <- expressionS, op_alternative; op_alternative <- ('|' expression)?
69+ # expression <- sequence, op_alternative; op_alternative <- ('|' expression)?
70+ def visit_expression(self, node, children) -> Union[peg.Sequence, peg.OrderedChoice]:
6971 logger.debug('visit_expression::' + self._logstr_node_children(node, children))
70- if len(children) == 1: #Only expressions
72+ if len(children) == 1: #Only sequence
7173 return children[0]
7274 elif len(children) == 2: # So, having 1 or more alternatives in children[1]
7375 # In all cased a (single) OrderedChoice with a list of alternatives should be returned.
@@ -79,9 +81,9 @@
7981 else:
8082 raise NotImplementedError("visit_expression, len>2")
8183
82-
83- def visit_expressions(self, node, children): # OneOrMore(single_expr)
84- logger.debug(f'visit_expressions::{self._logstr_node_children(node, children)}')
84+ # OneOrMore(single_expr)
85+ def visit_sequence(self, node, children) -> peg.Sequence:
86+ logger.debug(f'visit_sequence::{self._logstr_node_children(node, children)}')
8587 return peg.Sequence(value=children, parse_tree=node)
8688
8789
diff -r 5821f8fe1033 -r 5800f73c267c demos/readers/parser/test_Rule.py
--- a/demos/readers/parser/test_Rule.py Fri Feb 11 22:21:13 2022 +0100
+++ b/demos/readers/parser/test_Rule.py Fri Feb 11 23:09:00 2022 +0100
@@ -59,4 +59,4 @@
5959
6060 def test_QAZ_rule_name(): QAZ("""aName""", grammar.rule_name, label="rule_name")
6161 def test_QAZ_rule_crossref(): QAZ("""aName""", grammar.rule_crossref, label="rule_crossref")
62-def test_QAZ_expressions(): QAZ("""aName""", grammar.expressions, label="expressions")
62+def test_QAZ_expression(): QAZ("""aName""", grammar.expression, label="expression")
diff -r 5821f8fe1033 -r 5800f73c267c pytst/readers/parser/d1_parse_tree/test_3_expr.py
--- a/pytst/readers/parser/d1_parse_tree/test_3_expr.py Fri Feb 11 22:21:13 2022 +0100
+++ b/pytst/readers/parser/d1_parse_tree/test_3_expr.py Fri Feb 11 23:09:00 2022 +0100
@@ -9,7 +9,12 @@
99 P = grammar.predicate.__name__
1010 G = grammar.group.__name__
1111
12-def parse_expression(txt, pattern=None):
12+
13+def validate_expression(txt, pattern):
14+ parse_tree = parse_expression(txt)
15+ validate_pattern(parse_tree, pattern=pattern)
16+
17+def parse_expression(txt):
1318 parser = arpeggio.ParserPython(grammar.expression)
1419 parse_tree = parser.parse(txt)
1520 logger.debug("\nPARSE-TREE\n" + parse_tree.tree_str()+'\n')
@@ -17,15 +22,14 @@
1722 assert parse_tree.position_end == len(txt) , f"Not parsed whole input; Only: >>{txt[parse_tree.position: parse_tree.position_end]}<<; Not: >>{txt[parse_tree.position_end:]}<<."
1823 assert parse_tree.rule_name == "expression"
1924
20- if pattern: validate_pattern(parse_tree, pattern=pattern)
21-
2225 return parse_tree
2326
27+
2428 def validate_pattern(pt, pattern=None):
25- expressions = pt[0]
26- assert len(expressions) == len(pattern), f"Not correct number-of-element"
29+ elements = pt[0]
30+ assert len(elements) == len(pattern), f"Not correct number-of-element"
2731
28- for p, s in zip(pattern, expressions):
32+ for p, s in zip(pattern, elements):
2933 if p is None: continue
3034 if p == X:
3135 assert s[0].rule_name == p
@@ -40,19 +44,19 @@
4044 assert False, "To Do: More"
4145
4246
43-def test_simple_1(): parse_expression(r"abc", pattern=[X])
44-def test_simple_2(): parse_expression(r'A Bc', pattern=[X, X])
45-
46-def test_string_1(): parse_expression(r"'abc'", pattern=[S])
47-def test_regexp_1(): parse_expression(r"/re/", pattern=[R])
47+def test_simple_1(): validate_expression(r"abc", pattern=[X])
48+def test_simple_2(): validate_expression(r'A Bc', pattern=[X, X])
4849
49-def test_mix(): parse_expression(r'/regex/ "string" crossref crossref', pattern=[R,S, X, X])
50+def test_string_1(): validate_expression(r"'abc'", pattern=[S])
51+def test_regexp_1(): validate_expression(r"/re/", pattern=[R])
5052
51-def test_sub(): parse_expression(r'( A B )', pattern=[(X, X)])
52-def test_mix_nosub(): parse_expression(r'/regex/ "string" ( A B ) crossref', pattern=[R,S, None, X])
53-def test_mix_sub(): parse_expression(r'/regex/ "string" ( A B ) crossref', pattern=[R,S, (X, X), X])
53+def test_mix(): validate_expression(r'/regex/ "string" crossref crossref', pattern=[R,S, X, X])
5454
55-def test_sub_sub(): parse_expression(r'level0 ( level1_1 (level2a level2b ) level1_2) level0', pattern=[X, (X, (X,X), X), X])
55+def test_sub(): validate_expression(r'( A B )', pattern=[(X, X)])
56+def test_mix_nosub(): validate_expression(r'/regex/ "string" ( A B ) crossref', pattern=[R,S, None, X])
57+def test_mix_sub(): validate_expression(r'/regex/ "string" ( A B ) crossref', pattern=[R,S, (X, X), X])
58+
59+def test_sub_sub(): validate_expression(r'level0 ( level1_1 (level2a level2b ) level1_2) level0', pattern=[X, (X, (X,X), X), X])
5660
5761
5862 def test_bug1(): parse_expression(r"""( rule_crossref | term | group | predicate ) ( '?' | '*' | '+' | '#' )?""")
diff -r 5821f8fe1033 -r 5800f73c267c pytst/readers/parser/d2_ast/test_1_term.py
--- a/pytst/readers/parser/d2_ast/test_1_term.py Fri Feb 11 22:21:13 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_1_term.py Fri Feb 11 23:09:00 2022 +0100
@@ -50,9 +50,9 @@
5050 regex_variants(txt:='''r"""re__rstr_d3"""''', expect=txt[4:-3])
5151
5252
53-def test_term_as_expressions(): # A term is **ALSO an expressions
53+def test_term_as_expression(): # A term is **ALSO an expression
5454 txt="'a string'"
55- ast = parse(txt, grammar.expressions)
55+ ast = parse(txt, grammar.expression)
5656 # result is same a above
5757 assert isinstance(ast, peg.Expression), "A (str)term is also an Expression"
5858 assert len(ast.value) == 1, "An expression with length==1"
diff -r 5821f8fe1033 -r 5800f73c267c pytst/readers/parser/d2_ast/test_2_ID.py
--- a/pytst/readers/parser/d2_ast/test_2_ID.py Fri Feb 11 22:21:13 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_2_ID.py Fri Feb 11 23:09:00 2022 +0100
@@ -15,18 +15,18 @@
1515
1616
1717 def test_rule_crossref():
18- """The rule's expressions can also refer an ID"""
18+ """The rule's expression can also refer an ID"""
1919
2020 txt="aRef"
2121 ast = parse(txt, grammar.rule_crossref)
2222 assert_ID(ast, name=txt)
2323
2424
25-def test_ID_as_expressions():
25+def test_ID_as_expression():
2626 """ An ID is also an expression"""
2727
2828 txt="aRef"
29- ast = parse(txt, grammar.expressions)
29+ ast = parse(txt, grammar.expression)
3030
3131 assert isinstance(ast, peg.Expression), "A crossref is also an Expression"
3232 assert len(ast.value) == 1, "An expression with length==1"
diff -r 5821f8fe1033 -r 5800f73c267c pytst/readers/parser/d2_ast/test_3_Seq.py
--- a/pytst/readers/parser/d2_ast/test_3_Seq.py Fri Feb 11 22:21:13 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_3_Seq.py Fri Feb 11 23:09:00 2022 +0100
@@ -1,4 +1,4 @@
1-"""Test that a sequence of expressions is an Expression()
1+"""Test that a kind of sequence's are Expression()
22 """
33
44 import pytest
diff -r 5821f8fe1033 -r 5800f73c267c pytst/readers/parser/grammar.peg
--- a/pytst/readers/parser/grammar.peg Fri Feb 11 22:21:13 2022 +0100
+++ b/pytst/readers/parser/grammar.peg Fri Feb 11 23:09:00 2022 +0100
@@ -4,15 +4,15 @@
44 rules <- rule+ ;
55 rule <- rule_name '<-' expression ';' ;
66
7-expression <- expressions op_alternative ;
8-expressions <- single_expr+ ;
7+expression <- sequence op_alternative ;
8+sequence <- single_expr+ ;
99 single_expr <- ( rule_crossref | term | group | predicate ) op_quantity ;
1010
1111 op_alternative <- ( '|' expression )? ;
1212 op_quantity <- ( '?' | '*' | '+' | '#' )? ;
1313
1414 term <- str_term | regex_term ;
15-group <- '(' expressions ')' ;
15+group <- '(' expression ')' ;
1616 predicate <- ( '&' | '!' ) single_expr ;
1717
1818 str_term <- "'" str_no_s1 "'"
diff -r 5821f8fe1033 -r 5800f73c267c pytst/writers/python/test_1_rules.py
--- a/pytst/writers/python/test_1_rules.py Fri Feb 11 22:21:13 2022 +0100
+++ b/pytst/writers/python/test_1_rules.py Fri Feb 11 23:09:00 2022 +0100
@@ -14,8 +14,3 @@
1414 id_rn = peg.ID(name="rule_crossref")
1515 id_xr = peg.ID(name="ID")
1616
17-
18-## expressions = peg.Sequence(value=id_xr
19-## rule = peg.Rule(name=id_rn, expr=expressions)
20-
21-## Template("""def {{rule.name}}()\treturn{rule.expro