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