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
#
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
#
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' )
def parseAndSerialize( text ) :
- return serialize( confparser.parse( text ) )
+ parsedForm = confparser.parse( text )
+ #print text , '->' , parsedForm
+ return serialize( parsedForm )
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 )