diff options
Diffstat (limited to 'ast2json/ast2json.py')
-rw-r--r-- | ast2json/ast2json.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/ast2json/ast2json.py b/ast2json/ast2json.py new file mode 100644 index 0000000..7f52687 --- /dev/null +++ b/ast2json/ast2json.py @@ -0,0 +1,62 @@ +# Copyright (c) 2013, Laurent Peuch <cortex@worlddomination.be> +# +# All rights reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the University of California, Berkeley nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from _ast import AST +from ast import parse + + +def ast2json(node): + assert isinstance(node, AST) + to_return = {} + to_return['_type'] = node.__class__.__name__ + for attr in dir(node): + if attr.startswith("_"): + continue + to_return[attr] = get_value(getattr(node, attr)) + + return to_return + + +def str2json(string): + return ast2json(parse(string)) + + +def get_value(attr_value): + if attr_value is None: + return attr_value + if isinstance(attr_value, (int, str, float, complex, bool)): + return attr_value + if isinstance(attr_value, list): + return [get_value(x) for x in attr_value] + if isinstance(attr_value, AST): + return ast2json(attr_value) + else: + raise Exception("unknow case for '%s' of type '%s'" % (attr_value, type(attr_value))) + + +if __name__ == '__main__': + import json + print(json.dumps(ast2json(parse(open(__file__, "r").read())), indent=4)) |