ebnf/
lib.rs

1#![cfg_attr(feature = "strict", deny(warnings))]
2
3//! ebnf - A successor bnf parsing library of bnf parsing library, for parsing Extended Backus–Naur form context-free grammars
4//!
5//! The code is available on [GitHub](https://github.com/ChAoSUnItY/ebnf)
6//!
7//! ## Disclaimer:
8//! There are various variants of EBNF, which uses somewhat different syntactic conventions. This library
9//! takes [EBNF Evaluator](https://mdkrajnak.github.io/ebnftest/)'s example code as standard, which has
10//! almost most syntactic conventions on Wikipedia's page.
11//!
12//! ## What does a valid EBNF grammar looks like?
13//!
14//! The following example is taken from EBNF Evaluator:
15//!
16//! ```ebnf
17//! filter ::= ( first ' ' )? ( number '~ ' )? ( number '-' number ) ( ' ' number '~' )? ( ' hz' )? ( ' b' )? ( ' i' )? ( ' a' )?;
18//! first  ::= #'[a-za-z][a-za-z0-9_+]*';
19//! number ::= digits ( ( '.' | ',' ) digits? )?;
20//! digits ::= #'[0-9]+';
21//! ```
22//!
23//! ## How to use this library?
24//!
25//! ```rust
26//! extern crate ebnf;
27//!
28//! fn main() {
29//!     let source = r"
30//!         filter ::= ( first ' ' )? ( number '~ ' )? ( number '-' number ) ( ' ' number '~' )? ( ' hz' )? ( ' b' )? ( ' i' )? ( ' a' )?;
31//!         first  ::= #'[a-za-z][a-za-z0-9_+]*';
32//!         number ::= digits ( ( '.' | ',' ) digits? )?;
33//!         digits ::= #'[0-9]+';
34//!     ";
35//!
36//!     let result = ebnf::get_grammar(source);
37//! }
38//! ```
39
40extern crate nom;
41extern crate parse_hyperlinks;
42mod expression;
43mod grammar;
44mod node;
45mod parser;
46pub use expression::Expression;
47pub use grammar::Grammar;
48pub use node::{Node, RegexExtKind, SymbolKind};
49
50/// Get and parse EBNF grammar source into [Grammar], returns [Err] when given grammar is invalid.
51/// 
52/// # Example
53/// 
54/// ```rust
55/// use ebnf::get_grammar;
56/// 
57/// let grammar_literal = r"
58///     term ::= '1';
59/// ";
60/// let grammar = get_grammar(grammar_literal)?;
61/// ```
62pub fn get_grammar(input: &str) -> Result<Grammar, nom::Err<nom::error::VerboseError<&str>>> {
63    parser::parse_expressions(input).map(|(_, expressions)| Grammar { expressions })
64}