wgsl_parse/
parser.rs

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