parsingrustpegpest

Rust pest parser fail


I'm learning pest parser written in Rust and I need to parse a file:

{ISomething as Something, IOther as Other}

I wrote a rule:

LBrace = { "{" }
RBrace = { "}" }
Comma = { "," }
As = { "as" }
symbolAliases = { LBrace ~ importAliases ~ ( Comma ~ importAliases )* ~ RBrace }
importAliases = { Identifier ~ (As ~ Identifier)? }
Identifier = { IdentifierStart ~ IdentifierPart* }
IdentifierStart = _{ 'a'..'z' | 'A'..'Z' | "$" | "_" }
IdentifierPart = _{ 'a'..'z' | 'A'..'Z' | '0'..'9' | "$" | "_" }

But the parser throws an error:

thread 'main' panicked at 'unsuccessful parse: Error { variant: ParsingError { positives: [As, RBrace, Comma], negatives: [] }, location: Pos(11), line_col: Pos((1, 12)), path: None, line: "{ISomething as Something, IOther as Other}", continued_line: None }', src\main.rs:18:10
stack backtrace:

Help me figure out what the problem is.


Solution

  • You're not parsing any whitespace, that's your problem. It's expecting something like {ISomethingasSomething,IOtherasOther}. You can add a whitespace rule and add it in sensible places:

    LBrace = { "{" }
    RBrace = { "}" }
    Comma = { "," }
    As = { ws+ ~ "as" ~ ws+ }
    //     ^^^^^------^^^^^
    // an "as" token should probably be surrounded by whitespace to make sense
    
    symbolAliases = { LBrace ~ importAliases ~ ( Comma ~ importAliases )* ~ RBrace }
    importAliases = { ws* ~ Identifier ~ (As ~ Identifier)? }
    //                ^^^^^
    
    Identifier = { IdentifierStart ~ IdentifierPart* }
    IdentifierStart = _{ 'a'..'z' | 'A'..'Z' | "$" | "_" }
    IdentifierPart = _{ 'a'..'z' | 'A'..'Z' | '0'..'9' | "$" | "_" }
    
    // whitespace rule defined here (probably want to add tabs and so on, too):
    ws = _{ " " }
    

    That's the least amount to make it parse, but you'll probably want it around braces and add some more fine-grained rules.

    OR: you can add them implicitly, depending on your needs.