Added support for list of string or integer. frederic@jolliton.com--2005-private,confparser--main--0.1
authorFrederic Jolliton <frederic@jolliton.com>
Sun, 23 Oct 2005 21:53:43 +0000 (21:53 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Sun, 23 Oct 2005 21:53:43 +0000 (21:53 +0000)
git-archimport-id: frederic@jolliton.com--2005-private/confparser--main--0.1--patch-20

confparser.py
test_confparser.py

index 0edd9d1..0034960 100644 (file)
@@ -56,6 +56,21 @@ def parseString( s ) :
 
 def parseConf( p , meta = None ) :
 
+       def parseList() :
+
+               items = []
+               while 1 :
+                       t = p.next( 'string' , 'integer' , ']' )
+                       if t[ 0 ] == ']' :
+                               break
+                       elif t[ 0 ] == 'integer' :
+                               items.append( int( t[ 1 ] ) )
+                       elif t[ 0 ] == 'string' :
+                               items.append( parseString( t[ 1 ] ) )
+                       else :
+                               raise NotReached
+               return items
+
        def parseNode() :
 
                x , y = p.x , p.y
@@ -69,13 +84,17 @@ def parseConf( p , meta = None ) :
                #
                values = []
                while 1 :
-                       t = p.next( 'string' , 'integer' , '{' , ';' )
+                       t = p.next( 'string' , 'integer' , '[' , '{' , ';' )
                        if t[ 0 ] in [ '{' , ';' ] :
                                break
-                       if t[ 0 ] == 'integer' :
+                       elif t[ 0 ] == '[' :
+                               values.append( parseList() )
+                       elif t[ 0 ] == 'integer' :
                                values.append( int( t[ 1 ] ) )
-                       else :
+                       elif t[ 0 ] == 'string' :
                                values.append( parseString( t[ 1 ] ) )
+                       else :
+                               raise NotReached
                #
                # Contents
                #
@@ -102,15 +121,17 @@ def parse( doc , filename = None ) :
 
        kw = r'[_a-zA-Z](?:[-_a-zA-Z0-9]*[_a-zA-Z0-9])?'
        tokenMatches = {
-               'eot'     : '$' ,
-               'blank'   : r'\s+' ,
-               'integer' : r'[0-9]+' ,
-               'keyword' : kw ,
-               'string'  : kw + r"|'(?:[^\\']|\\.)*'" ,
-               'comment' : r'#[^\n]*(?:\n|$)' ,
-               '{'       : '{' ,
-               '}'       : '}' ,
-               ';'       : ';'
+                 'eot'     : '$'
+               , 'blank'   : r'\s+'
+               , 'integer' : r'[0-9]+'
+               , 'keyword' : kw
+               , 'string'  : kw + r"|'(?:[^\\']|\\.)*'"
+               , 'comment' : r'#[^\n]*(?:\n|$)'
+               , '{'       : '{'
+               , '}'       : '}'
+               , '['       : r'\['
+               , ']'       : r'\]'
+               , ';'       : ';'
        }
        p = basicparser.Parser( tokenMatches , doc )
        p.ignore( 'blank' , 'comment' )
index ae9f95a..a15497a 100644 (file)
@@ -48,7 +48,9 @@ def serialize( conf ) :
 
 def parseAndSerialize( text ) :
 
-       return serialize( confparser.parse( text ) )
+       parsedForm = confparser.parse( text )
+       #print text , '->' , parsedForm
+       return serialize( parsedForm )
 
 class ConfParserTestCase( unittest.TestCase ) :
 
@@ -66,6 +68,7 @@ class ConfParserTestCase( unittest.TestCase ) :
                        , ( 'foo-bar-baz;' , 'foo-bar-baz;' )
                        , ( '_-_;' , '_-_;' ) # Ahem..
                        , ( "foo 'bar';" , "foo:'bar';" )
+                       , ( 'foo [a b c];' , "foo:['a', 'b', 'c'];" )
                ]
                for text , resultSerialized in tests :
                        self.assertEquals( parseAndSerialize( text ) , resultSerialized )