Example #1
0
 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(
     )
Example #2
0
 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()
Example #3
0
    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
Example #4
0
    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