package p.studio.compiler.pbs.lexer;

/**
 * Token kinds produced by the PBS lexer.
 */
public enum PbsTokenKind {
    // End of file marker.
    EOF,

    // User-defined names.
    // Example: `sum`, `Vector`, `input_state`
    IDENTIFIER,

    // Literal values.
    // Example: `42`, `3.14`, `255b`, `"hello"`
    INT_LITERAL,
    FLOAT_LITERAL,
    BOUNDED_LITERAL,
    STRING_LITERAL,
    COMMENT,

    // Import keywords.
    // Example:
    // `import { Vec2 as V2 } from @core:math;`
    IMPORT,
    FROM,
    AS,

    // Declaration and callable keywords.
    SERVICE,
    HOST,
    FN,
    APPLY,
    BIND,
    NEW,
    IMPLEMENTS,
    USING,
    CTOR,
    DECLARE,
    LET,
    CONST,
    GLOBAL,
    STRUCT,
    CONTRACT,
    ERROR,
    ENUM,
    CALLBACK,
    BUILTIN,
    SELF,
    THIS,
    PUB,
    MUT,
    MOD,
    TYPE,

    // Control-flow keywords.
    IF,
    ELSE,
    SWITCH,
    DEFAULT,
    FOR,
    UNTIL,
    STEP,
    WHILE,
    BREAK,
    CONTINUE,
    RETURN,
    VOID,
    OPTIONAL,
    RESULT,
    SOME,
    NONE,
    OK,
    ERR,
    HANDLE,

    // Boolean literals.
    // Example: `true and false`
    TRUE,
    FALSE,
    AND,
    OR,
    NOT,

    // Reserved keywords (not active syntax in v1).
    SPAWN,
    YIELD,
    SLEEP,
    MATCH,

    // Delimiters and separators.
    // Example:
    // `fn f(a: int) { return a; }`
    LEFT_PAREN,
    RIGHT_PAREN,
    LEFT_BRACE,
    RIGHT_BRACE,
    LEFT_BRACKET,
    RIGHT_BRACKET,
    COMMA,
    COLON,
    SEMICOLON,
    AT,
    DOT,
    DOT_DOT,
    ARROW,
    QUESTION,

    // Arithmetic and unary operators.
    // Example: `-a + b * 2`
    PLUS,
    MINUS,
    STAR,
    SLASH,
    PERCENT,
    BANG,
    PLUS_EQUAL,
    MINUS_EQUAL,
    STAR_EQUAL,
    SLASH_EQUAL,
    PERCENT_EQUAL,

    // Comparison and assignment operators.
    // Example:
    // `a == b`, `x <= y`, `value = 10`
    BANG_EQUAL,
    EQUAL,
    EQUAL_EQUAL,
    LESS,
    LESS_EQUAL,
    GREATER,
    GREATER_EQUAL,

    // Logical operators.
    // Example: `a && b || c`
    AND_AND,
    OR_OR
}
