Fixed token best match selection. Added clone method to Parser. Better error reporting.
authorFrederic Jolliton <frederic@jolliton.com>
Sat, 6 Aug 2005 19:26:30 +0000 (19:26 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Sat, 6 Aug 2005 19:26:30 +0000 (19:26 +0000)
* Fixed token selection to really return the longest one.

* Added clone method to Parser class, allowing to save state of the
  parser.

* Better error reporting when using .next() without arguments (when
  any tokens is implictly allowed, and no match is found.)
git-archimport-id: frederic@jolliton.com--2005-private/confparser--main--0.1--patch-19

basicparser.py

index b9350da..5a9dec2 100644 (file)
@@ -25,7 +25,7 @@ import re
 
 class ParserError( Exception ) : pass
 
-class Parser :
+class Parser( object ) :
 
        def __init__( self , tokens , text , defaultRegexFlags = 0 ) :
 
@@ -46,6 +46,18 @@ class Parser :
                self.__x = 1
                self.__y = 1
 
+       def clone( self ) :
+
+               newInstance = self.__new__( self.__class__)
+               newInstance.__tokenMatches = self.__tokenMatches
+               newInstance.__keys = self.__keys
+               newInstance.__text = self.__text
+               newInstance.__pos = self.__pos
+               newInstance.__tokensToIgnore = self.__tokensToIgnore
+               newInstance.__x = self.__x
+               newInstance.__y = self.__y
+               return newInstance
+
        def __getX( self ) : return self.__x
        def __getY( self ) : return self.__y
 
@@ -73,9 +85,8 @@ class Parser :
                        if tokenMatch :
                                m = tokenMatch.match( self.__text , self.__pos )
                                if m :
-                                       tk = m.group( 0 )
-                                       tokens.append( ( tokenName , tk ) )
-               tokens.sort( lambda a , b : cmp( len( a[ 1 ] ) , len( b[ 1 ] ) ) )
+                                       tokens.append( ( tokenName , m.group( 0 ) ) + m.groups() )
+               tokens.sort( lambda a , b : cmp( len( b[ 1 ] ) , len( a[ 1 ] ) ) )
                return tokens
 
        def __advance( self , n ) :
@@ -100,7 +111,8 @@ class Parser :
                (or only from one of set 'set' if specified.) If no tokens
                match, None is returned.'''
 
-               set += self.__tokensToIgnore
+               if set :
+                       set += self.__tokensToIgnore
                r = None
                while 1 :
                        r = self.peek( *set )
@@ -126,7 +138,7 @@ class Parser :
                        else :
                                misc = ''
                        raise ParserError( '%s, %sexpected one of the following tokens: %r'
-                               % ( self.getPos() , misc , list( set ) ) )
+                               % ( self.getPos() , misc , list( set or self.__keys ) ) )
                return r
 
        def getPos( self ) :