1# Copyright (c) 2006-2011 Nathan Binkert <nate@binkert.org> 2# All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are 6# met: redistributions of source code must retain the above copyright 7# notice, this list of conditions and the following disclaimer; 8# redistributions in binary form must reproduce the above copyright --- 11 unchanged lines hidden (view full) --- 20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 27import os |
28from six import string_types |
29 30import ply.lex 31import ply.yacc 32 33class ParseError(Exception): 34 def __init__(self, message, token=None): 35 Exception.__init__(self, message) 36 self.token = token --- 52 unchanged lines hidden (view full) --- 89 if not self.lexers: 90 return -1 91 return self.current_lexer.lineno 92 93 raise AttributeError( 94 "'%s' object has no attribute '%s'" % (type(self), attr)) 95 96 def parse_string(self, data, source='<string>', debug=None, tracking=0): |
97 if not isinstance(data, string_types): |
98 raise AttributeError( 99 "argument must be a string, was '%s'" % type(f)) 100 101 import new 102 lexer = self.lex.clone() 103 lexer.input(data) 104 self.lexers.append((lexer, source)) 105 dict = { 106 'productions' : self.yacc.productions, 107 'action' : self.yacc.action, 108 'goto' : self.yacc.goto, 109 'errorfunc' : self.yacc.errorfunc, 110 } 111 parser = new.instance(ply.yacc.LRParser, dict) 112 result = parser.parse(lexer=lexer, debug=debug, tracking=tracking) 113 self.lexers.pop() 114 return result 115 116 def parse_file(self, f, **kwargs): |
117 if isinstance(f, string_types): |
118 source = f 119 f = open(f, 'r') 120 elif isinstance(f, file): 121 source = f.name 122 else: 123 raise AttributeError( 124 "argument must be either a string or file, was '%s'" % type(f)) 125 --- 14 unchanged lines hidden --- |