Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
Revisión | 505c823ca2b935a5b3af3d55657559284e90e0ad (tree) |
---|---|
Tiempo | 2022-02-13 07:54:03 |
Autor | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
Added basic support for 'Settings' in grammar.py -- TESTS are needed
@@ -2,9 +2,10 @@ | ||
2 | 2 | from arpeggio import RegExMatch as _ |
3 | 3 | from arpeggio import ParserPython |
4 | 4 | |
5 | + | |
5 | 6 | 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, ";" | |
8 | 9 | |
9 | 10 | def expression(): return sequence, op_alternative |
10 | 11 | def sequence(): return OneOrMore(single_expr) |
@@ -42,9 +43,9 @@ | ||
42 | 43 | def value(): return [ str_term, regex_term, number, setting_xref ] |
43 | 44 | def number(): return [ complex_lit, float_lit, int_lit ] |
44 | 45 | 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]*") | |
48 | 49 | |
49 | 50 | |
50 | 51 | S1 = "'" |
@@ -37,7 +37,7 @@ | ||
37 | 37 | def visit_rule_crossref(self, node, children): |
38 | 38 | return peg.ID(name=str(node), parse_tree=node) |
39 | 39 | |
40 | - def visit_rule(self, node, children): # Name '<-' expression ';' | |
40 | + def visit_parse_rule(self, node, children): # Name '<-' expression ';' | |
41 | 41 | return peg.Rule(name=children[0],expr=children[1], parse_tree=node) |
42 | 42 | |
43 | 43 |
@@ -7,7 +7,7 @@ | ||
7 | 7 | RE, S = arpeggio.RegExMatch, arpeggio.StrMatch # shortcut |
8 | 8 | |
9 | 9 | def parse_rule(txt, pattern=None): |
10 | - parser = arpeggio.ParserPython(grammar.rule) | |
10 | + parser = arpeggio.ParserPython(grammar.parse_rule) | |
11 | 11 | tree = parser.parse(txt) |
12 | 12 | logger.debug(f'\nTREE\n{tree.tree_str()}') |
13 | 13 |
@@ -1,22 +1,23 @@ | ||
1 | -##import visitor | |
2 | -from castle.readers.parser import visitor | |
1 | +import logging; logger = logging.getLogger(__name__) | |
2 | + | |
3 | 3 | import arpeggio |
4 | 4 | |
5 | +from castle.readers.parser import visitor | |
5 | 6 | from castle.readers.parser import grammar |
6 | 7 | from castle.ast import peg |
7 | 8 | |
8 | 9 | def parse(txt, rule, *, |
9 | 10 | with_comments=False, |
10 | - print_tree_debug=False, | |
11 | 11 | visitor_debug=False): |
12 | 12 | |
13 | 13 | parser = arpeggio.ParserPython(rule, comment_def = grammar.comment if with_comments else None) |
14 | 14 | pt = parser.parse(txt) |
15 | + logger.debug('PARSE_TREE\n'+pt.tree_str()) | |
15 | 16 | |
16 | - if print_tree_debug: | |
17 | - print('\n'+pt.tree_str()) | |
18 | 17 | assert pt.position_end == len(txt), f"Did not parse all input txt=>>{txt}<<len={len(txt)} ==> parse_tree: >>{pt}<<_end={pt.position_end}" |
19 | 18 | ast = arpeggio.visit_parse_tree(pt, visitor.PegVisitor(debug=visitor_debug)) |
19 | + logger.debug('AST\n' + f'{ast}:{type(ast).__name__}') | |
20 | + | |
20 | 21 | if with_comments: # When the txt starts with comments, the AST does start 'after' that comment -- so skip the start-check |
21 | 22 | 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)}" |
22 | 23 | else: |
@@ -11,7 +11,7 @@ | ||
11 | 11 | """The most simple rule has only two IDs""" |
12 | 12 | |
13 | 13 | txt="trivial <- cross ;" |
14 | - ast = parse(txt, grammar.rule) | |
14 | + ast = parse(txt, grammar.parse_rule) | |
15 | 15 | |
16 | 16 | assert_Rule(ast, rune_name=txt.split()[0]) # The name of a rule is a ID with the left-side ID as name |
17 | 17 |
@@ -22,7 +22,7 @@ | ||
22 | 22 | |
23 | 23 | def test_rule_with_ID_and_terms(): |
24 | 24 | txt = """aRule <- 'aStr' aCross /regexp/ ;""" |
25 | - ast = parse(txt, grammar.rule) | |
25 | + ast = parse(txt, grammar.parse_rule) | |
26 | 26 | |
27 | 27 | assert_Rule(ast, rune_name=txt.split()[0]) |
28 | 28 |
@@ -11,7 +11,7 @@ | ||
11 | 11 | def assert_Quantification(token:str, kind:type(peg.Quantity)): |
12 | 12 | txt = f"R <- X {token} ;" |
13 | 13 | |
14 | - ast = parse(txt, grammar.rule) | |
14 | + ast = parse(txt, grammar.parse_rule) | |
15 | 15 | assert_ID(ast.name, 'R') |
16 | 16 | |
17 | 17 | expr = ast.expr |
@@ -17,7 +17,7 @@ | ||
17 | 17 | def test_simple_group(): |
18 | 18 | txt = "R <- ( A B ) ;" |
19 | 19 | |
20 | - ast = parse(txt, grammar.rule) | |
20 | + ast = parse(txt, grammar.parse_rule) | |
21 | 21 | precondition_Rule(ast, 'R') |
22 | 22 | |
23 | 23 | grp = ast.expr |
@@ -27,7 +27,7 @@ | ||
27 | 27 | def test_nested_group(): |
28 | 28 | txt = "R <- ( ( A B ) ) ;" |
29 | 29 | |
30 | - ast = parse(txt, grammar.rule) | |
30 | + ast = parse(txt, grammar.parse_rule) | |
31 | 31 | precondition_Rule(ast, 'R') |
32 | 32 | |
33 | 33 | grp = ast.expr |
@@ -40,7 +40,7 @@ | ||
40 | 40 | def test_unordered_group(): |
41 | 41 | txt = "R <- ( A B )# ;" |
42 | 42 | |
43 | - ast = parse(txt, grammar.rule) | |
43 | + ast = parse(txt, grammar.parse_rule) | |
44 | 44 | precondition_Rule(ast, 'R') |
45 | 45 | |
46 | 46 | grp = ast.expr |
@@ -7,7 +7,7 @@ | ||
7 | 7 | from . import parse, assert_ID, precondition_ID, precondition_Expressions |
8 | 8 | |
9 | 9 | 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) | |
11 | 11 | precondition_ID(ast.name, rule_name) |
12 | 12 | |
13 | 13 | expr = ast.expr |
@@ -9,7 +9,7 @@ | ||
9 | 9 | def test_some_rules(): |
10 | 10 | txt="""R1 <- A; |
11 | 11 | R2 <- B;""" |
12 | - ast = parse(txt, grammar.rules, print_tree_debug=False, visitor_debug=False) | |
12 | + ast = parse(txt, grammar.rules, visitor_debug=False) | |
13 | 13 | |
14 | 14 | assert isinstance(ast, peg.Rules) |
15 | 15 | assert len(ast) == 2, "We expect the same number as Rules as lines" |