solp 0.16.0

Microsoft Visual Studio solution parsing library
Documentation

use crate::ast::{Node};
use crate::lex::{Tok, LexicalError};

grammar<'a>(input: &'a str);

pub Solution: Node<'a> = <f:FirstLine> <lines:Line*> => Node::Solution(Box::new(f), lines);

Line = {
    <HeaderLine>,
    <Project>,
    <Global>,
};

HeaderLine = {
    <Comment>,
    <Version>,
};

FirstLine : Node<'a> = <id1:Identifier> <id2:Identifier*> "comma" <id3:Identifier*> <v:DigitOrDot> => Node::FirstLine(Box::new(v));

Version : Node<'a> = <id:Identifier> "eq" <r:DigitOrDot> => Node::Version(Box::new(id),Box::new(r));

Project : Node<'a> = <b:ProjectBegin> <s:Section*> "close_element" => Node::Project(Box::new(b), s);

Global : Node<'a> = <id:Identifier> <s:Section*> "close_element" => Node::Global(s);

ProjectBegin : Node<'a> = {
    "open_element" <t:Guid> "eq" <n:Str> "comma" <p:Str> "comma" <id:Guid> => {
        Node::ProjectBegin(Box::new(t),Box::new(n),Box::new(p),Box::new(id))
    },
};

Section : Node<'a> = <b:SectionBegin> <c:SectionContent*> "close_element" => Node::Section(Box::new(b), c);

SectionBegin : Node<'a> = {
    "open_element" <name:Identifier+> "eq" <stage:Identifier> => {
        Node::SectionBegin(name, Box::new(stage))
    },
};

SectionContent : Node<'a> = {
    <k:SectionKey> <v:SectionValue> => {
        Node::SectionContent(Box::new(k), Box::new(v))
    },
};

Comment : Node<'a> = "comment" => Node::Comment(<>);

DigitOrDot: Node<'a> = "digit_and_dot" => Node::DigitOrDot(<>);

Guid: Node<'a> = "guid" => Node::Guid(<>);

Identifier: Node<'a> = "id" => Node::Identifier(<>);

Str: Node<'a> = "str" => Node::Str(<>);

SectionKey: Node<'a> = "section_key" => Node::Str(<>);

SectionValue: Node<'a> = "section_value" => Node::Str(<>);

extern {
    type Location = usize;
    type Error = LexicalError;

    enum Tok<'a> {
        "comment" => Tok::Comment(<&'a str>),
        "str" => Tok::Str(<&'a str>),
        "section_key" => Tok::SectionKey(<&'a str>),
        "section_value" => Tok::SectionValue(<&'a str>),
        "guid" => Tok::Guid(<&'a str>),
        "id" => Tok::Id(<&'a str>),
        "digit_and_dot" => Tok::DigitsAndDots(<&'a str>),
        "comma" => Tok::Comma,
        "eq" => Tok::Eq,
        "open_element" => Tok::OpenElement(<&'a str>),
        "close_element" => Tok::CloseElement(<&'a str>),
    }
}