maciejhirsz / logos

Create ridiculously fast Lexers
https://logos.maciej.codes
Apache License 2.0
2.71k stars 105 forks source link

proc-macro derive panicked message: attempt to subtract with overflow #389

Open UnexDev opened 2 months ago

UnexDev commented 2 months ago

I'm converting a YACC grammar file to a Logos lexer, and I'm getting this strange and very unhelpful error message. Every macro-debug process I have tried has literally yielded no additional output.

(All of the RegExps are not complete; I am going to find-and-replace all of the reocurring works like 'skip' and 'StringLiteralSingle')


#[derive(Debug, Logos)]
pub enum TokenKind {
    #[token("&")]
    Ampersand,
    #[token("&=")]
    AmpersandEqual,
    #[token("*")]
    Asterisk,
    #[token("**")]
    AsteriskAsterisk,
    #[token("*=")]
    AsteriskEqual,
    #[token("*%")]
    AsteriskPercent,
    #[token("*%=")]
    AsteriskPercentEqual,
    #[token("*|")]
    AsteriskPipe,
    #[token("*|=")]
    AsteriskPipeEqual,
    #[token("^")]
    Caret,
    #[token("^=")]
    CaretEqual,
    #[token(":")]
    Colon,
    #[token(",")]
    Comma,
    #[token(".")]
    Dot,
    #[token("..")]
    DotDot,
    #[token("...")]
    DotDotDot,
    #[token(".*")]
    DotAsterisk,
    #[token("=")]
    Equal,
    #[token("==")]
    EqualEqual,
    #[token("=>")]
    EqualRarrow,
    #[token("!")]
    Exclemation,
    #[token("!=")]
    ExclamationEqual,
    #[token("<")]
    LArrow,
    #[token("<<")]
    LArrowLArrow,
    #[token("<<=")]
    LArrowLArrowEqual,
    #[token("<<|")]
    LArrowLArrowPipe,
    #[token("<=")]
    LArrowEqual,
    #[token("{")]
    LBrace,
    #[token("[")]
    LBracket,
    #[token("(")]
    LParen,
    #[token("-")]
    Minus,
    #[token("-=")]
    MunisEqual,
    #[token("-%")]
    MinusPercent,
    #[token("-%=")]
    MinusPercentEqual,
    #[token("-|")]
    MinusPipe,
    #[token("->")]
    MinusRarrow,
    #[token("%")]
    Percent,
    #[token("%=")]
    PercentEqual,
    #[token("+")]
    Plus,
    #[token("++")]
    PlusPlus,
    #[token("+=")]
    PlusEqual,
    #[token("+%")]
    PlusPercent,
    #[token("+%=")]
    PlusPercentEqual,
    #[token("+|")]
    PlusPipe,
    #[token("+|=")]
    PlusPipeEqual,
    #[token("c", priority = 3)]
    LetterC,
    #[token("?")]
    QuestionMark,
    #[token(">")]
    RArrow,
    #[token(">>")]
    RArrowRArrow,
    #[token(">>=")]
    RArrowRArrowEqual,
    #[token("}")]
    RBrace,
    #[token("]")]
    RBracket,
    #[token(")")]
    RParen,
    #[token(";")]
    Semicolon,
    #[token("/")]
    Slash,
    #[token("/=")]
    SlashEqual,
    #[token("~")]
    Tilde,

    #[token("addrspace")]
    AddrspaceKw,
    #[token("align")]
    AlignKw,
    #[token("allowzero")]
    AllowzeroKw,
    #[token("and")]
    AndKw,
    #[token("anyframe")]
    AnyframeKw,
    #[token("anytype")]
    AnytypeKw,
    #[token("asm")]
    AsmKw,
    #[token("async")]
    AsyncKw,
    #[token("await")]
    AwaitKw,
    #[token("break")]
    BreakKw,
    #[token("callconv")]
    CallconvKw,
    #[token("catch")]
    CatchKw,
    #[token("comptime")]
    ComptimeKw,
    #[token("const")]
    ConstKw,
    #[token("continue")]
    ContinueKw,
    #[token("defer")]
    DeferKw,
    #[token("else")]
    ElseKw,
    #[token("enum")]
    EnumKw,
    #[token("errdefer")]
    ErrdeferKw,
    #[token("error")]
    ErrorKw,
    #[token("export")]
    ExportKw,
    #[token("extern")]
    ExternKw,
    #[token("fn")]
    FnKw,
    #[token("for")]
    ForKw,
    #[token("if")]
    IfKw,
    #[token("inline")]
    InlineKw,
    #[token("noalias")]
    NoaliasKw,
    #[token("nosuspend")]
    NosuspendKw,
    #[token("noinline")]
    NoinlineKw,
    #[token("opaque")]
    OpaqueKw,
    #[token("or")]
    OrKw,
    #[token("orelse")]
    OrelseKw,
    #[token("packed")]
    PackedKw,
    #[token("pub")]
    PubKw,
    #[token("resume")]
    ResumeKw,
    #[token("return")]
    ReturnKw,
    #[token("linksection")]
    LinksectionKw,
    #[token("struct")]
    StructKw,
    #[token("suspend")]
    SuspendKw,
    #[token("switch")]
    SwitchKw,
    #[token("test")]
    TestKw,
    #[token("threadlocal")]
    ThreadlocalKw,
    #[token("try")]
    TryKw,
    #[token("union")]
    UnionKw,
    #[token("unreachable")]
    UnreachableKw,
    #[token("usingnamespace")]
    UsingnamespaceKw,
    #[token("var")]
    VarKw,
    #[token("volatile")]
    VolatileKw,
    #[token("while")]
    WhileKw,

    #[regex("'char_char'")]
    CharLiteral,

    #[regex("0xhex_int.hex_int([pP][-+]?dec_int)?")]
    Float,

    #[regex("0bbin_intskip|0ooct_intskip|0xhex_intskip|dec_intskip")]
    Integer,

    #[regex("\"string_char*\"skip")]
    StringLiteralSingle,

    #[regex("__StringLiteralSingle__|(?:line_stringskip)+")]
    StringLiteral,

    #[regex("(?:[A-Za-z_][A-Za-z0-9_]*skip)|@__StringLiteralSingle__")]
    Identifier,

    #[regex("@[A-Za-z_][A-Za-z0-9_]*skip")]
    BuiltinIdentifier,
}
jeertmans commented 2 months ago

Hello @UnexDev, can you please provide the error message too?

the faulty line is probably showed in there :)

UnexDev commented 2 months ago

I do think I found the error. It's an enum length problem. When I comment out every line until the error goes away it compiles just fine. When I uncomment one line, it errors. The enum is too long I believe.

Hello @UnexDev, can you please provide the error message too?

the faulty line is probably showed in there :)

I omitted irrelevant details before, but here is the full error message.


  --> crates\parser\src\lexer.rs:41:49
   |
41 | #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Logos)]
   |                                                 ^^^^^
   |
   = help: message: attempt to subtract with overflow

error: could not compile `parser` (lib) due to 1 previous error