s-expression parser in python

J

James Stroud

Hello All,

I want to use an s-expression based configuration file format for a
python program I'm writing. Does anyone have a favorite parser?

I'm currently using sexpy.parse() (http://pypi.python.org/pypi/sexpy)
which works very well but I don't know how secure it is. Does anyone
have experience with sexpy or another parser? I'm mostly concerned with
safety when the parser evaluates scalar data types. Sexpy is not well
documented in this regard.

Also, I don't want a lisp/scheme interpreter, just the parser.

For example,

"""
(and
(or (> uid 1000)
(!= gid 20)
)
(> quota 5.0e+03)
)
"""

Should be parsed to

["and",
["or", ["=", "uid", 1405],
["!=", "gid", 20]],
[">", "quota", 5000.0]
]

Note proper parsing of ints, floats, etc.

I've already wrote the evaluator for the parsed lists, so I'm not
interested in alternatives to S-expressions. Also, I'm really not
interested in json, yaml, etc., for the configuration format because I'm
quite fond of the brevity and clarity of S-expressions (your opinion may
vary).

Thanks in advance for any insight.

James
 
P

Patrick Maupin

On Apr 6, 7:02 pm, James Stroud <[email protected]>
wrote:

I have a parser/emitter I wrote about 4 years ago for EDIF. Take a
look at the wikipedia article http://en.wikipedia.org/wiki/EDIF

If that is close to you want, I can send it to you. The whole parser/
emitter/XML round-tripper etc. is only 500 lines, which includes a
bunch of comments. Tiny.

I've never made a project out of it, but it worked fine for me and a
friend. (I have a testbench, but unfortunately the test data is
proprietary.)

But, I have to take this opportunity to put in a plug for a file
format I created for configuration files. It's secure (no eval
statements), it's much lighter weight than YAML, and it looks better
too:

http://code.google.com/p/rson/wiki/Manual

Please let me know if you'd like the edif code.

Best regards,
Pat
 
P

Paul McGuire

Hello All,

I want to use an s-expression based configuration file format for a
python program I'm writing. Does anyone have a favorite parser?

The pyparsing wiki includes this parser on its Examples page:
http://pyparsing.wikispaces.com/file/view/sexpParser.py. This parser
is also described in more detail in the pyparsing e-book from
O'Reilly.

This parser is based on the BNF defined here:http://
people.csail.mit.edu/rivest/Sexp.txt. I should think Ron Rivest would
be the final authority on S-expression syntax, but this BNF omits '!',
'<', and '>' as valid punctuation characters, and does not support
free-standing floats and ints as tokens.

Still, you can extend the pyparsing parser (such is the goal of
pyparsing, to make these kinds of extensions easy, as the source
material or BNF or requirements change out from underneath you) by
inserting these changes:

real = Regex(r"[+-]?\d+\.\d*([eE][+-]?\d+)?").setParseAction(lambda
tokens: float(tokens[0]))
token = Word(alphanums + "-./_:*+=!<>")
simpleString = real | decimal | raw | token | base64_ | hexadecimal |
qString

And voila! Your test string parses as:

[['and',
['or', ['>', 'uid', 1000], ['!=', 'gid', 20]],
['>', 'quota', 5000.0]]]

-- Paul
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,816
Latest member
SapanaCarpetStudio

Latest Threads

Top