lalrproc/
lib.rs

1//! [![github]](https://github.com/dtolnay/lalrproc) [![crates-io]](https://crates.io/crates/lalrproc) [![docs-rs]](https://docs.rs/lalrproc)
2//!
3//! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github
4//! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust
5//! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs
6
7#![feature(proc_macro_diagnostic)]
8#![allow(
9    clippy::empty_enum,
10    clippy::from_iter_instead_of_collect,
11    clippy::match_same_arms,
12    clippy::module_name_repetitions,
13    clippy::use_self,
14    clippy::wildcard_imports
15)]
16
17extern crate proc_macro;
18
19mod ast;
20mod cursor;
21mod error;
22mod sexpr;
23mod span;
24mod token;
25
26mod parse {
27    #![allow(clippy::all, clippy::pedantic)]
28
29    include!(concat!(env!("OUT_DIR"), "/parse.rs"));
30}
31
32use crate::cursor::Cursor;
33use crate::error::NoUserError;
34use crate::parse::{ExprParser, TypeParser};
35use crate::span::Span;
36use crate::token::Token;
37use lalrpop_util::ParseError;
38use proc_macro::{Delimiter, Group, Literal, TokenStream, TokenTree};
39
40#[proc_macro]
41pub fn s_type(input: TokenStream) -> TokenStream {
42    match TypeParser::new().parse(Cursor::new(input)) {
43        Ok(t) => string_literal(&t.to_string()),
44        Err(err) => parse_error(err),
45    }
46}
47
48#[proc_macro]
49pub fn s_expr(input: TokenStream) -> TokenStream {
50    match ExprParser::new().parse(Cursor::new(input)) {
51        Ok(e) => string_literal(&e.to_string()),
52        Err(err) => parse_error(err),
53    }
54}
55
56fn string_literal(s: &str) -> TokenStream {
57    let lit = Literal::string(s);
58    TokenStream::from(TokenTree::Literal(lit))
59}
60
61fn parse_error(err: ParseError<Span, Token, NoUserError>) -> TokenStream {
62    error::emit(err);
63    let group = Group::new(Delimiter::Brace, TokenStream::new());
64    TokenStream::from(TokenTree::Group(group))
65}