From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1VlPCM-00023U-Bb for mharc-grub-devel@gnu.org; Tue, 26 Nov 2013 15:25:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46532) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VlPCJ-00023N-Ol for grub-devel@gnu.org; Tue, 26 Nov 2013 15:25:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VlPCI-0001bE-Br for grub-devel@gnu.org; Tue, 26 Nov 2013 15:25:27 -0500 Received: from v6.chiark.greenend.org.uk ([2001:ba8:1e3::]:60990 helo=chiark.greenend.org.uk) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VlPCI-0001b9-31 for grub-devel@gnu.org; Tue, 26 Nov 2013 15:25:26 -0500 Received: from [172.20.153.9] (helo=riva.pelham.vpn.ucam.org) by chiark.greenend.org.uk (Debian Exim 4.72 #1) with esmtps (return-path cjwatson@ubuntu.com) id 1VlPCH-000805-Iw for grub-devel@gnu.org; Tue, 26 Nov 2013 20:25:25 +0000 Received: from ns1.pelham.vpn.ucam.org ([172.20.153.2] helo=riva.ucam.org) by riva.pelham.vpn.ucam.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1VlPCG-00017W-Px for grub-devel@gnu.org; Tue, 26 Nov 2013 20:25:24 +0000 Date: Tue, 26 Nov 2013 20:25:23 +0000 From: Colin Watson To: grub-devel@gnu.org Subject: [PATCH 2/3] Show file name in error messages from AutogenParser. Message-ID: <20131126202523.GC1228@riva.ucam.org> References: <20131126202446.GA1228@riva.ucam.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20131126202446.GA1228@riva.ucam.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2001:ba8:1e3:: X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Nov 2013 20:25:29 -0000 --- gentpl.py | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/gentpl.py b/gentpl.py index f0f4493..5bee43a 100644 --- a/gentpl.py +++ b/gentpl.py @@ -119,14 +119,15 @@ class AutogenState: need_idx, need_rbracket, indx_name, have_value, done) = range(12) class AutogenParseError(Exception): - def __init__(self, message, line): + def __init__(self, message, path, line): super(AutogenParseError, self).__init__(message) + self.path = path self.line = line def __str__(self): return ( super(AutogenParseError, self).__str__() + - " at line %d" % self.line) + " at file %s line %d" % (self.path, self.line)) class AutogenDefinition(list): def __getitem__(self, key): @@ -161,6 +162,7 @@ class AutogenParser: self.def_stack = [("", self.definitions)] self.curdef = None self.new_name = None + self.cur_path = None self.cur_line = 0 @staticmethod @@ -172,6 +174,9 @@ class AutogenParser: def is_value_name_char(c): return c in ":^-_" or c.isalnum() + def error(self, message): + raise AutogenParseError(message, self.cur_file, self.cur_line) + def read_tokens(self, f): data = f.read() end = len(data) @@ -210,15 +215,13 @@ class AutogenParser: while True: offset += 1 if offset >= end: - raise AutogenParseError( - "EOF in quoted string", self.cur_line) + self.error("EOF in quoted string") if data[offset] == "\n": self.cur_line += 1 if data[offset] == "\\": offset += 1 if offset >= end: - raise AutogenParseError( - "EOF in quoted string", self.cur_line) + self.error("EOF in quoted string") if data[offset] == "\n": self.cur_line += 1 # Proper escaping unimplemented; this can be filled @@ -260,21 +263,19 @@ class AutogenParser: yield AutogenToken.var_name, s offset = end_name else: - raise AutogenParseError( - "Invalid input character '%s'" % c, self.cur_line) + self.error("Invalid input character '%s'" % c) yield AutogenToken.eof, None def do_need_name_end(self, token): if len(self.def_stack) > 1: - raise AutogenParseError( - "Definition blocks were left open", self.cur_line) + self.error("Definition blocks were left open") def do_need_name_var_name(self, token): self.new_name = token def do_end_block(self, token): if len(self.def_stack) <= 1: - raise AutogenParseError("Too many close braces", self.cur_line) + self.error("Too many close braces") new_name, parent_def = self.def_stack.pop() parent_def.append((new_name, self.curdef)) self.curdef = parent_def @@ -292,7 +293,7 @@ class AutogenParser: def do_indexed_name(self, token): self.new_name = token - def read_definitions(self, f): + def read_definitions_file(self, f): self.curdef = self.definitions self.cur_line = 0 state = AutogenState.init @@ -367,12 +368,17 @@ class AutogenParser: if handler is not None: handler(token) else: - raise AutogenParseError( + self.error( "Parse error in state %s: unexpected token '%s'" % ( - state, token), self.cur_line) + state, token)) if state == AutogenState.done: break + def read_definitions(self, path): + self.cur_file = path + with open(path) as f: + self.read_definitions_file(f) + defparser = AutogenParser() # @@ -791,8 +797,7 @@ parser = OptionParser(usage="%prog DEFINITION-FILES") _, args = parser.parse_args() for arg in args: - with open(arg) as f: - defparser.read_definitions(f) + defparser.read_definitions(arg) rules("module", module) rules("kernel", kernel) -- 1.8.4.3