Skip to content

Commit 4e90ff6

Browse files
committed
add logging to module, and mapping of lexer attributes lineno and lexpos to improve error messages
1 parent e18b6d5 commit 4e90ff6

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

src/exp2python/python/SCL/Part21.py

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,13 @@
3535
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3636

3737
import sys
38+
import logging
3839
import ply.lex as lex
3940
import ply.yacc as yacc
4041

42+
logger = logging.getLogger(__name__)
43+
logger.addHandler(logging.NullHandler())
44+
4145
####################################################################################################
4246
# Common Code for Lexer / Parser
4347
####################################################################################################
@@ -51,9 +55,18 @@ class Base:
5155
####################################################################################################
5256
class Lexer(Base):
5357
def __init__(self, debug=0, optimize=0):
54-
self.lexer = lex.lex(module=self, debug=debug, optimize=optimize)
58+
self.lexer = lex.lex(module=self, debug=debug, debuglog=logger, optimize=optimize,
59+
errorlog=logger)
5560
self.entity_keywords = []
5661

62+
def __getattr__(self, name):
63+
if name == 'lineno':
64+
return self.lexer.lineno
65+
elif name == 'lexpos':
66+
return self.lexer.lexpos
67+
else:
68+
raise AttributeError
69+
5770
def input(self, s):
5871
self.lexer.input(s)
5972

@@ -117,6 +130,8 @@ def t_newline(self, t):
117130
# TODO: is it okay to ignore \n?
118131
t_ignore = ' \t'
119132

133+
134+
120135
####################################################################################################
121136
# Simple Model
122137
####################################################################################################
@@ -161,16 +176,21 @@ def __init__(self, type_name, *params):
161176
# Parser
162177
####################################################################################################
163178
class Parser(Base):
164-
def __init__(self, lexer=None):
179+
def __init__(self, lexer=None, debug=0):
180+
self.parser = yacc.yacc(module=self, debug=debug, debuglog=logger, errorlog=logger)
181+
165182
if lexer is None:
166183
lexer = Lexer()
167184
self.lexer = lexer
168-
self.parser = yacc.yacc(module=self)
169185

170186
def parse(self, p21_data, **kwargs):
171187
self.lexer.input(p21_data)
172188
self.refs = {}
173-
result = self.parser.parse(lexer=self.lexer, **kwargs)
189+
if 'debug' in kwargs:
190+
result = self.parser.parse(lexer=self.lexer, debug=logger,
191+
**{ k: kwargs[k] for k in kwargs if k != 'debug'})
192+
else:
193+
result = self.parser.parse(lexer=self.lexer, **kwargs)
174194
return result
175195

176196
def p_exchange_file(self, p):
@@ -194,8 +214,8 @@ def p_header_entity(self, p):
194214
def p_check_entity_instance_name(self, p):
195215
"""check_entity_instance_name : ENTITY_INSTANCE_NAME"""
196216
if p[1] in self.refs:
197-
print('ERROR: Line {0}, duplicate entity instance name: {1}'.format(p.lineno(1), p[1]), file=sys.stderr)
198-
raise SyntaxError
217+
logger.error('Line %i, duplicate entity instance name: %s', p.lineno(1), p[1])
218+
sys.exit('Aborting...')
199219
else:
200220
self.refs[p[1]] = None
201221
p[0] = p[1]
@@ -304,20 +324,16 @@ def p_empty(self, p):
304324
"""empty :"""
305325
pass
306326

307-
def p_error(self, p):
308-
raise SyntaxError
309-
310327

311328
def test():
312-
import logging
313-
logger = logging.getLogger()
314-
logger.setLevel(logging.DEBUG)
329+
logging.basicConfig()
330+
logger.setLevel(logging.ERROR)
315331

316332
s = open('io1-tu-203.stp', 'r').read()
317-
parser = Parser()
333+
parser = Parser(debug=1)
318334

319-
#r = parser.parse(s, debug=logger)
320-
r = parser.parse(s)
335+
r = parser.parse(s, debug=1)
336+
#r = parser.parse(s)
321337
return r
322338

323339
if __name__ == '__main__':

0 commit comments

Comments
 (0)