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>),
}
}