• 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évision505c823ca2b935a5b3af3d55657559284e90e0ad (tree)
l'heure2022-02-13 07:54:03
AuteurAlbert Mietus < albert AT mietus DOT nl >
CommiterAlbert Mietus < albert AT mietus DOT nl >

Message de Log

Added basic support for 'Settings' in grammar.py -- TESTS are needed

Change Summary

Modification

diff -r 038633259101 -r 505c823ca2b9 castle/readers/parser/grammar.py
--- a/castle/readers/parser/grammar.py Sat Feb 12 22:46:33 2022 +0100
+++ b/castle/readers/parser/grammar.py Sat Feb 12 23:54:03 2022 +0100
@@ -2,9 +2,10 @@
22 from arpeggio import RegExMatch as _
33 from arpeggio import ParserPython
44
5+
56 def peg_grammar(): return rules, EOF
6-def rules(): return OneOrMore(rule)
7-def rule(): return rule_name, '<-', expression, ";"
7+def rules(): return OneOrMore([parse_rule, setting])
8+def parse_rule(): return rule_name, '<-', expression, ";"
89
910 def expression(): return sequence, op_alternative
1011 def sequence(): return OneOrMore(single_expr)
@@ -42,9 +43,9 @@
4243 def value(): return [ str_term, regex_term, number, setting_xref ]
4344 def number(): return [ complex_lit, float_lit, int_lit ]
4445 def setting_xref(): return ID
45-def complex_lit(): return _("([0-9](*\.[0-9]*)?)[+-][iIjJ]([0-9](*\.[0-9]*)?)")
46-def float_lit(): return _("[0-9]*\.[0-9]+")
47-def int_lit(): return _("[1-9][0-9]*")
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]*")
4849
4950
5051 S1 = "'"
diff -r 038633259101 -r 505c823ca2b9 castle/readers/parser/visitor.py
--- a/castle/readers/parser/visitor.py Sat Feb 12 22:46:33 2022 +0100
+++ b/castle/readers/parser/visitor.py Sat Feb 12 23:54:03 2022 +0100
@@ -37,7 +37,7 @@
3737 def visit_rule_crossref(self, node, children):
3838 return peg.ID(name=str(node), parse_tree=node)
3939
40- def visit_rule(self, node, children): # Name '<-' expression ';'
40+ def visit_parse_rule(self, node, children): # Name '<-' expression ';'
4141 return peg.Rule(name=children[0],expr=children[1], parse_tree=node)
4242
4343
diff -r 038633259101 -r 505c823ca2b9 pytst/readers/parser/d1_parse_tree/test_4_rule.py
--- a/pytst/readers/parser/d1_parse_tree/test_4_rule.py Sat Feb 12 22:46:33 2022 +0100
+++ b/pytst/readers/parser/d1_parse_tree/test_4_rule.py Sat Feb 12 23:54:03 2022 +0100
@@ -7,7 +7,7 @@
77 RE, S = arpeggio.RegExMatch, arpeggio.StrMatch # shortcut
88
99 def parse_rule(txt, pattern=None):
10- parser = arpeggio.ParserPython(grammar.rule)
10+ parser = arpeggio.ParserPython(grammar.parse_rule)
1111 tree = parser.parse(txt)
1212 logger.debug(f'\nTREE\n{tree.tree_str()}')
1313
diff -r 038633259101 -r 505c823ca2b9 pytst/readers/parser/d2_ast/__init__.py
--- a/pytst/readers/parser/d2_ast/__init__.py Sat Feb 12 22:46:33 2022 +0100
+++ b/pytst/readers/parser/d2_ast/__init__.py Sat Feb 12 23:54:03 2022 +0100
@@ -1,22 +1,23 @@
1-##import visitor
2-from castle.readers.parser import visitor
1+import logging; logger = logging.getLogger(__name__)
2+
33 import arpeggio
44
5+from castle.readers.parser import visitor
56 from castle.readers.parser import grammar
67 from castle.ast import peg
78
89 def parse(txt, rule, *,
910 with_comments=False,
10- print_tree_debug=False,
1111 visitor_debug=False):
1212
1313 parser = arpeggio.ParserPython(rule, comment_def = grammar.comment if with_comments else None)
1414 pt = parser.parse(txt)
15+ logger.debug('PARSE_TREE\n'+pt.tree_str())
1516
16- if print_tree_debug:
17- print('\n'+pt.tree_str())
1817 assert pt.position_end == len(txt), f"Did not parse all input txt=>>{txt}<<len={len(txt)} ==> parse_tree: >>{pt}<<_end={pt.position_end}"
1918 ast = arpeggio.visit_parse_tree(pt, visitor.PegVisitor(debug=visitor_debug))
19+ logger.debug('AST\n' + f'{ast}:{type(ast).__name__}')
20+
2021 if with_comments: # When the txt starts with comments, the AST does start 'after' that comment -- so skip the start-check
2122 assert ast.position_end == len(txt), f"The AST (type={type(ast)}) does not include (start) comments; however typically the end_position ({ast.position_end}) is the end of the text ({len(txt)}"
2223 else:
diff -r 038633259101 -r 505c823ca2b9 pytst/readers/parser/d2_ast/test_3_rule.py
--- a/pytst/readers/parser/d2_ast/test_3_rule.py Sat Feb 12 22:46:33 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_3_rule.py Sat Feb 12 23:54:03 2022 +0100
@@ -11,7 +11,7 @@
1111 """The most simple rule has only two IDs"""
1212
1313 txt="trivial <- cross ;"
14- ast = parse(txt, grammar.rule)
14+ ast = parse(txt, grammar.parse_rule)
1515
1616 assert_Rule(ast, rune_name=txt.split()[0]) # The name of a rule is a ID with the left-side ID as name
1717
@@ -22,7 +22,7 @@
2222
2323 def test_rule_with_ID_and_terms():
2424 txt = """aRule <- 'aStr' aCross /regexp/ ;"""
25- ast = parse(txt, grammar.rule)
25+ ast = parse(txt, grammar.parse_rule)
2626
2727 assert_Rule(ast, rune_name=txt.split()[0])
2828
diff -r 038633259101 -r 505c823ca2b9 pytst/readers/parser/d2_ast/test_4_quantity.py
--- a/pytst/readers/parser/d2_ast/test_4_quantity.py Sat Feb 12 22:46:33 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_4_quantity.py Sat Feb 12 23:54:03 2022 +0100
@@ -11,7 +11,7 @@
1111 def assert_Quantification(token:str, kind:type(peg.Quantity)):
1212 txt = f"R <- X {token} ;"
1313
14- ast = parse(txt, grammar.rule)
14+ ast = parse(txt, grammar.parse_rule)
1515 assert_ID(ast.name, 'R')
1616
1717 expr = ast.expr
diff -r 038633259101 -r 505c823ca2b9 pytst/readers/parser/d2_ast/test_5_group.py
--- a/pytst/readers/parser/d2_ast/test_5_group.py Sat Feb 12 22:46:33 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_5_group.py Sat Feb 12 23:54:03 2022 +0100
@@ -17,7 +17,7 @@
1717 def test_simple_group():
1818 txt = "R <- ( A B ) ;"
1919
20- ast = parse(txt, grammar.rule)
20+ ast = parse(txt, grammar.parse_rule)
2121 precondition_Rule(ast, 'R')
2222
2323 grp = ast.expr
@@ -27,7 +27,7 @@
2727 def test_nested_group():
2828 txt = "R <- ( ( A B ) ) ;"
2929
30- ast = parse(txt, grammar.rule)
30+ ast = parse(txt, grammar.parse_rule)
3131 precondition_Rule(ast, 'R')
3232
3333 grp = ast.expr
@@ -40,7 +40,7 @@
4040 def test_unordered_group():
4141 txt = "R <- ( A B )# ;"
4242
43- ast = parse(txt, grammar.rule)
43+ ast = parse(txt, grammar.parse_rule)
4444 precondition_Rule(ast, 'R')
4545
4646 grp = ast.expr
diff -r 038633259101 -r 505c823ca2b9 pytst/readers/parser/d2_ast/test_6_predicate.py
--- a/pytst/readers/parser/d2_ast/test_6_predicate.py Sat Feb 12 22:46:33 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_6_predicate.py Sat Feb 12 23:54:03 2022 +0100
@@ -7,7 +7,7 @@
77 from . import parse, assert_ID, precondition_ID, precondition_Expressions
88
99 def simple_ID_Predicate_ID(txt, predicateType, rule_name='R', id0='A', predicateID='B', id2='C'):
10- ast = parse(txt, grammar.rule)
10+ ast = parse(txt, grammar.parse_rule)
1111 precondition_ID(ast.name, rule_name)
1212
1313 expr = ast.expr
diff -r 038633259101 -r 505c823ca2b9 pytst/readers/parser/d2_ast/test_7_rules.py
--- a/pytst/readers/parser/d2_ast/test_7_rules.py Sat Feb 12 22:46:33 2022 +0100
+++ b/pytst/readers/parser/d2_ast/test_7_rules.py Sat Feb 12 23:54:03 2022 +0100
@@ -9,7 +9,7 @@
99 def test_some_rules():
1010 txt="""R1 <- A;
1111 R2 <- B;"""
12- ast = parse(txt, grammar.rules, print_tree_debug=False, visitor_debug=False)
12+ ast = parse(txt, grammar.rules, visitor_debug=False)
1313
1414 assert isinstance(ast, peg.Rules)
1515 assert len(ast) == 2, "We expect the same number as Rules as lines"