Source code for buildingmotif.label_parsing.tokens

from abc import ABC
from dataclasses import dataclass
from typing import Any, Optional, Type, Union

from rdflib import URIRef


[docs]@dataclass(frozen=True) class Token(ABC): value: Any
# Token is a union of the different types of tokens TokenOrConstructor = Union[Token, Type[Token]]
[docs]def ensure_token(token_or_constructor: TokenOrConstructor, value): """Ensure a value is a token or constructs one from a given value.""" if isinstance(token_or_constructor, type): return token_or_constructor(value) return token_or_constructor
[docs]@dataclass(frozen=True) class Identifier(Token): """An identifier token. Contains a string.""" value: str
[docs]@dataclass(frozen=True) class Constant(Token): """A constant token. Contains a URI, probably some sort of Class""" value: URIRef
[docs]@dataclass(frozen=True) class Delimiter(Token): """A delimiter token.""" value: str
[docs]@dataclass(frozen=True) class Null(Token): """A null token.""" value: None = None
[docs]@dataclass(frozen=True) class TokenResult: """A token result. Contains a token, the type of the token, the length of the token, and a possible error.""" value: Optional[str] token: Token length: int error: Optional[str] = None id: Optional[str] = None def __eq__(self, other): """ Compare two token results on every field except for the error field. """ if not isinstance(other, TokenResult): return False return ( self.value == other.value and self.token == other.token and self.length == other.length )
# null token result ErrorTokenResult = TokenResult(None, Null(), 0, None)