extern crate utf_railroad; use utf_railroad::{Diagram, Choice, Terminal, Sequence, Repeat, Optional, NonTerminal}; fn main() { let object = Diagram::default() .push(Box::new(Terminal::new("{"))) .push(Box::new( Optional::new(Box::new( Sequence::default() .push(Box::new( Repeat::new(Box::new( Sequence::default() .push(Box::new(NonTerminal::new("string"))) .push(Box::new(Terminal::new(":"))) .push(Box::new(NonTerminal::new("value"))) .push(Box::new(Terminal::new(","))) )) )) .push(Box::new( Sequence::default() .push(Box::new(NonTerminal::new("string"))) .push(Box::new(Terminal::new(":"))) .push(Box::new(NonTerminal::new("value"))) )) )) )) .push(Box::new(Terminal::new("}"))); println!("object:\n{}\n", object); let array = Diagram::default() .push(Box::new(Terminal::new("["))) .push(Box::new( Optional::new(Box::new( Sequence::default() .push(Box::new( Repeat::new(Box::new( Sequence::default() .push(Box::new(NonTerminal::new("value"))) .push(Box::new(Terminal::new(","))) )) )) .push(Box::new(NonTerminal::new("value"))) )) )) .push(Box::new(Terminal::new("]"))); println!("array:\n{}\n", array); let value = Diagram::default() .push(Box::new( Choice::default() .push(Box::new(NonTerminal::new("string"))) .push(Box::new(NonTerminal::new("number"))) .push(Box::new(NonTerminal::new("object"))) .push(Box::new(NonTerminal::new("array"))) .push(Box::new(Terminal::new("true"))) .push(Box::new(Terminal::new("false"))) .push(Box::new(Terminal::new("null"))) )); println!("value:\n{}\n", value); let string = Diagram::default() .push(Box::new(Terminal::new("\""))) .push(Box::new( Repeat::new(Box::new( Choice::default() .push(Box::new(Terminal::new("Any unicode character except \" or \\ or control character"))) .push(Box::new( Sequence::default() .push(Box::new(Terminal::new("\\"))) .push(Box::new( Choice::default() .push(Box::new(Terminal::new("\""))) .push(Box::new(Terminal::new("\\"))) .push(Box::new(Terminal::new("/"))) .push(Box::new(Terminal::new("b"))) .push(Box::new(Terminal::new("f"))) .push(Box::new(Terminal::new("n"))) .push(Box::new(Terminal::new("r"))) .push(Box::new(Terminal::new("t"))) .push(Box::new( Sequence::default() .push(Box::new(Terminal::new("u"))) .push(Box::new( Repeat::new(Box::new(Terminal::new("hexadecimal digit"))) .min(4) .max(4) )) )) )) )) )) )) .push(Box::new(Terminal::new("\""))); println!("string:\n{}\n", string); let number = Diagram::default() .push(Box::new(Optional::new(Box::new(Terminal::new("-"))))) .push(Box::new( Choice::default() .push(Box::new(Terminal::new("0"))) .push(Box::new( Sequence::default() .push(Box::new(Terminal::new("digit 1-9"))) .push(Box::new( Repeat::new(Box::new(Terminal::new("digit"))) )) )) )) .push(Box::new( Optional::new(Box::new( Sequence::default() .push(Box::new(Terminal::new("."))) .push(Box::new( Repeat::new(Box::new(Terminal::new("digit"))) .min(1) )) )) )) .push(Box::new( Optional::new(Box::new( Sequence::default() .push(Box::new( Choice::default() .push(Box::new(Terminal::new("e"))) .push(Box::new(Terminal::new("E"))) )) .push(Box::new( Optional::new(Box::new( Choice::default() .push(Box::new(Terminal::new("+"))) .push(Box::new(Terminal::new("-"))) )) )) .push(Box::new( Repeat::new(Box::new(Terminal::new("digit"))) .min(1) )) )) )); println!("number:\n{}", number); }