Skip to main content

syn_grammar_macros/
lib.rs

1#![doc = include_str!("../README.md")]
2
3extern crate proc_macro;
4
5use proc_macro::TokenStream;
6use quote::quote;
7use syn_grammar_model::parse_grammar;
8
9// Include modules
10mod backend;
11mod codegen;
12mod monomorphize;
13
14use backend::SynBackend;
15
16/// The main macro for defining grammars.
17///
18/// See the [crate-level documentation](https://docs.rs/syn-grammar) for full syntax and usage details.
19///
20/// # Example
21///
22/// ```rust,ignore
23/// use syn_grammar::grammar;
24///
25/// grammar! {
26///     grammar MyGrammar {
27///         rule main -> i32 = "42" -> { 42 }
28///     }
29/// }
30/// ```
31#[proc_macro]
32pub fn grammar(input: TokenStream) -> TokenStream {
33    // 1-3. Reusable pipeline: Parse, Transform, Validate
34    // We convert proc_macro::TokenStream to proc_macro2::TokenStream via .into()
35    let mut m_ast = match parse_grammar::<SynBackend>(input.into()) {
36        Ok(ast) => ast,
37        Err(e) => return e.to_compile_error().into(),
38    };
39
40    // 3.5. Monomorphization
41    let monomorphizer = monomorphize::Monomorphizer::new(m_ast.rules);
42    m_ast.rules = monomorphizer.process();
43
44    // 4. Code Generation: From model to finished Rust code (codegen.rs)
45    match codegen::generate_rust(m_ast) {
46        Ok(stream) => stream.into(),           // Successful code
47        Err(e) => e.to_compile_error().into(), // Emit generation error as compiler error
48    }
49}
50
51#[doc(hidden)]
52#[proc_macro]
53pub fn include_grammar(_input: TokenStream) -> TokenStream {
54    quote! {
55        compile_error!("External files are removed in v0.2.0. Please move your grammar inline into grammar! { ... }.");
56    }.into()
57}