From: John Snow Date: Wed, 19 May 2021 18:39:40 +0000 (-0400) Subject: qapi/parser: factor parsing routine into method X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=16ff40acc9c1fc871c2c835b3b20e374d6daed98;p=qmiga%2Fqemu.git 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 Message-Id: <20210519183951.3946870-5-jsnow@redhat.com> Reviewed-by: Markus Armbruster Signed-off-by: Markus Armbruster --- 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)