Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
Révision | 9c5c65a7cdb0fc6e4559d4d8f1aa3398c2692e18 (tree) |
---|---|
l'heure | 2023-01-14 22:03:28 |
Auteur | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
untabified & return-statements alligned
@@ -19,49 +19,49 @@ | ||
19 | 19 | from arpeggio import ParserPython |
20 | 20 | |
21 | 21 | |
22 | -def peg_grammar(): return rules, EOF | |
23 | -def rules(): return OneOrMore([parse_rule, setting]) | |
24 | -def parse_rule(): return rule_name, '<-', expression, ";" | |
25 | - | |
26 | -def expression(): return sequence, op_alternative | |
27 | -def sequence(): return OneOrMore(single_expr) | |
28 | -def single_expr(): return [ rule_crossref, term, group, predicate ], op_quantity | |
29 | - | |
30 | -def op_alternative(): return Optional( '|' , expression ) | |
31 | -def op_quantity(): return Optional([ '?' , '*' , '+' , '#' ]) | |
32 | - | |
33 | -def term(): return [ str_term, regex_term ] | |
34 | -def group(): return '(', expression, ')' | |
35 | -def predicate(): return ['&','!'], single_expr | |
22 | +def peg_grammar(): return rules, EOF | |
23 | +def rules(): return OneOrMore([parse_rule, setting]) | |
24 | +def parse_rule(): return rule_name, '<-', expression, ";" | |
36 | 25 | |
37 | -def str_term(): return [ (S3, str_no_s3, S3), | |
38 | - (D3, str_no_d3, D3), | |
39 | - (S1, str_no_s1, S1), | |
40 | - (D1, str_no_d1, D1) ] | |
41 | -def regex_term(): return [ (RE, re_no_slash, RE), | |
42 | - (REs3, str_no_s3, S3), | |
43 | - (REd3, str_no_d3, D3), | |
44 | - (REs1, str_no_s1, S1), | |
45 | - (REd1, str_no_d1, D1) ] | |
46 | - | |
47 | -def rule_name(): return ID | |
48 | -def rule_crossref(): return ID | |
49 | -def ID(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") | |
26 | +def expression(): return sequence, op_alternative | |
27 | +def sequence(): return OneOrMore(single_expr) | |
28 | +def single_expr(): return [ rule_crossref, term, group, predicate ], op_quantity | |
50 | 29 | |
51 | -def re_no_slash(): return _(r"((\\/)|[^\/])*") | |
52 | -def str_no_s1(): return _(r"((\\')|[^'\n])*") # Does NOT match multiline -- note 'multiline=False' is not the same | |
53 | -def str_no_d1(): return _(r'((\\")|[^"\n])*') # idem | |
54 | -def str_no_s3(): return _(r"([^']|('[^'])|(''[^']))*") # ALLOW multiline | |
55 | -def str_no_d3(): return _(r'''([^"]|("[^"])|(""[^"]))*''') # idem | |
30 | +def op_alternative(): return Optional( '|' , expression ) | |
31 | +def op_quantity(): return Optional([ '?' , '*' , '+' , '#' ]) | |
56 | 32 | |
57 | -def setting(): return setting_name, '=', value, ';' | |
58 | -def setting_name(): return ID | |
59 | -def value(): return [ str_term, regex_term, number, setting_xref ] | |
60 | -def number(): return [ complex_lit, float_lit, int_lit ] | |
61 | -def setting_xref(): return ID | |
62 | -def complex_lit(): return _(r"[+-]?([0-9](\.[0-9]*)?)[+-][iIjJ]([0-9](\.[0-9]*)?)") | |
63 | -def float_lit(): return _(r"[+-]?[0-9]\.[0-9]+") | |
64 | -def int_lit(): return _(r"[+-]?[1-9][0-9]*") | |
33 | +def term(): return [ str_term, regex_term ] | |
34 | +def group(): return '(', expression, ')' | |
35 | +def predicate(): return ['&','!'], single_expr | |
36 | + | |
37 | +def str_term(): return [ (S3, str_no_s3, S3), | |
38 | + (D3, str_no_d3, D3), | |
39 | + (S1, str_no_s1, S1), | |
40 | + (D1, str_no_d1, D1) ] | |
41 | +def regex_term(): return [ (RE, re_no_slash, RE), | |
42 | + (REs3, str_no_s3, S3), | |
43 | + (REd3, str_no_d3, D3), | |
44 | + (REs1, str_no_s1, S1), | |
45 | + (REd1, str_no_d1, D1) ] | |
46 | + | |
47 | +def rule_name(): return ID | |
48 | +def rule_crossref(): return ID | |
49 | +def ID(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") | |
50 | + | |
51 | +def re_no_slash(): return _(r"((\\/)|[^\/])*") | |
52 | +def str_no_s1(): return _(r"((\\')|[^'\n])*") # Does NOT match multiline -- note 'multiline=False' is not the same | |
53 | +def str_no_d1(): return _(r'((\\")|[^"\n])*') # idem | |
54 | +def str_no_s3(): return _(r"([^']|('[^'])|(''[^']))*") # ALLOW multiline | |
55 | +def str_no_d3(): return _(r'''([^"]|("[^"])|(""[^"]))*''') # idem | |
56 | + | |
57 | +def setting(): return setting_name, '=', value, ';' | |
58 | +def setting_name(): return ID | |
59 | +def value(): return [ str_term, regex_term, number, setting_xref ] | |
60 | +def number(): return [ complex_lit, float_lit, int_lit ] | |
61 | +def setting_xref(): return ID | |
62 | +def complex_lit(): return _(r"[+-]?([0-9](\.[0-9]*)?)[+-][iIjJ]([0-9](\.[0-9]*)?)") | |
63 | +def float_lit(): return _(r"[+-]?[0-9]\.[0-9]+") | |
64 | +def int_lit(): return _(r"[+-]?[1-9][0-9]*") | |
65 | 65 | |
66 | 66 | |
67 | 67 | S1 = "'" |
@@ -74,4 +74,4 @@ | ||
74 | 74 | REs3 = _(r"[rR]'''") |
75 | 75 | REd3 = _(r'[rR]"""') |
76 | 76 | |
77 | -def comment(): return ["#", r'//'], _(r".*\n") | |
77 | +def comment(): return ["#", r'//'], _(r".*\n") |