File: XPathParserBase.py

package info (click to toggle)
python-xml 0.8.4-10.1%2Blenny1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 4,972 kB
  • ctags: 10,628
  • sloc: python: 46,730; ansic: 14,354; xml: 968; makefile: 201; sh: 20
file content (93 lines) | stat: -rw-r--r-- 2,924 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
try:
    import os, gettext
    locale_dir = os.path.split(__file__)[0]
    gettext.install('4Suite', locale_dir)
except (ImportError,AttributeError,IOError):
    def _(msg):
        return msg

SYNTAX_ERR_MSG = _("Error parsing expression:\n'%s'\nSyntax error at or near '%s' Line: %d")
INTERNAL_ERR_MSG = _("Error parsing expression:\n'%s'\nInternal error in processing at or near '%s', Line: %d, Exception: %s")

class SyntaxException(Exception):
    def __init__(self, source, lineNum, location):
        Exception.__init__(self, SYNTAX_ERR_MSG%(source, location, lineNum))
        self.source = source
        self.lineNum = lineNum
        self.loc = location

class InternalException(Exception):
    def __init__(self, source, lineNum, location, exc, val, tb):
        Exception.__init__(self, INTERNAL_ERR_MSG%(source, location, lineNum, exc))
        self.source = source
        self.lineNum = lineNum
        self.loc = location
        self.errorType = exc
        self.errorValue = val
        self.errorTraceback = tb

class XPathParserBase:
    def __init__(self):
        self.initialize()

    def initialize(self):
        self.results = None
        self.__stack = []
        XPath.cvar.g_errorOccured = 0

    def parse(self,st):
        g_parseLock.acquire()
        try:
            self.initialize()
            XPath.my_XPathparse(self,st)
            if XPath.cvar.g_errorOccured == 1:
                raise SyntaxException(
                    st,
                    XPath.cvar.lineNum,
                    XPath.cvar.g_errorLocation)
            if XPath.cvar.g_errorOccured == 2:
                raise InternalException(
                    st,
                    XPath.cvar.lineNum,
                    XPath.cvar.g_errorLocation,
                    XPath.cvar.g_errorType,
                    XPath.cvar.g_errorValue,
                    XPath.cvar.g_errorTraceback)
            return self.__stack
        finally:
            g_parseLock.release()

    def pop(self):
        if len(self.__stack):
            rt = self.__stack[-1]
            del self.__stack[-1]
            return rt
        self.raiseException("Pop with 0 stack length")

    def push(self,item):
        self.__stack.append(item)

    def empty(self):
        return len(self.__stack) == 0

    def size(self):
        return len(self.__stack)

    def raiseException(self, message):
        raise Exception(message)

    ### Callback methods ###

def PrintSyntaxException(e):
    print "********** Syntax Exception **********"
    print "Exception at or near '%s'" % e.loc
    print "  Line: %d" % (e.lineNum)

def PrintInternalException(e):
    print "********** Internal Exception **********"
    print "Exception at or near '%s'" % e.loc
    print "  Line: %d" % (e.lineNum)
    print "    Exception: %s" % e.errorType
    print "Original traceback:"
    import traceback
    traceback.print_tb(e.errorTraceback)