diff options
author | John Snow <jsnow@redhat.com> | 2021-05-19 14:39:40 -0400 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2021-05-20 11:28:27 +0200 |
commit | 16ff40acc9c1fc871c2c835b3b20e374d6daed98 (patch) | |
tree | 92907ab34e3051ac259604621493188d2b4fd823 /scripts | |
parent | b2b31fdf9bc66a82718c9e6ede2f364b0005728a (diff) |
qapi/parser: factor parsing routine into method
For the sake of keeping __init__ smaller (and treating it more like a
gallery of what state variables we can expect to see), put the actual
parsing action into a parse method. It remains invoked from the init
method to reduce churn.
To accomplish this, @previously_included becomes the private data
member ._included, and the filename is stashed as ._fname.
Add any missing declarations to the init method, and group them by
function so they can be understood quickly at a glance.
Signed-off-by: John Snow <jsnow@redhat.com>
Message-Id: <20210519183951.3946870-5-jsnow@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/qapi/parser.py | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py index 39dbcc4eac..d620706fff 100644 --- a/scripts/qapi/parser.py +++ b/scripts/qapi/parser.py @@ -37,23 +37,39 @@ class QAPIParseError(QAPISourceError): class QAPISchemaParser: def __init__(self, fname, previously_included=None, incl_info=None): - previously_included = previously_included or set() - previously_included.add(os.path.abspath(fname)) + self._fname = fname + self._included = previously_included or set() + self._included.add(os.path.abspath(self._fname)) + self.src = '' + + # Lexer state (see `accept` for details): + self.info = QAPISourceInfo(self._fname, incl_info) + self.tok = None + self.pos = 0 + self.cursor = 0 + self.val = None + self.line_pos = 0 + + # Parser output: + self.exprs = [] + self.docs = [] + + # Showtime! + self._parse() + + def _parse(self): + cur_doc = None # May raise OSError; allow the caller to handle it. - with open(fname, 'r', encoding='utf-8') as fp: + with open(self._fname, 'r', encoding='utf-8') as fp: self.src = fp.read() - if self.src == '' or self.src[-1] != '\n': self.src += '\n' - self.cursor = 0 - self.info = QAPISourceInfo(fname, incl_info) - self.line_pos = 0 - self.exprs = [] - self.docs = [] + + # Prime the lexer: self.accept() - cur_doc = None + # Parse until done: while self.tok is not None: info = self.info if self.tok == '#': @@ -71,12 +87,12 @@ class QAPISchemaParser: if not isinstance(include, str): raise QAPISemError(info, "value of 'include' must be a string") - incl_fname = os.path.join(os.path.dirname(fname), + incl_fname = os.path.join(os.path.dirname(self._fname), include) self.exprs.append({'expr': {'include': incl_fname}, 'info': info}) exprs_include = self._include(include, info, incl_fname, - previously_included) + self._included) if exprs_include: self.exprs.extend(exprs_include.exprs) self.docs.extend(exprs_include.docs) |