"""
    pygments.lexers.fift
    ~~~~~~~~~~~~~~~~~~~~

    Lexers for fift.

    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""

from pygments.lexer import RegexLexer, include
from pygments.token import Literal, Comment, Name, String, Number, Whitespace

__all__ = ["FiftLexer"]


class FiftLexer(RegexLexer):
    """
    For Fift source code.
    """

    name = "Fift"
    aliases = ["fift", "fif"]
    filenames = ["*.fif"]
    url = "https://ton-blockchain.github.io/docs/fiftbase.pdf"

    tokens = {
        "root": [
            (r"\s+", Whitespace),
            include("comments"),
            (r"[\.+]?\"", String, "string"),
            # numbers
            (r"0x[0-9a-fA-F]+", Number.Hex),
            (r"0b[01]+", Number.Bin),
            (r'-?[0-9]+("/"-?[0-9]+)?', Number.Decimal),
            # slices
            (r"b\{[01]+\}", Literal),
            (r"x\{[0-9a-fA-F_]+\}", Literal),
            # byte literal
            (r"B\{[0-9a-fA-F_]+\}", Literal),
            # treat anything as word
            (r"\S+", Name),
        ],
        "string": [(r"\\.", String.Escape), (r"\"", String, "#pop"), (r"[^\"\r\n\\]+", String)],
        "comments": [
            (r"//.*", Comment.Singleline),
            (r"/\*", Comment.Multiline, "comment"),
        ],
        "comment": [
            (r"[^/*]+", Comment.Multiline),
            (r"/\*", Comment.Multiline, "#push"),
            (r"\*/", Comment.Multiline, "#pop"),
            (r"[*/]", Comment.Multiline),
        ],
    }
