1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
import json
def attr2json(attr):
if isinstance(attr, Node):
return attr.toJSON()
elif isinstance(attr, list):
return [attr2json(i) for i in attr]
else:
return attr
class Node(object):
def __init__(self):
self.type = self.__class__.__name__
def toJSON(self):
fields = {}
for key in vars(self):
attr = getattr(self, key)
fields[key] = attr2json(attr)
return fields
def __str__(self):
return json.dumps(self.toJSON())
def setPosition(self, start, end):
self._pos = {
"start": start,
"end": end
}
class Resource(Node):
def __init__(self, body=None, comment=None):
super(Resource, self).__init__()
self.body = body or []
self.comment = comment
class Entry(Node):
def __init__(self):
super(Entry, self).__init__()
class Identifier(Node):
def __init__(self, name):
super(Identifier, self).__init__()
self.name = name
class Section(Node):
def __init__(self, key, body=None, comment=None):
super(Section, self).__init__()
self.key = key
self.body = body or []
self.comment = comment
class Pattern(Node):
def __init__(self, source, elements):
super(Pattern, self).__init__()
self.source = source
self.elements = elements
class Member(Node):
def __init__(self, key, value, default=False):
super(Member, self).__init__()
self.key = key
self.value = value
self.default = default
class Entity(Entry):
def __init__(self, id, value=None, traits=None, comment=None):
super(Entity, self).__init__()
self.id = id
self.value = value
self.traits = traits or []
self.comment = comment
class Placeable(Node):
def __init__(self, expressions):
super(Placeable, self).__init__()
self.expressions = expressions
class SelectExpression(Node):
def __init__(self, expression, variants=None):
super(SelectExpression, self).__init__()
self.expression = expression
self.variants = variants
class MemberExpression(Node):
def __init__(self, obj, keyword):
super(MemberExpression, self).__init__()
self.object = obj
self.keyword = keyword
class CallExpression(Node):
def __init__(self, callee, args):
super(CallExpression, self).__init__()
self.callee = callee
self.args = args
class ExternalArgument(Node):
def __init__(self, name):
super(ExternalArgument, self).__init__()
self.name = name
class KeyValueArg(Node):
def __init__(self, name, value):
super(KeyValueArg, self).__init__()
self.name = name
self.value = value
class EntityReference(Identifier):
def __init__(self, name):
super(EntityReference, self).__init__(name)
class FunctionReference(Identifier):
def __init__(self, name):
super(FunctionReference, self).__init__(name)
class Keyword(Identifier):
def __init__(self, name, namespace=None):
super(Keyword, self).__init__(name)
self.namespace = namespace
class Number(Node):
def __init__(self, value):
super(Number, self).__init__()
self.value = value
class TextElement(Node):
def __init__(self, value):
super(TextElement, self).__init__()
self.value = value
class Comment(Node):
def __init__(self, content):
super(Comment, self).__init__()
self.content = content
class JunkEntry(Node):
def __init__(self, content):
super(JunkEntry, self).__init__()
self.content = content
|