def __init__(self, full_name: str, stream_range: StreamRange = None): super(Identifier, self).__init__() name, semantic_name = Identifier.split_name(full_name) self.name = name self.semantic_name = semantic_name self.range = stream_range if stream_range is not None else StreamRange( )
def __init__(self, value, type_=None, range: StreamRange = None): super(Literal, self).__init__() self.type = type_ or type(value) """Some instance representing the type of the literal.""" self.value = value """The value associated with the literal.""" self.range = range if range is not None else StreamRange()
def __init__(self, *children, new_element=ElementOperation.make_new): super(Node, self).__init__() if len(children) == 1 and isinstance(children[0], list): children = children[0] self.first = None """The first Element of the doubly-linked list.""" self.last = None """The last Element of the doubly-linked list.""" self.range = StreamRange() if len(children) > 0: assert isinstance(children[0], Code) or isinstance( children[0], Element) current = self.first = new_element(children[0], self) self.range.update(current.code.range) for child in children[1:]: assert isinstance(child, Code) or isinstance(child, Element) current.next = new_element(child, self) current.next.prev = current current = current.next self.range.update(current.range) self.last = current
def apply(self, element) -> Element: if element.next is element.end: parent = element.parent parent.remove(element.end) element.code = Literal( "", self.string_literal_type, StreamRange(element.range.position_after, element.range.position_after)) return element.next assert is_token(element.next, Tokens.STRING) if element.next.next is element.end: parent = element.parent string_token = element.next parent.remove(element) parent.remove(element.end) string_token.code = Literal(string_token.value, self.string_literal_type, string_token.range) return string_token.next else: # FIXME: allow for interpolation new_form_element = element.parent.wrap(element, element.end, Form) new_form = new_form_element.code new_form.prepend(Identifier("str", element.range)) # str BEGIN_MACRO('“') seq of STRING tokens, interspersed with Identifiers and BEGIN_MACRO / END_MACRO pairs END_MACRO new_form.remove(element) # remove BEGIN_MACRO('“') new_form.remove(element.end) # remove END_MACRO elm = new_form[1] # first element while elm is not None: if is_token(elm, Tokens.STRING): elm.code = Literal(elm.value, self.string_literal_type, elm.range) if is_token(elm, Tokens.BEGIN_MACRO): elm = elm.end.next else: elm = elm.next return new_form_element.next