3535# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3636
3737import sys
38+ import logging
3839import ply .lex as lex
3940import 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####################################################################################################
5256class 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####################################################################################################
163178class 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
311328def 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
323339if __name__ == '__main__' :
0 commit comments