File indexing completed on 2024-04-28 04:35:49
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'))