turtle_syntax/
parsing.rs

1use crate::{
2	lexing::{self, Delimiter, Keyword, Punct, Token, Tokens},
3	Collection, Lexer, RdfLiteral,
4};
5use decoded_char::DecodedChar;
6use locspan::{Meta, Span};
7
8/// Unexpected char or end of file.
9#[derive(Debug, thiserror::Error)]
10pub enum Unexpected {
11	#[error("unexpected token `{0}`")]
12	Token(Token),
13
14	#[error("unexpected end of file")]
15	EndOfFile,
16}
17
18impl From<Option<Token>> for Unexpected {
19	fn from(value: Option<Token>) -> Self {
20		match value {
21			Some(token) => Unexpected::Token(token),
22			None => Unexpected::EndOfFile,
23		}
24	}
25}
26
27#[derive(Debug, thiserror::Error)]
28pub enum Error<E> {
29	#[error(transparent)]
30	Lexer(E),
31
32	#[error(transparent)]
33	Unexpected(Unexpected),
34}
35
36pub type MetaError<E, M> = Meta<Box<Error<E>>, M>;
37
38pub trait Parse<M>: Sized {
39	#[allow(clippy::type_complexity)]
40	fn parse_with<L, F>(parser: &mut Parser<L, F>) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
41	where
42		L: Tokens,
43		F: FnMut(Span) -> M,
44	{
45		match parser.next()? {
46			Meta(Some(token), span) => Self::parse_from(parser, Meta(token, span)),
47			Meta(None, span) => Self::parse_empty::<L>(parser.build_metadata(span)),
48		}
49	}
50
51	#[allow(clippy::type_complexity)]
52	fn parse_from<L, F>(
53		parser: &mut Parser<L, F>,
54		token: Meta<Token, Span>,
55	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
56	where
57		L: Tokens,
58		F: FnMut(Span) -> M;
59
60	#[allow(clippy::type_complexity)]
61	fn parse_empty<L>(meta: M) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
62	where
63		L: Tokens,
64	{
65		Err(Meta(
66			Box::new(Error::Unexpected(Unexpected::EndOfFile)),
67			meta,
68		))
69	}
70
71	#[inline(always)]
72	fn parse<C, F, E>(
73		chars: C,
74		metadata_builder: F,
75	) -> Result<Meta<Self, M>, MetaError<lexing::Error<E>, M>>
76	where
77		C: Iterator<Item = Result<DecodedChar, E>>,
78		F: FnMut(Span) -> M,
79	{
80		let mut parser = Parser::new(Lexer::new(chars), metadata_builder);
81		Self::parse_with(&mut parser)
82	}
83
84	#[inline(always)]
85	fn parse_infallible<C, F>(
86		chars: C,
87		metadata_builder: F,
88	) -> Result<Meta<Self, M>, MetaError<lexing::Error, M>>
89	where
90		C: Iterator<Item = DecodedChar>,
91		F: FnMut(Span) -> M,
92	{
93		Self::parse(chars.map(Ok), metadata_builder)
94	}
95
96	#[inline(always)]
97	fn parse_utf8<C, F, E>(
98		chars: C,
99		metadata_builder: F,
100	) -> Result<Meta<Self, M>, MetaError<lexing::Error<E>, M>>
101	where
102		C: Iterator<Item = Result<char, E>>,
103		F: FnMut(Span) -> M,
104	{
105		Self::parse(
106			decoded_char::FallibleUtf8Decoded::new(chars),
107			metadata_builder,
108		)
109	}
110
111	#[inline(always)]
112	fn parse_utf8_infallible<C, F>(
113		chars: C,
114		metadata_builder: F,
115	) -> Result<Meta<Self, M>, MetaError<lexing::Error, M>>
116	where
117		C: Iterator<Item = char>,
118		F: FnMut(Span) -> M,
119	{
120		Self::parse_infallible(decoded_char::Utf8Decoded::new(chars), metadata_builder)
121	}
122
123	#[inline(always)]
124	fn parse_utf16<C, F, E>(
125		chars: C,
126		metadata_builder: F,
127	) -> Result<Meta<Self, M>, MetaError<lexing::Error<E>, M>>
128	where
129		C: Iterator<Item = Result<char, E>>,
130		F: FnMut(Span) -> M,
131	{
132		Self::parse(
133			decoded_char::FallibleUtf16Decoded::new(chars),
134			metadata_builder,
135		)
136	}
137
138	#[inline(always)]
139	fn parse_utf16_infallible<C, F>(
140		chars: C,
141		metadata_builder: F,
142	) -> Result<Meta<Self, M>, MetaError<lexing::Error, M>>
143	where
144		C: Iterator<Item = char>,
145		F: FnMut(Span) -> M,
146	{
147		Self::parse_infallible(decoded_char::Utf16Decoded::new(chars), metadata_builder)
148	}
149
150	#[inline(always)]
151	fn parse_str<F>(
152		string: &str,
153		metadata_builder: F,
154	) -> Result<Meta<Self, M>, MetaError<lexing::Error, M>>
155	where
156		F: FnMut(Span) -> M,
157	{
158		Self::parse_utf8_infallible(string.chars(), metadata_builder)
159	}
160}
161
162pub struct Parser<L, F> {
163	lexer: L,
164	metadata_builder: F,
165}
166
167impl<L, F> Parser<L, F> {
168	pub fn new(lexer: L, metadata_builder: F) -> Self {
169		Self {
170			lexer,
171			metadata_builder,
172		}
173	}
174}
175
176impl<L: Tokens, F: FnMut(Span) -> M, M> Parser<L, F> {
177	fn next(&mut self) -> Result<Meta<Option<Token>, Span>, MetaError<L::Error, M>> {
178		self.lexer
179			.next()
180			.map_err(|Meta(e, span)| Meta(Box::new(Error::Lexer(e)), (self.metadata_builder)(span)))
181	}
182
183	#[allow(clippy::type_complexity)]
184	fn peek(&mut self) -> Result<Meta<Option<&Token>, Span>, MetaError<L::Error, M>> {
185		self.lexer
186			.peek()
187			.map_err(|Meta(e, span)| Meta(Box::new(Error::Lexer(e)), (self.metadata_builder)(span)))
188	}
189
190	fn last_span(&self) -> Span {
191		self.lexer.last()
192	}
193
194	fn build_metadata(&mut self, span: Span) -> M {
195		(self.metadata_builder)(span)
196	}
197}
198
199impl<M> Parse<M> for crate::Document<M> {
200	fn parse_from<L, F>(
201		parser: &mut Parser<L, F>,
202		Meta(token, mut span): Meta<Token, Span>,
203	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
204	where
205		L: Tokens,
206		F: FnMut(Span) -> M,
207	{
208		let mut result = crate::Document::default();
209		result.insert(crate::Statement::parse_from(parser, Meta(token, span))?);
210
211		while let Meta(Some(token), span) = parser.next()? {
212			result.insert(crate::Statement::parse_from(parser, Meta(token, span))?)
213		}
214
215		span.append(parser.last_span());
216		Ok(Meta(result, parser.build_metadata(span)))
217	}
218
219	fn parse_empty<L>(meta: M) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
220	where
221		L: Tokens,
222	{
223		Ok(Meta(Self::new(), meta))
224	}
225}
226
227impl<M> Parse<M> for crate::Directive<M> {
228	fn parse_from<L, F>(
229		parser: &mut Parser<L, F>,
230		Meta(token, mut span): Meta<Token, Span>,
231	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
232	where
233		L: Tokens,
234		F: FnMut(Span) -> M,
235	{
236		match token {
237			Token::Keyword(Keyword::Prefix) => match parser.next()? {
238				Meta(Some(Token::CompactIri((namespace, ns_span), (suffix, suffix_span))), _) => {
239					if suffix.is_empty() {
240						match parser.next()? {
241							Meta(Some(Token::IriRef(iri_ref)), iri_ref_span) => {
242								match parser.next()? {
243									Meta(Some(Token::Punct(Punct::Period)), dot_span) => {
244										span.append(dot_span);
245										Ok(Meta(
246											crate::Directive::Prefix(
247												Meta(namespace, parser.build_metadata(ns_span)),
248												Meta(iri_ref, parser.build_metadata(iri_ref_span)),
249											),
250											parser.build_metadata(span),
251										))
252									}
253									Meta(unexpected, span) => Err(Meta(
254										Box::new(Error::Unexpected(unexpected.into())),
255										parser.build_metadata(span),
256									)),
257								}
258							}
259							Meta(unexpected, span) => Err(Meta(
260								Box::new(Error::Unexpected(unexpected.into())),
261								parser.build_metadata(span),
262							)),
263						}
264					} else {
265						Err(Meta(
266							Box::new(Error::Unexpected(
267								Some(Token::CompactIri(
268									(namespace, ns_span),
269									(suffix, suffix_span),
270								))
271								.into(),
272							)),
273							parser.build_metadata(span),
274						))
275					}
276				}
277				Meta(unexpected, span) => Err(Meta(
278					Box::new(Error::Unexpected(unexpected.into())),
279					parser.build_metadata(span),
280				)),
281			},
282			Token::Keyword(Keyword::Base) => match parser.next()? {
283				Meta(Some(Token::IriRef(iri_ref)), iri_ref_span) => match parser.next()? {
284					Meta(Some(Token::Punct(Punct::Period)), dot_span) => {
285						span.append(dot_span);
286						Ok(Meta(
287							crate::Directive::Base(Meta(
288								iri_ref,
289								parser.build_metadata(iri_ref_span),
290							)),
291							parser.build_metadata(span),
292						))
293					}
294					Meta(unexpected, span) => Err(Meta(
295						Box::new(Error::Unexpected(unexpected.into())),
296						parser.build_metadata(span),
297					)),
298				},
299				Meta(unexpected, span) => Err(Meta(
300					Box::new(Error::Unexpected(unexpected.into())),
301					parser.build_metadata(span),
302				)),
303			},
304			Token::Keyword(Keyword::SparqlPrefix) => match parser.next()? {
305				Meta(Some(Token::CompactIri((namespace, ns_span), (suffix, suffix_span))), _) => {
306					if suffix.is_empty() {
307						match parser.next()? {
308							Meta(Some(Token::IriRef(iri_ref)), iri_ref_span) => {
309								span.append(iri_ref_span);
310								Ok(Meta(
311									crate::Directive::SparqlPrefix(
312										Meta(namespace, parser.build_metadata(ns_span)),
313										Meta(iri_ref, parser.build_metadata(iri_ref_span)),
314									),
315									parser.build_metadata(span),
316								))
317							}
318							Meta(unexpected, span) => Err(Meta(
319								Box::new(Error::Unexpected(unexpected.into())),
320								parser.build_metadata(span),
321							)),
322						}
323					} else {
324						Err(Meta(
325							Box::new(Error::Unexpected(
326								Some(Token::CompactIri(
327									(namespace, ns_span),
328									(suffix, suffix_span),
329								))
330								.into(),
331							)),
332							parser.build_metadata(span),
333						))
334					}
335				}
336				Meta(unexpected, span) => Err(Meta(
337					Box::new(Error::Unexpected(unexpected.into())),
338					parser.build_metadata(span),
339				)),
340			},
341			Token::Keyword(Keyword::SparqlBase) => match parser.next()? {
342				Meta(Some(Token::IriRef(iri_ref)), iri_ref_span) => {
343					span.append(iri_ref_span);
344					Ok(Meta(
345						crate::Directive::SparqlBase(Meta(
346							iri_ref,
347							parser.build_metadata(iri_ref_span),
348						)),
349						parser.build_metadata(span),
350					))
351				}
352				Meta(unexpected, span) => Err(Meta(
353					Box::new(Error::Unexpected(unexpected.into())),
354					parser.build_metadata(span),
355				)),
356			},
357			unexpected => Err(Meta(
358				Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
359				parser.build_metadata(span),
360			)),
361		}
362	}
363}
364
365impl<M> Parse<M> for crate::Statement<M> {
366	fn parse_from<L, F>(
367		parser: &mut Parser<L, F>,
368		Meta(token, span): Meta<Token, Span>,
369	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
370	where
371		L: Tokens,
372		F: FnMut(Span) -> M,
373	{
374		match token {
375			token @ Token::Keyword(
376				Keyword::Prefix | Keyword::Base | Keyword::SparqlPrefix | Keyword::SparqlBase,
377			) => Ok(crate::Directive::parse_from(parser, Meta(token, span))?.map(Self::Directive)),
378			token => {
379				let Meta(triples, meta) = crate::Triples::parse_from(parser, Meta(token, span))?;
380				Ok(Meta(crate::Statement::Triples(triples), meta))
381			}
382		}
383	}
384}
385
386impl<M> Parse<M> for crate::Triples<M> {
387	fn parse_from<L, F>(
388		parser: &mut Parser<L, F>,
389		Meta(token, mut span): Meta<Token, Span>,
390	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
391	where
392		L: Tokens,
393		F: FnMut(Span) -> M,
394	{
395		let subject = crate::Subject::parse_from(parser, Meta(token, span))?;
396
397		let po_list = match parser.peek()? {
398			Meta(Some(Token::Punct(Punct::Period)), p_span) => {
399				if !matches!(&subject, Meta(crate::Subject::BlankNode(crate::BlankNode::Anonymous(l)), _) if !l.is_empty())
400				{
401					return Err(Meta(
402						Box::new(Error::Unexpected(Unexpected::Token(Token::Punct(
403							Punct::Period,
404						)))),
405						parser.build_metadata(p_span),
406					));
407				}
408
409				let span = parser.last_span().next();
410				Meta(Vec::new(), parser.build_metadata(span))
411			}
412			_ => Vec::parse_with(parser)?,
413		};
414
415		span.append(parser.last_span());
416
417		match parser.next()? {
418			Meta(Some(Token::Punct(Punct::Period)), _) => (),
419			Meta(unexpected, span) => {
420				return Err(Meta(
421					Box::new(Error::Unexpected(unexpected.into())),
422					parser.build_metadata(span),
423				));
424			}
425		}
426
427		Ok(Meta(
428			crate::Triples {
429				subject,
430				predicate_objects_list: po_list,
431			},
432			parser.build_metadata(span),
433		))
434	}
435}
436
437impl<M> Parse<M> for Vec<Meta<crate::PredicateObjects<M>, M>> {
438	fn parse_from<L, F>(
439		parser: &mut Parser<L, F>,
440		Meta(token, span): Meta<Token, Span>,
441	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
442	where
443		L: Tokens,
444		F: FnMut(Span) -> M,
445	{
446		let mut result = vec![crate::PredicateObjects::parse_from(
447			parser,
448			Meta(token, span),
449		)?];
450
451		loop {
452			match parser.peek()? {
453				Meta(Some(Token::Punct(Punct::Semicolon)), _) => {
454					parser.next()?;
455
456					match parser.peek()? {
457						Meta(
458							Some(Token::Punct(Punct::Period) | Token::End(Delimiter::Bracket)),
459							_,
460						) => break,
461						_ => result.push(crate::PredicateObjects::parse_with(parser)?),
462					}
463				}
464				Meta(Some(Token::Punct(Punct::Period) | Token::End(Delimiter::Bracket)), _) => {
465					break
466				}
467				_ => {
468					let Meta(unexpected, span) = parser.next()?;
469					return Err(Meta(
470						Box::new(Error::Unexpected(unexpected.into())),
471						parser.build_metadata(span),
472					));
473				}
474			}
475		}
476
477		Ok(Meta(result, parser.build_metadata(span)))
478	}
479}
480
481impl<M> Parse<M> for crate::PredicateObjects<M> {
482	fn parse_from<L, F>(
483		parser: &mut Parser<L, F>,
484		Meta(token, mut span): Meta<Token, Span>,
485	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
486	where
487		L: Tokens,
488		F: FnMut(Span) -> M,
489	{
490		let verb = crate::Verb::parse_from(parser, Meta(token, span))?;
491		let objects = crate::Objects::parse_with(parser)?;
492		span.append(parser.last_span());
493		Ok(Meta(Self { verb, objects }, parser.build_metadata(span)))
494	}
495}
496
497impl<M> Parse<M> for crate::Objects<M> {
498	fn parse_from<L, F>(
499		parser: &mut Parser<L, F>,
500		Meta(token, span): Meta<Token, Span>,
501	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
502	where
503		L: Tokens,
504		F: FnMut(Span) -> M,
505	{
506		let mut result = vec![crate::Object::parse_from(parser, Meta(token, span))?];
507
508		loop {
509			match parser.peek()? {
510				Meta(Some(Token::Punct(Punct::Comma)), _) => {
511					parser.next()?;
512					result.push(crate::Object::parse_with(parser)?);
513				}
514				Meta(
515					Some(
516						Token::Punct(Punct::Period | Punct::Semicolon)
517						| Token::End(Delimiter::Bracket),
518					),
519					_,
520				) => break,
521				_ => {
522					let Meta(unexpected, span) = parser.next()?;
523					return Err(Meta(
524						Box::new(Error::Unexpected(unexpected.into())),
525						parser.build_metadata(span),
526					));
527				}
528			}
529		}
530
531		Ok(Meta(Self(result), parser.build_metadata(span)))
532	}
533}
534
535fn compact_iri<M, L, F>(
536	parser: &mut Parser<L, F>,
537	(prefix, prefix_span): (String, Span),
538	(suffix, suffix_span): (String, Span),
539) -> crate::Iri<M>
540where
541	L: Tokens,
542	F: FnMut(Span) -> M,
543{
544	crate::Iri::Compact(
545		Meta(prefix, parser.build_metadata(prefix_span)),
546		Meta(suffix, parser.build_metadata(suffix_span)),
547	)
548}
549
550impl<M> Parse<M> for crate::Subject<M> {
551	fn parse_from<L, F>(
552		parser: &mut Parser<L, F>,
553		Meta(token, mut span): Meta<Token, Span>,
554	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
555	where
556		L: Tokens,
557		F: FnMut(Span) -> M,
558	{
559		match token {
560			Token::IriRef(iri_ref) => Ok(Meta(
561				crate::Subject::Iri(crate::Iri::IriRef(iri_ref)),
562				parser.build_metadata(span),
563			)),
564			Token::CompactIri(prefix, suffix) => Ok(Meta(
565				crate::Subject::Iri(compact_iri(parser, prefix, suffix)),
566				parser.build_metadata(span),
567			)),
568			Token::BlankNodeLabel(label) => Ok(Meta(
569				crate::Subject::BlankNode(crate::BlankNode::Label(label)),
570				parser.build_metadata(span),
571			)),
572			Token::Begin(Delimiter::Bracket) => {
573				let po_list = match parser.peek()? {
574					Meta(Some(Token::End(Delimiter::Bracket)), _) => {
575						let span = parser.last_span().next();
576						Meta(Vec::new(), parser.build_metadata(span))
577					}
578					_ => Vec::parse_with(parser)?,
579				};
580
581				match parser.next()? {
582					Meta(Some(Token::End(Delimiter::Bracket)), _) => (),
583					Meta(unexpected, span) => {
584						return Err(Meta(
585							Box::new(Error::Unexpected(unexpected.into())),
586							parser.build_metadata(span),
587						));
588					}
589				}
590
591				span.append(parser.last_span());
592				Ok(Meta(
593					crate::Subject::BlankNode(crate::BlankNode::Anonymous(po_list)),
594					parser.build_metadata(span),
595				))
596			}
597			Token::Begin(Delimiter::Parenthesis) => {
598				let Meta(objects, meta) = Collection::parse_from(parser, Meta(token, span))?;
599				Ok(Meta(crate::Subject::Collection(objects), meta))
600			}
601			unexpected => Err(Meta(
602				Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
603				parser.build_metadata(span),
604			)),
605		}
606	}
607}
608
609impl<M> Parse<M> for Collection<M> {
610	fn parse_from<L, F>(
611		parser: &mut Parser<L, F>,
612		Meta(token, mut span): Meta<Token, Span>,
613	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
614	where
615		L: Tokens,
616		F: FnMut(Span) -> M,
617	{
618		match token {
619			Token::Begin(Delimiter::Parenthesis) => {
620				let mut objects = Vec::new();
621
622				loop {
623					match parser.next()? {
624						Meta(Some(Token::End(Delimiter::Parenthesis)), end_span) => {
625							span.append(end_span);
626							break;
627						}
628						Meta(Some(token), span) => {
629							let object = crate::Object::parse_from(parser, Meta(token, span))?;
630							objects.push(object)
631						}
632						Meta(unexpected, span) => {
633							return Err(Meta(
634								Box::new(Error::Unexpected(unexpected.into())),
635								parser.build_metadata(span),
636							))
637						}
638					}
639				}
640
641				Ok(Meta(Collection(objects), parser.build_metadata(span)))
642			}
643			unexpected => Err(Meta(
644				Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
645				parser.build_metadata(span),
646			)),
647		}
648	}
649}
650
651impl<M> Parse<M> for crate::Object<M> {
652	fn parse_from<L, F>(
653		parser: &mut Parser<L, F>,
654		Meta(token, mut span): Meta<Token, Span>,
655	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
656	where
657		L: Tokens,
658		F: FnMut(Span) -> M,
659	{
660		match token {
661			Token::IriRef(iri_ref) => Ok(Meta(
662				crate::Object::Iri(crate::Iri::IriRef(iri_ref)),
663				parser.build_metadata(span),
664			)),
665			Token::CompactIri(prefix, suffix) => Ok(Meta(
666				crate::Object::Iri(compact_iri(parser, prefix, suffix)),
667				parser.build_metadata(span),
668			)),
669			Token::BlankNodeLabel(label) => Ok(Meta(
670				crate::Object::BlankNode(crate::BlankNode::Label(label)),
671				parser.build_metadata(span),
672			)),
673			Token::Begin(Delimiter::Bracket) => {
674				let po_list = match parser.peek()? {
675					Meta(Some(Token::End(Delimiter::Bracket)), _) => {
676						let span = parser.last_span().next();
677						Meta(Vec::new(), parser.build_metadata(span))
678					}
679					_ => Vec::parse_with(parser)?,
680				};
681
682				match parser.next()? {
683					Meta(Some(Token::End(Delimiter::Bracket)), _) => (),
684					Meta(unexpected, span) => {
685						return Err(Meta(
686							Box::new(Error::Unexpected(unexpected.into())),
687							parser.build_metadata(span),
688						));
689					}
690				}
691
692				span.append(parser.last_span());
693				Ok(Meta(
694					crate::Object::BlankNode(crate::BlankNode::Anonymous(po_list)),
695					parser.build_metadata(span),
696				))
697			}
698			Token::Begin(Delimiter::Parenthesis) => {
699				let Meta(objects, meta) = Collection::parse_from(parser, Meta(token, span))?;
700				Ok(Meta(crate::Object::Collection(objects), meta))
701			}
702			token => {
703				let Meta(literal, meta) = crate::Literal::parse_from(parser, Meta(token, span))?;
704				Ok(Meta(crate::Object::Literal(literal), meta))
705			}
706		}
707	}
708}
709
710const XSD_STRING: iref::Iri<'static> = static_iref::iri!("http://www.w3.org/2001/XMLSchema#string");
711
712#[allow(clippy::type_complexity)]
713fn parse_rdf_literal<M, L, F>(
714	parser: &mut Parser<L, F>,
715	Meta(string, string_span): Meta<String, Span>,
716) -> Result<Meta<RdfLiteral<M>, M>, MetaError<L::Error, M>>
717where
718	L: Tokens,
719	F: FnMut(Span) -> M,
720{
721	match parser.peek()? {
722		Meta(Some(Token::LangTag(_)), tag_span) => {
723			let tag = match parser.next()? {
724				Meta(Some(Token::LangTag(tag)), _) => tag,
725				_ => panic!("expected lang tag"),
726			};
727
728			let span = string_span.union(tag_span);
729			Ok(Meta(
730				RdfLiteral::new(
731					Meta(string, parser.build_metadata(string_span)),
732					Meta(
733						rdf_types::literal::Type::LangString(tag),
734						parser.build_metadata(tag_span),
735					),
736				),
737				parser.build_metadata(span),
738			))
739		}
740		Meta(Some(Token::Punct(Punct::Carets)), _) => {
741			parser.next()?;
742			let iri = crate::Iri::parse_with(parser)?.map(rdf_types::literal::Type::Any);
743			let span = string_span.union(parser.last_span());
744			Ok(Meta(
745				RdfLiteral::new(Meta(string, parser.build_metadata(string_span)), iri),
746				parser.build_metadata(span),
747			))
748		}
749		_ => {
750			let ty = Meta(
751				rdf_types::literal::Type::Any(crate::Iri::IriRef(XSD_STRING.to_owned().into())),
752				parser.build_metadata(string_span),
753			);
754			Ok(Meta(
755				RdfLiteral::new(Meta(string, parser.build_metadata(string_span)), ty),
756				parser.build_metadata(string_span),
757			))
758		}
759	}
760}
761
762impl<M> Parse<M> for crate::Literal<M> {
763	fn parse_from<L, F>(
764		parser: &mut Parser<L, F>,
765		Meta(token, span): Meta<Token, Span>,
766	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
767	where
768		L: Tokens,
769		F: FnMut(Span) -> M,
770	{
771		match token {
772			Token::StringLiteral(string) => {
773				let Meta(lit, loc) = parse_rdf_literal(parser, Meta(string, span))?;
774				Ok(Meta(crate::Literal::Rdf(lit), loc))
775			}
776			Token::Numeric(n) => Ok(Meta(
777				crate::Literal::Numeric(n),
778				parser.build_metadata(span),
779			)),
780			Token::Keyword(Keyword::True) => Ok(Meta(
781				crate::Literal::Boolean(true),
782				parser.build_metadata(span),
783			)),
784			Token::Keyword(Keyword::False) => Ok(Meta(
785				crate::Literal::Boolean(false),
786				parser.build_metadata(span),
787			)),
788			unexpected => Err(Meta(
789				Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
790				parser.build_metadata(span),
791			)),
792		}
793	}
794}
795
796impl<M> Parse<M> for crate::Verb<M> {
797	fn parse_from<L, F>(
798		parser: &mut Parser<L, F>,
799		Meta(token, span): Meta<Token, Span>,
800	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
801	where
802		L: Tokens,
803		F: FnMut(Span) -> M,
804	{
805		match token {
806			Token::Keyword(Keyword::A) => Ok(Meta(crate::Verb::A, parser.build_metadata(span))),
807			token => {
808				let Meta(iri, meta) = crate::Iri::parse_from(parser, Meta(token, span))?;
809				Ok(Meta(crate::Verb::Predicate(iri), meta))
810			}
811		}
812	}
813}
814
815impl<M> Parse<M> for crate::Iri<M> {
816	fn parse_from<L, F>(
817		parser: &mut Parser<L, F>,
818		Meta(token, span): Meta<Token, Span>,
819	) -> Result<Meta<Self, M>, MetaError<L::Error, M>>
820	where
821		L: Tokens,
822		F: FnMut(Span) -> M,
823	{
824		match token {
825			Token::IriRef(iri_ref) => Ok(Meta(
826				crate::Iri::IriRef(iri_ref),
827				parser.build_metadata(span),
828			)),
829			Token::CompactIri(prefix, suffix) => Ok(Meta(
830				compact_iri(parser, prefix, suffix),
831				parser.build_metadata(span),
832			)),
833			unexpected => Err(Meta(
834				Box::new(Error::Unexpected(Unexpected::Token(unexpected))),
835				parser.build_metadata(span),
836			)),
837		}
838	}
839}