glsl_lang_lexer/
lang_token.rs

1use glsl_lang_pp::types;
2
3use glsl_lang_types::ast::NodeSpan;
4use lang_util::position::LexerPosition;
5
6use crate::{ParseContext, Token};
7
8pub fn lang_token(
9    ctx: &ParseContext,
10    text: &str,
11    pos: NodeSpan,
12    token_kind: types::Token,
13) -> Result<(LexerPosition, Token, LexerPosition), (types::Token, types::token::ErrorKind)> {
14    Ok((
15        pos.start(),
16        match token_kind {
17            types::Token::IDENT(ident) => {
18                if ctx.is_type_name(&ident) {
19                    Token::TypeName(ident)
20                } else {
21                    // It is an identifier
22                    Token::Identifier(ident)
23                }
24            }
25            types::Token::TYPE_NAME(type_name) => match type_name {
26                types::TypeName::VOID => Token::Void,
27                types::TypeName::INT => Token::Int,
28                types::TypeName::BOOL => Token::Bool,
29                types::TypeName::FLOAT => Token::Float,
30                types::TypeName::DOUBLE => Token::Double,
31                types::TypeName::VEC2 => Token::Vec2,
32                types::TypeName::VEC3 => Token::Vec3,
33                types::TypeName::VEC4 => Token::Vec4,
34                types::TypeName::IVEC2 => Token::IVec2,
35                types::TypeName::IVEC3 => Token::IVec3,
36                types::TypeName::IVEC4 => Token::IVec4,
37                types::TypeName::BVEC2 => Token::BVec2,
38                types::TypeName::BVEC3 => Token::BVec3,
39                types::TypeName::BVEC4 => Token::BVec4,
40                types::TypeName::UINT => Token::UInt,
41                types::TypeName::ATOMIC_UINT => Token::AtomicUInt,
42                types::TypeName::UVEC2 => Token::UVec2,
43                types::TypeName::UVEC3 => Token::UVec3,
44                types::TypeName::UVEC4 => Token::UVec4,
45                types::TypeName::DVEC2 => Token::DVec2,
46                types::TypeName::DVEC3 => Token::DVec3,
47                types::TypeName::DVEC4 => Token::DVec4,
48                types::TypeName::MAT2 => Token::Mat2,
49                types::TypeName::MAT3 => Token::Mat3,
50                types::TypeName::MAT4 => Token::Mat4,
51                types::TypeName::MAT2X2 => Token::Mat2x2,
52                types::TypeName::MAT2X3 => Token::Mat2x3,
53                types::TypeName::MAT2X4 => Token::Mat2x4,
54                types::TypeName::MAT3X2 => Token::Mat3x2,
55                types::TypeName::MAT3X3 => Token::Mat3x3,
56                types::TypeName::MAT3X4 => Token::Mat3x4,
57                types::TypeName::MAT4X2 => Token::Mat4x2,
58                types::TypeName::MAT4X3 => Token::Mat4x3,
59                types::TypeName::MAT4X4 => Token::Mat4x4,
60                types::TypeName::DMAT2 => Token::DMat2,
61                types::TypeName::DMAT3 => Token::DMat3,
62                types::TypeName::DMAT4 => Token::DMat4,
63                types::TypeName::DMAT2X2 => Token::DMat2x2,
64                types::TypeName::DMAT2X3 => Token::DMat2x3,
65                types::TypeName::DMAT2X4 => Token::DMat2x4,
66                types::TypeName::DMAT3X2 => Token::DMat3x2,
67                types::TypeName::DMAT3X3 => Token::DMat3x3,
68                types::TypeName::DMAT3X4 => Token::DMat3x4,
69                types::TypeName::DMAT4X2 => Token::DMat4x2,
70                types::TypeName::DMAT4X3 => Token::DMat4x3,
71                types::TypeName::DMAT4X4 => Token::DMat4x4,
72                types::TypeName::SAMPLER1D => Token::Sampler1D,
73                types::TypeName::SAMPLER1DSHADOW => Token::Sampler1DShadow,
74                types::TypeName::SAMPLER1DARRAY => Token::Sampler1DArray,
75                types::TypeName::SAMPLER1DARRAYSHADOW => Token::Sampler1DArrayShadow,
76                types::TypeName::ISAMPLER1D => Token::ISampler1D,
77                types::TypeName::ISAMPLER1DARRAY => Token::ISampler1DArray,
78                types::TypeName::USAMPLER1D => Token::USampler1D,
79                types::TypeName::USAMPLER1DARRAY => Token::USampler1DArray,
80                types::TypeName::SAMPLER2D => Token::Sampler2D,
81                types::TypeName::SAMPLER2DSHADOW => Token::Sampler2DShadow,
82                types::TypeName::SAMPLER2DARRAY => Token::Sampler2DArray,
83                types::TypeName::SAMPLER2DARRAYSHADOW => Token::Sampler2DArrayShadow,
84                types::TypeName::ISAMPLER2D => Token::ISampler2D,
85                types::TypeName::ISAMPLER2DARRAY => Token::ISampler2DArray,
86                types::TypeName::USAMPLER2D => Token::USampler2D,
87                types::TypeName::USAMPLER2DARRAY => Token::USampler2DArray,
88                types::TypeName::SAMPLER2DRECT => Token::Sampler2DRect,
89                types::TypeName::SAMPLER2DRECTSHADOW => Token::Sampler2DRectShadow,
90                types::TypeName::ISAMPLER2DRECT => Token::ISampler2DRect,
91                types::TypeName::USAMPLER2DRECT => Token::USampler2DRect,
92                types::TypeName::SAMPLER2DMS => Token::Sampler2DMs,
93                types::TypeName::ISAMPLER2DMS => Token::ISampler2DMs,
94                types::TypeName::USAMPLER2DMS => Token::USampler2DMs,
95                types::TypeName::SAMPLER2DMSARRAY => Token::Sampler2DMsArray,
96                types::TypeName::ISAMPLER2DMSARRAY => Token::ISampler2DMsArray,
97                types::TypeName::USAMPLER2DMSARRAY => Token::USampler2DMsArray,
98                types::TypeName::SAMPLER3D => Token::Sampler3D,
99                types::TypeName::ISAMPLER3D => Token::ISampler3D,
100                types::TypeName::USAMPLER3D => Token::USampler3D,
101                types::TypeName::SAMPLERCUBE => Token::SamplerCube,
102                types::TypeName::SAMPLERCUBESHADOW => Token::SamplerCubeShadow,
103                types::TypeName::ISAMPLERCUBE => Token::ISamplerCube,
104                types::TypeName::USAMPLERCUBE => Token::USamplerCube,
105                types::TypeName::SAMPLERCUBEARRAY => Token::SamplerCubeArray,
106                types::TypeName::SAMPLERCUBEARRAYSHADOW => Token::SamplerCubeArrayShadow,
107                types::TypeName::ISAMPLERCUBEARRAY => Token::ISamplerCubeArray,
108                types::TypeName::USAMPLERCUBEARRAY => Token::USamplerCubeArray,
109                types::TypeName::SAMPLERBUFFER => Token::SamplerBuffer,
110                types::TypeName::ISAMPLERBUFFER => Token::ISamplerBuffer,
111                types::TypeName::USAMPLERBUFFER => Token::USamplerBuffer,
112                types::TypeName::IMAGE1D => Token::Image1D,
113                types::TypeName::IIMAGE1D => Token::IImage1D,
114                types::TypeName::UIMAGE1D => Token::UImage1D,
115                types::TypeName::IMAGE1DARRAY => Token::Image1DArray,
116                types::TypeName::IIMAGE1DARRAY => Token::IImage1DArray,
117                types::TypeName::UIMAGE1DARRAY => Token::UImage1DArray,
118                types::TypeName::IMAGE2D => Token::Image2D,
119                types::TypeName::IIMAGE2D => Token::IImage2D,
120                types::TypeName::UIMAGE2D => Token::UImage2D,
121                types::TypeName::IMAGE2DARRAY => Token::Image2DArray,
122                types::TypeName::IIMAGE2DARRAY => Token::IImage2DArray,
123                types::TypeName::UIMAGE2DARRAY => Token::UImage2DArray,
124                types::TypeName::IMAGE2DRECT => Token::Image2DRect,
125                types::TypeName::IIMAGE2DRECT => Token::IImage2DRect,
126                types::TypeName::UIMAGE2DRECT => Token::UImage2DRect,
127                types::TypeName::IMAGE2DMS => Token::Image2DMs,
128                types::TypeName::IIMAGE2DMS => Token::IImage2DMs,
129                types::TypeName::UIMAGE2DMS => Token::UImage2DMs,
130                types::TypeName::IMAGE2DMSARRAY => Token::Image2DMsArray,
131                types::TypeName::IIMAGE2DMSARRAY => Token::IImage2DMsArray,
132                types::TypeName::UIMAGE2DMSARRAY => Token::UImage2DMsArray,
133                types::TypeName::IMAGE3D => Token::Image3D,
134                types::TypeName::IIMAGE3D => Token::IImage3D,
135                types::TypeName::UIMAGE3D => Token::UImage3D,
136                types::TypeName::IMAGECUBE => Token::ImageCube,
137                types::TypeName::IIMAGECUBE => Token::IImageCube,
138                types::TypeName::UIMAGECUBE => Token::UImageCube,
139                types::TypeName::IMAGECUBEARRAY => Token::ImageCubeArray,
140                types::TypeName::IIMAGECUBEARRAY => Token::IImageCubeArray,
141                types::TypeName::UIMAGECUBEARRAY => Token::UImageCubeArray,
142                types::TypeName::IMAGEBUFFER => Token::ImageBuffer,
143                types::TypeName::IIMAGEBUFFER => Token::IImageBuffer,
144                types::TypeName::UIMAGEBUFFER => Token::UImageBuffer,
145                types::TypeName::TEXTURE1D => Token::Texture1D,
146                types::TypeName::TEXTURE1DARRAY => Token::Texture1DArray,
147                types::TypeName::ITEXTURE1D => Token::ITexture1D,
148                types::TypeName::ITEXTURE1DARRAY => Token::ITexture1DArray,
149                types::TypeName::UTEXTURE1D => Token::UTexture1D,
150                types::TypeName::UTEXTURE1DARRAY => Token::UTexture1DArray,
151                types::TypeName::TEXTURE2D => Token::Texture2D,
152                types::TypeName::TEXTURE2DARRAY => Token::Texture2DArray,
153                types::TypeName::ITEXTURE2D => Token::ITexture2D,
154                types::TypeName::ITEXTURE2DARRAY => Token::ITexture2DArray,
155                types::TypeName::UTEXTURE2D => Token::UTexture2D,
156                types::TypeName::UTEXTURE2DARRAY => Token::UTexture2DArray,
157                types::TypeName::TEXTURE2DRECT => Token::Texture2DRect,
158                types::TypeName::ITEXTURE2DRECT => Token::ITexture2DRect,
159                types::TypeName::UTEXTURE2DRECT => Token::UTexture2DRect,
160                types::TypeName::TEXTURE2DMS => Token::Texture2DMs,
161                types::TypeName::ITEXTURE2DMS => Token::ITexture2DMs,
162                types::TypeName::UTEXTURE2DMS => Token::UTexture2DMs,
163                types::TypeName::TEXTURE2DMSARRAY => Token::Texture2DMsArray,
164                types::TypeName::ITEXTURE2DMSARRAY => Token::ITexture2DMsArray,
165                types::TypeName::UTEXTURE2DMSARRAY => Token::UTexture2DMsArray,
166                types::TypeName::TEXTURE3D => Token::Texture3D,
167                types::TypeName::ITEXTURE3D => Token::ITexture3D,
168                types::TypeName::UTEXTURE3D => Token::UTexture3D,
169                types::TypeName::TEXTURECUBE => Token::TextureCube,
170                types::TypeName::ITEXTURECUBE => Token::ITextureCube,
171                types::TypeName::UTEXTURECUBE => Token::UTextureCube,
172                types::TypeName::TEXTURECUBEARRAY => Token::TextureCubeArray,
173                types::TypeName::ITEXTURECUBEARRAY => Token::ITextureCubeArray,
174                types::TypeName::UTEXTURECUBEARRAY => Token::UTextureCubeArray,
175                types::TypeName::TEXTUREBUFFER => Token::TextureBuffer,
176                types::TypeName::ITEXTUREBUFFER => Token::ITextureBuffer,
177                types::TypeName::UTEXTUREBUFFER => Token::UTextureBuffer,
178                types::TypeName::SAMPLER => Token::Sampler,
179                types::TypeName::SAMPLERSHADOW => Token::SamplerShadow,
180                types::TypeName::SUBPASSINPUT => Token::SubpassInput,
181                types::TypeName::ISUBPASSINPUT => Token::ISubpassInput,
182                types::TypeName::USUBPASSINPUT => Token::USubpassInput,
183                types::TypeName::SUBPASSINPUTMS => Token::SubpassInputMs,
184                types::TypeName::ISUBPASSINPUTMS => Token::ISubpassInputMs,
185                types::TypeName::USUBPASSINPUTMS => Token::USubpassInputMs,
186                other => Token::TypeName(other.to_string().into()),
187            },
188            types::Token::FLOAT_CONST(val) => Token::FloatConstant(val),
189            types::Token::INT_CONST(val) => Token::IntConstant(val),
190            types::Token::UINT_CONST(val) => Token::UIntConstant(val),
191            types::Token::BOOL_CONST(val) => Token::BoolConstant(val),
192            types::Token::DOUBLE_CONST(val) => Token::DoubleConstant(val),
193            types::Token::LEFT_OP => Token::LeftOp,
194            types::Token::RIGHT_OP => Token::RightOp,
195            types::Token::INC_OP => Token::IncOp,
196            types::Token::DEC_OP => Token::DecOp,
197            types::Token::LE_OP => Token::LeOp,
198            types::Token::GE_OP => Token::GeOp,
199            types::Token::EQ_OP => Token::EqOp,
200            types::Token::NE_OP => Token::NeOp,
201            types::Token::AND_OP => Token::AndOp,
202            types::Token::OR_OP => Token::OrOp,
203            types::Token::XOR_OP => Token::XorOp,
204            types::Token::MUL_ASSIGN => Token::MulAssign,
205            types::Token::DIV_ASSIGN => Token::DivAssign,
206            types::Token::ADD_ASSIGN => Token::AddAssign,
207            types::Token::MOD_ASSIGN => Token::ModAssign,
208            types::Token::LEFT_ASSIGN => Token::LeftAssign,
209            types::Token::RIGHT_ASSIGN => Token::RightAssign,
210            types::Token::AND_ASSIGN => Token::AndAssign,
211            types::Token::XOR_ASSIGN => Token::XorAssign,
212            types::Token::OR_ASSIGN => Token::OrAssign,
213            types::Token::SUB_ASSIGN => Token::SubAssign,
214            types::Token::LPAREN => Token::LeftParen,
215            types::Token::RPAREN => Token::RightParen,
216            types::Token::LBRACKET => Token::LeftBracket,
217            types::Token::RBRACKET => Token::RightBracket,
218            types::Token::LBRACE => Token::LeftBrace,
219            types::Token::RBRACE => Token::RightBrace,
220            types::Token::PERIOD => Token::Dot,
221            types::Token::COMMA => Token::Comma,
222            types::Token::COLON => Token::Colon,
223            types::Token::EQUAL => Token::Equal,
224            types::Token::SEMICOLON => Token::Semicolon,
225            types::Token::BANG => Token::Bang,
226            types::Token::DASH => Token::Dash,
227            types::Token::TILDE => Token::Tilde,
228            types::Token::PLUS => Token::Plus,
229            types::Token::ASTERISK => Token::Star,
230            types::Token::SLASH => Token::Slash,
231            types::Token::PERCENT => Token::Percent,
232            types::Token::LANGLE => Token::LeftAngle,
233            types::Token::RANGLE => Token::RightAngle,
234            types::Token::BAR => Token::VerticalBar,
235            types::Token::CARET => Token::Caret,
236            types::Token::AMPERSAND => Token::Ampersand,
237            types::Token::QUESTION => Token::Question,
238            types::Token::HASH => {
239                return Err((token_kind, types::token::ErrorKind::InvalidToken));
240            }
241            types::Token::CONST => Token::Const,
242            types::Token::UNIFORM => Token::Uniform,
243            types::Token::BUFFER => Token::Buffer,
244            types::Token::SHARED => Token::Shared,
245            types::Token::COHERENT => Token::Coherent,
246            types::Token::VOLATILE => Token::Volatile,
247            types::Token::RESTRICT => Token::Restrict,
248            types::Token::READONLY => Token::ReadOnly,
249            types::Token::WRITEONLY => Token::WriteOnly,
250            types::Token::LAYOUT => Token::Layout,
251            types::Token::CENTROID => Token::Centroid,
252            types::Token::FLAT => Token::Flat,
253            types::Token::SMOOTH => Token::Smooth,
254            types::Token::NOPERSPECTIVE => Token::NoPerspective,
255            types::Token::PATCH => Token::Patch,
256            types::Token::SAMPLE => Token::Sample,
257            types::Token::INVARIANT => Token::Invariant,
258            types::Token::PRECISE => Token::Precise,
259            types::Token::BREAK => Token::Break,
260            types::Token::CONTINUE => Token::Continue,
261            types::Token::DO => Token::Do,
262            types::Token::FOR => Token::For,
263            types::Token::WHILE => Token::While,
264            types::Token::SWITCH => Token::Switch,
265            types::Token::CASE => Token::Case,
266            types::Token::DEFAULT => Token::Default,
267            types::Token::IF => Token::If,
268            types::Token::ELSE => Token::Else,
269            types::Token::SUBROUTINE => Token::Subroutine,
270            types::Token::IN => Token::In,
271            types::Token::OUT => Token::Out,
272            types::Token::INOUT => Token::InOut,
273            types::Token::DISCARD => Token::Discard,
274            types::Token::RETURN => Token::Return,
275            types::Token::LOWP => Token::LowPrecision,
276            types::Token::MEDIUMP => Token::MediumPrecision,
277            types::Token::HIGHP => Token::HighPrecision,
278            types::Token::PRECISION => Token::Precision,
279            types::Token::STRUCT => Token::Struct,
280            types::Token::ATTRIBUTE => Token::Attribute,
281            types::Token::VARYING => Token::Varying,
282            types::Token::COMMON
283            | types::Token::PARTITION
284            | types::Token::ACTIVE
285            | types::Token::ASM
286            | types::Token::CLASS
287            | types::Token::UNION
288            | types::Token::ENUM
289            | types::Token::TYPEDEF
290            | types::Token::TEMPLATE
291            | types::Token::THIS
292            | types::Token::RESOURCE
293            | types::Token::GOTO
294            | types::Token::INLINE
295            | types::Token::NOINLINE
296            | types::Token::PUBLIC
297            | types::Token::STATIC
298            | types::Token::EXTERN
299            | types::Token::EXTERNAL
300            | types::Token::INTERFACE
301            | types::Token::LONG
302            | types::Token::SHORT
303            | types::Token::HALF
304            | types::Token::FIXED
305            | types::Token::UNSIGNED
306            | types::Token::SUPERP
307            | types::Token::INPUT
308            | types::Token::OUTPUT
309            | types::Token::FILTER
310            | types::Token::SIZEOF
311            | types::Token::CAST
312            | types::Token::NAMESPACE
313            | types::Token::USING => {
314                return Err((token_kind, types::token::ErrorKind::InvalidToken));
315            }
316            types::Token::WS => Token::Whitespace,
317            types::Token::COMMENT => {
318                if text.starts_with("//") {
319                    Token::SingleLineComment
320                } else {
321                    Token::MultiLineComment
322                }
323            }
324            types::Token::ERROR(kind) => {
325                return Err((token_kind, kind));
326            }
327        },
328        pos.end(),
329    ))
330}