1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//! Turtle is a textual syntax for RDF that allows an RDF graph to be completely
//! written in a compact and natural text form, with abbreviations for common
//! usage patterns and datatypes. This library provides a Turtle parser for Rust that keeps tracks of code mapping metadata for each syntax node using the [`locspan`](https://crates.io/crates/locspan) library.
//!
//! ## Basic usage
//!
//! Elements of the Turtle abstract syntax tree (implementing `Parsable`)
//! are parsed using a `Token` iterator (a.k.a a lexer).
//! A `Lexer` can be created from a `char` iterator.
//! We can then use the `Document::parse` function to parse a Turtle document
//! from the lexer.
//! In the following example, we use the excellent [`codespan_reporting`](https://crates.io/crates/codespan-reporting) crate
//! to report errors.
//!
//! ```rust
//! use codespan_reporting::diagnostic::{Diagnostic, Label};
//! use codespan_reporting::files::SimpleFiles;
//! use codespan_reporting::term::termcolor::{ColorChoice, StandardStream};
//! use locspan::Meta;
//! use std::fs::File;
//! use std::io::Read;
//! use turtle_syntax::{
//!   parsing::Parse,
//!   Document,
//! };
//!
//! fn main() -> std::io::Result<()> {
//!   let mut args = std::env::args();
//!   args.next();
//!
//!   let mut files = SimpleFiles::new();
//!
//!   for filename in args {
//!     let mut file = File::open(&filename)?;
//!     let mut buffer = String::new();
//!     file.read_to_string(&mut buffer)?;
//!     let file_id = files.add(filename.clone(), buffer);
//!     let buffer = files.get(file_id).unwrap();
//!
//!     match Document::parse_str(buffer.source().as_str(), |span| span) {
//!       Ok(_doc) => {
//!         // do something
//!       }
//!       Err(Meta(e, span)) => {
//!         let diagnostic = Diagnostic::error()
//!           .with_message(format!("parse error: {}", e))
//!           .with_labels(vec![Label::primary(file_id, span)]);
//!
//!         let writer = StandardStream::stderr(ColorChoice::Auto);
//!         let config = codespan_reporting::term::Config::default();
//!         codespan_reporting::term::emit(&mut writer.lock(), &config, &files, &diagnostic)
//!           .unwrap();
//!       }
//!     }
//!   }
//!
//!   Ok(())
//! }
//! ```
//!
//! The above code will have the following kind of output when a syntax error is
//! detected:
//! ```text
//! error: parse error: unexpected character ` `
//!   ┌─ examples/syntax_error.ttl:5:34
//!   │
//! 5 │ <http://www.w3.org/TR/rdf-syntax- grammar>
//!   │                                  ^
//! ```
mod ast;
pub mod build;
pub mod lexing;
pub mod parsing;

pub use ast::*;
pub use build::Build;
pub use lexing::Lexer;
pub use parsing::Parse;