File indexing completed on 2024-03-24 16:05:55

0001 #!/usr/bin/env python3
0002 # -*- coding: utf-8 -*-
0003 
0004 #
0005 # SPDX-FileCopyrightText: 2010 Sven Brauch <svenbrauch@googlemail.com>
0006 # Licensed under the GNU GPL
0007 #
0008 
0009 # This script once was used for parsing documents; that implementation is long gone.
0010 # It's just kept for looking at the AST created by some code quickly; you can do this:
0011 # echo 'foo = baz.bar(3, "str")' |./pythonpythonparser.py
0012 # or similar to quickly see the AST for that code.
0013 
0014 import ast
0015 from xml.dom.minidom import Document
0016 from lxml import etree
0017 import types
0018 import sys
0019 import re
0020 
0021 class KDevelopNodeVisitor(ast.NodeVisitor):
0022     basenode = etree.Element("pythonast")
0023     currentnode = None
0024     nodecnt = 0
0025     childNodeMap = {}
0026     
0027     def __init__(self, *arg, **args):
0028         super(KDevelopNodeVisitor, self).__init__(*arg, **args)
0029         self.currentnode = self.basenode
0030     
0031     def generic_visit(self, node):
0032         self.nodecnt += 1
0033         
0034         #self.childNodeMap[self.nodecnt] = node
0035         self.childNodeMap[node] = self.nodecnt
0036         
0037         node_xmlrepr = etree.Element(node.__class__.__name__ + "Ast")
0038         node_xmlrepr.set('nodecnt', str(self.nodecnt))
0039         self.currentnode.append(node_xmlrepr)
0040         
0041         save_currentnode = self.currentnode
0042         self.currentnode = node_xmlrepr
0043         
0044         fields = list(node._attributes)
0045         fields.extend(list(node._fields))
0046         
0047         searching_locally = []
0048         for field in fields:
0049             value = getattr(node, field)
0050             if type(value) not in [type(0), type(""), type(0.0), type(False)]:
0051                 continue
0052             try:
0053                 node_xmlrepr.set(field.lower(), str(value))
0054             except:
0055                 sys.stderr.write("Warning: Invalid string literal replaced by empty string!\n")
0056                 node_xmlrepr.set(field.lower(), "")
0057 
0058 
0059         super(KDevelopNodeVisitor, self).generic_visit(node)
0060         
0061         key = ''
0062         for field in fields:
0063             multiple_keys = []
0064             value = getattr(node, field)
0065             if type(value) not in [type(0), type(""), type(0.0), type(False)]:
0066                 if type(value) == type([]):
0067                     for currentValue in value:
0068                         try:
0069                             multiple_keys.append(str(self.childNodeMap[currentValue]))
0070                         except KeyError:
0071                             sys.stderr.write("Warning: missing key on node " + str(node) + "\n")
0072                             multiple_keys.append('')
0073                     key = ','.join(multiple_keys)
0074                     node_xmlrepr.set("NRLST_" + field.lower(), str(key))
0075                 else:
0076                     try:
0077                         key = self.childNodeMap[value]
0078                     except KeyError:
0079                         key = ''
0080                     node_xmlrepr.set("NR_" + field.lower(), str(key))
0081                 
0082                 
0083         self.currentnode = save_currentnode
0084 
0085 f = sys.stdin.read()
0086 v = KDevelopNodeVisitor()
0087 try:
0088     parsetree = ast.parse(f)
0089 except Exception as e:
0090     try:
0091         sys.stderr.write(str(e.lineno) + ':::' + str(e.offset))
0092         sys.stderr.write(":::" + str(type(e)).replace('<type \'exceptions.', '').replace('\'>', '') + ':::' + str(e.msg) + ": \"" + str(e.text).replace("\n", "") + "\"")
0093     except:
0094         sys.stderr.write('?:::?:::'+str(e)+':::?')
0095 else:
0096     v.visit(parsetree)
0097     print(str(etree.tostring(v.basenode, xml_declaration=True, pretty_print=True, encoding='UTF-8')).replace('\\n', '\n'))