wgsl_parse/
parser.rs

1use std::str::FromStr;
2
3use lalrpop_util::lalrpop_mod;
4
5use crate::{
6    error::Error,
7    lexer::Lexer,
8    syntax::{Expression, GlobalDeclaration, GlobalDirective, Statement, TranslationUnit},
9};
10
11lalrpop_mod!(
12    #[allow(clippy::type_complexity)]
13    wgsl
14);
15lalrpop_mod!(
16    #[allow(clippy::type_complexity)]
17    wgsl_recognize
18);
19
20/// Parse a string into a syntax tree ([`TranslationUnit`]).
21///
22/// Identical to [`TranslationUnit::from_str`].
23pub fn parse_str(source: &str) -> Result<TranslationUnit, Error> {
24    let lexer = Lexer::new(source);
25    let parser = wgsl::TranslationUnitParser::new();
26    parser.parse(lexer).map_err(Into::into)
27}
28
29/// Test whether a string represent a valid WGSL module ([`TranslationUnit`]).
30///
31/// Warning: it does not take WESL extensions into account.
32pub fn recognize_str(source: &str) -> Result<(), Error> {
33    let lexer = Lexer::new(source);
34    let parser = wgsl_recognize::TranslationUnitParser::new();
35    parser.parse(lexer).map_err(Into::into)
36}
37
38pub(crate) fn recognize_template_list(lexer: &mut Lexer) -> Result<(), Error> {
39    let parser = wgsl::TryTemplateListParser::new();
40    parser.parse(lexer).map(|_| ()).map_err(Into::into)
41}
42
43impl FromStr for TranslationUnit {
44    type Err = Error;
45
46    fn from_str(source: &str) -> Result<Self, Self::Err> {
47        let lexer = Lexer::new(source);
48        let parser = wgsl::TranslationUnitParser::new();
49        parser.parse(lexer).map_err(Into::into)
50    }
51}
52impl FromStr for GlobalDirective {
53    type Err = Error;
54
55    fn from_str(source: &str) -> Result<Self, Self::Err> {
56        let lexer = Lexer::new(source);
57        let parser = wgsl::GlobalDirectiveParser::new();
58        parser.parse(lexer).map_err(Into::into)
59    }
60}
61impl FromStr for GlobalDeclaration {
62    type Err = Error;
63
64    fn from_str(source: &str) -> Result<Self, Self::Err> {
65        let lexer = Lexer::new(source);
66        let parser = wgsl::GlobalDeclParser::new();
67        parser.parse(lexer).map_err(Into::into)
68    }
69}
70impl FromStr for Statement {
71    type Err = Error;
72
73    fn from_str(source: &str) -> Result<Self, Self::Err> {
74        let lexer = Lexer::new(source);
75        let parser = wgsl::StatementParser::new();
76        parser.parse(lexer).map_err(Into::into)
77    }
78}
79impl FromStr for Expression {
80    type Err = Error;
81
82    fn from_str(source: &str) -> Result<Self, Self::Err> {
83        let lexer = Lexer::new(source);
84        let parser = wgsl::ExpressionParser::new();
85        parser.parse(lexer).map_err(Into::into)
86    }
87}
88#[cfg(feature = "imports")]
89impl FromStr for crate::syntax::ImportStatement {
90    type Err = Error;
91
92    fn from_str(source: &str) -> Result<Self, Self::Err> {
93        let lexer = Lexer::new(source);
94        let parser = wgsl::ImportStatementParser::new();
95        parser.parse(lexer).map_err(Into::into)
96    }
97}