Castle: The best Real-Time/Embedded/HighTech language EVER. Attempt 2
Revision | 984d76e4ac51198c89b933b705010167df0dc922 (tree) |
---|---|
Zeit | 2022-04-23 02:56:41 |
Autor | Albert Mietus < albert AT mietus DOT nl > |
Commiter | Albert Mietus < albert AT mietus DOT nl > |
Cleanup
@@ -48,9 +48,9 @@ | ||
48 | 48 | PYREVERSE_DIR=pyreversed |
49 | 49 | PYREVERSE_FORMAT=svg |
50 | 50 | PYREVERSE_OPTIONS=-kAmy |
51 | -PYREVERSE_PRJS= castle.readers castle.ast castle.writers castle | |
51 | +PYREVERSE_PRJS= castle castle.readers castle.ast #castle.writers | |
52 | 52 | |
53 | -pyanalyse: ${PYREVERSE_DIR} | |
53 | +pyanalyse pyreverse: ${PYREVERSE_DIR} | |
54 | 54 | for P in ${PYREVERSE_PRJS}; do \ |
55 | 55 | echo "PYANALYSE::" $$P "...";\ |
56 | 56 | pyreverse -d ${PYREVERSE_DIR} -o ${PYREVERSE_FORMAT} ${PYREVERSE_OPTIONS} -p $$P --colorized --max-color-depth=42 -my $$P ;\ |
@@ -16,38 +16,44 @@ | ||
16 | 16 | |
17 | 17 | |
18 | 18 | class PEGReader(BaseReader): |
19 | - """File-Reader to read & parse files, using a PEG parser. | |
19 | + """File-Reader to read input-files and parse them using a PEG-parser. | |
20 | 20 | |
21 | - When creating a :py:class:`PEGReader` a default value for the `language_def` & `comment_def` can be set (and/or can | |
22 | - be set when reading a file -- see py:func`parse`). This language_def & comment_def should defined using *Arpeggio*. | |
21 | + The ("programming") language --in which the input-files are written-- is defined once, by language- and (optionally) | |
22 | + comment-definitions (using a PEG). Also a ``visitor`` (a class) has to be specified; which translate the parse-tree | |
23 | + into an AST. Then no ``comment_def`` is given, it is assumed either no comments are expected, or the | |
24 | + ``language_def`` will handle it. | |
25 | + | |
26 | + After the language is defined, multiple (unrelated) files can be read/parsed -- each one is translated into an AST. | |
27 | + | |
28 | + Note: the language/comment-definitions and visitor-class should defined using *Arpeggio*. | |
23 | 29 | |
24 | 30 | Also, a :py:class:`visitor` (class) should be specified. (this can only be done once). |
31 | + When creating a class the search-path `read_dirs` (to look for file-to-be-parsed) can be set. | |
25 | 32 | |
26 | - When creating a class the search-path `read_dirs` (to look for file-to-be-parsed) can be set. | |
27 | 33 | """ |
28 | 34 | |
29 | - def __init__(self, *, read_dirs: list[str]=[], | |
30 | - language_def=None, comment_def=None, visitor:Callable=None, | |
35 | + def __init__(self, *, language_def=None, comment_def=None, visitor:Callable=None, | |
36 | + read_dirs: list[str]=[], | |
31 | 37 | **kwargs): |
32 | 38 | super().__init__(read_dirs=read_dirs, **kwargs) |
39 | + if language_def is None: | |
40 | + raise ValueError("The `language_def` is a mandatory parameter") | |
33 | 41 | if visitor is None: |
34 | 42 | raise ValueError("visitor is a mandatory parameter") |
43 | + self._language_def = language_def | |
44 | + self._comment_def = comment_def # Can be None | |
35 | 45 | self._visitor = visitor |
36 | - self.default_language_def = language_def | |
37 | - self.default_comment_def = comment_def | |
38 | 46 | |
39 | 47 | |
40 | 48 | def parse(self, filename:str, *, language_def=None, comment_def=None): |
41 | 49 | """Read & Parse a file""" |
42 | - if not language_def: language_def = self.default_language_def | |
43 | - if not comment_def: comment_def = self.default_comment_def | |
44 | 50 | txt = self._read(filename) |
45 | - ast = self._do_parse(txt, language_def, comment_def) | |
51 | + ast = self._do_parse(txt) | |
46 | 52 | return ast |
47 | 53 | |
48 | 54 | |
49 | - def _do_parse(self, txt, language_def, comment_def): | |
50 | - parser = arpeggio.ParserPython(language_def=language_def, comment_def=comment_def) | |
55 | + def _do_parse(self, txt): | |
56 | + parser = arpeggio.ParserPython(language_def=self._language_def, comment_def=self._comment_def) | |
51 | 57 | |
52 | 58 | pt = parser.parse(txt) |
53 | 59 | logger.info(f"Reader:_do_parse::\t parse_tree: start={pt.position} end={pt.position_end}; len(txt)={len(txt)}") |
@@ -6,12 +6,12 @@ | ||
6 | 6 | |
7 | 7 | |
8 | 8 | def test_file(): |
9 | - reader = PEGReader(read_dirs=('../../../demos/ThinOnion', | |
9 | + reader = PEGReader(language_def=grammar.peg_grammar, | |
10 | + comment_def=grammar.comment, | |
11 | + visitor=visitor.PegVisitor(), | |
12 | + read_dirs=('../../../demos/ThinOnion', | |
10 | 13 | '../../.././demos/ThinOnion/grammar', |
11 | - '../../.././pytst/readers/parser'), | |
12 | - language_def=grammar.peg_grammar, | |
13 | - comment_def=grammar.comment, | |
14 | - visitor=visitor.PegVisitor()) | |
14 | + '../../.././pytst/readers/parser')) | |
15 | 15 | ast = reader.parse('grammar.peg') |
16 | 16 | # Remember: ast is a Grammar!! |
17 | 17 |
@@ -1,16 +0,0 @@ | ||
1 | -import pytest | |
2 | - | |
3 | -from jinja2 import Template | |
4 | - | |
5 | -from castle.ast import grammar # To build the ATS | |
6 | - | |
7 | - | |
8 | - | |
9 | -def __test_simple_rule(): | |
10 | - expected = """def rule_crossref():\treturn ID""" | |
11 | - castle = """rule_crossref <- ID ;""" | |
12 | - | |
13 | - ## Build the AST -- Ignoring the parse_tree | |
14 | - id_rn = grammar.ID(name="rule_crossref") | |
15 | - id_xr = grammar.ID(name="ID") | |
16 | - |