Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
Revisão | c96d582a07d767ce81e597d1c5fe88d8aedd844f (tree) |
---|---|
Hora | 2021-12-11 04:40:49 |
Autor | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
Rewriten grammar.py Done. 'grammar.py' is now grammar2
@@ -0,0 +1,48 @@ | ||
1 | +from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF | |
2 | +from arpeggio import RegExMatch as _ | |
3 | +from arpeggio import ParserPython | |
4 | + | |
5 | +def peg_grammar(): return rules, EOF | |
6 | +def rules(): return OneOrMore(rule) | |
7 | +def rule(): return rule_name, '<-', expressions, ";" | |
8 | + | |
9 | +def expressions(): return ( OneOrMore(single_expr), Optional( '|' , expressions ) ) | |
10 | +def single_expr(): return ( [ rule_crossref, term, group, predicate ], Optional([ '?' , '*' , '+' , '#' ])) | |
11 | + | |
12 | +def term(): return [ str_term, regex_term ] | |
13 | +def group(): return '(', expressions, ')' | |
14 | +def predicate(): return ['&','!'], single_expr | |
15 | + | |
16 | +def str_term(): return [ (S3, str_no_s3, S3), | |
17 | + (D3, str_no_d3, D3), | |
18 | + (S1, str_no_s1, S1), | |
19 | + (D1, str_no_d1, D1) ] | |
20 | +def regex_term(): return [ (RE, re_no_slash, RE), | |
21 | + (REs3, str_no_s3, S3), | |
22 | + (REd3, str_no_d3, D3), | |
23 | + (REs1, str_no_s1, S1), | |
24 | + (REd1, str_no_d1, D1) ] | |
25 | + | |
26 | +def rule_name(): return ID | |
27 | +def rule_crossref(): return ID | |
28 | +def ID(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") | |
29 | + | |
30 | +def re_no_slash(): return _(r"((\\/)|[^\/])*") | |
31 | +def str_no_s1(): return _(r"((\\')|[^'\n])*") # Does NOT match multiline -- note 'multiline=False' is not the same | |
32 | +def str_no_d1(): return _(r'((\\")|[^"\n])*') # idem | |
33 | +def str_no_s3(): return _(r"([^']|('[^'])|(''[^']))*") # ALLOW multiline | |
34 | +def str_no_d3(): return _(r'''([^"]|("[^"])|(""[^"]))*''') # idem | |
35 | + | |
36 | +S1 = "'" | |
37 | +D1 = '"' | |
38 | +S3 = "'''" | |
39 | +D3 = '"""' | |
40 | +RE = '/' | |
41 | +REs1 = _(r"[rR]'") | |
42 | +REd1 = _(r'[rR]"') | |
43 | +REs3 = _(r"[rR]'''") | |
44 | +REd3 = _(r'[rR]"""') | |
45 | + | |
46 | +def comment(): return "//", _(".*\n") | |
47 | + | |
48 | + |
@@ -1,45 +0,0 @@ | ||
1 | -from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF | |
2 | -from arpeggio import RegExMatch as _ | |
3 | -from arpeggio import ParserPython | |
4 | - | |
5 | -def peg_grammar(): return rules, EOF | |
6 | -def rules(): return OneOrMore(rule) | |
7 | -def rule(): return rule_name, '<-', ordered_choice, ";" | |
8 | -def ordered_choice(): return sequence, ZeroOrMore('|', sequence) | |
9 | -def sequence(): return ZeroOrMore(prefix) | |
10 | -def prefix(): return Optional(['&','!']), suffix | |
11 | -def suffix(): return expression, Optional([ '?' , '*' , '+' , '#' ]) | |
12 | -def expression(): return [ regex_term, str_term, ('(', ordered_choice, ')'), rule_crossref] # OrderedChoice | |
13 | -def rule_crossref(): return rule_name | |
14 | -def rule_name(): return ID | |
15 | -def regex_term(): return [ (RE, re_no_slash, RE), # OrderedChoice | |
16 | - (REs3, str_no_s3, S3), | |
17 | - (REd3, str_no_d3, D3), | |
18 | - (REs1, str_no_s1, S1), | |
19 | - (REd1, str_no_d1, D1) ] | |
20 | -def str_term(): return [ (S3, str_no_s3, S3), # OrderedChoice | |
21 | - (D3, str_no_d3, D3), | |
22 | - (S1, str_no_s1, S1), | |
23 | - (D1, str_no_d1, D1) ] | |
24 | - | |
25 | -def ID(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") | |
26 | - | |
27 | -def re_no_slash(): return _(r"((\\/)|[^\/])*") | |
28 | - | |
29 | -def str_no_s1(): return _(r"((\\')|[^'\n])*") # Does NOT match multiline -- note 'multiline=False' is not the same | |
30 | -def str_no_d1(): return _(r'((\\")|[^"\n])*') # idem | |
31 | -def str_no_s3(): return _(r"([^']|('[^'])|(''[^']))*") # ALLOW multiline | |
32 | -def str_no_d3(): return _(r'''([^"]|("[^"])|(""[^"]))*''') # idem | |
33 | - | |
34 | -S1 = "'" | |
35 | -D1 = '"' | |
36 | -S3 = "'''" | |
37 | -D3 = '"""' | |
38 | -RE = '/' | |
39 | -REs1 = _(r"[rR]'") | |
40 | -REd1 = _(r'[rR]"') | |
41 | -REs3 = _(r"[rR]'''") | |
42 | -REd3 = _(r'[rR]"""') | |
43 | - | |
44 | -def comment(): return "//", _(".*\n") | |
45 | - |
@@ -1,48 +0,0 @@ | ||
1 | -from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF | |
2 | -from arpeggio import RegExMatch as _ | |
3 | -from arpeggio import ParserPython | |
4 | - | |
5 | -def peg_grammar(): return rules, EOF | |
6 | -def rules(): return OneOrMore(rule) | |
7 | -def rule(): return rule_name, '<-', expressions, ";" | |
8 | - | |
9 | -def expressions(): return ( OneOrMore(single_expr), Optional( '|' , expressions ) ) | |
10 | -def single_expr(): return ( [ rule_crossref, term, group, predicate ], Optional([ '?' , '*' , '+' , '#' ])) | |
11 | - | |
12 | -def term(): return [ str_term, regex_term ] | |
13 | -def group(): return '(', expressions, ')' | |
14 | -def predicate(): return ['&','!'], single_expr | |
15 | - | |
16 | -def str_term(): return [ (S3, str_no_s3, S3), | |
17 | - (D3, str_no_d3, D3), | |
18 | - (S1, str_no_s1, S1), | |
19 | - (D1, str_no_d1, D1) ] | |
20 | -def regex_term(): return [ (RE, re_no_slash, RE), | |
21 | - (REs3, str_no_s3, S3), | |
22 | - (REd3, str_no_d3, D3), | |
23 | - (REs1, str_no_s1, S1), | |
24 | - (REd1, str_no_d1, D1) ] | |
25 | - | |
26 | -def rule_name(): return ID | |
27 | -def rule_crossref(): return ID | |
28 | -def ID(): return _(r"[a-zA-Z_]([a-zA-Z_]|[0-9])*") | |
29 | - | |
30 | -def re_no_slash(): return _(r"((\\/)|[^\/])*") | |
31 | -def str_no_s1(): return _(r"((\\')|[^'\n])*") # Does NOT match multiline -- note 'multiline=False' is not the same | |
32 | -def str_no_d1(): return _(r'((\\")|[^"\n])*') # idem | |
33 | -def str_no_s3(): return _(r"([^']|('[^'])|(''[^']))*") # ALLOW multiline | |
34 | -def str_no_d3(): return _(r'''([^"]|("[^"])|(""[^"]))*''') # idem | |
35 | - | |
36 | -S1 = "'" | |
37 | -D1 = '"' | |
38 | -S3 = "'''" | |
39 | -D3 = '"""' | |
40 | -RE = '/' | |
41 | -REs1 = _(r"[rR]'") | |
42 | -REd1 = _(r'[rR]"') | |
43 | -REs3 = _(r"[rR]'''") | |
44 | -REd3 = _(r'[rR]"""') | |
45 | - | |
46 | -def comment(): return "//", _(".*\n") | |
47 | - | |
48 | - |