@@ -87,89 +87,91 @@ function* lexer(input) {
8787 line ++ ; col = 0 ;
8888 } ;
8989
90- let next = input [ 0 ] ;
91- let cur ;
92- /* Even though GLSL uses UTF-8 encoding, the actual syntactic charset is ASCII
93- So we can use JS indexed iteration (UTF-16) for a speedup compared to full Unicode iteration (for of) */
94- for ( let i = 1 ; i <= input . length ; i ++ ) {
95- cur = next ;
96- next = i < input . length ? input [ i ] : undefined ;
97- col ++ ;
98- if ( skipOne ) {
99- skipOne = false ;
100- continue ;
101- }
102- /** Current char */
103- curText = cur ;
104- switch ( cur ) {
105- case '\\' :
106- switch ( next ) {
107- case '\r' : case '\n' :
108- setTokenIf ( TOK . Line ) ;
109- appendToken ( ) ;
110- afterLineContinuation = true ;
111- break ;
112- default :
113- setTokenIf ( TOK . Line ) ;
114- appendTokenValue ( ) ;
115- }
116- break ;
117- case '\r' :
118- if ( next === '\n' ) {
119- curText += next ; skipOne = true ;
120- }
121- yield * handleEOL ( ) ;
122- break ;
123- case '\n' :
124- if ( next === '\r' ) {
125- curText += next ; skipOne = true ;
126- }
127- yield * handleEOL ( ) ;
128- break ;
129- default :
130- if ( inCommentSingleLine ) {
131- appendTokenValue ( ) ;
132- } else if ( inCommentMultiLine ) {
133- if ( cur === '*' && next === '/' ) {
134- curText += next ; skipOne = true ;
135- appendToken ( ) ;
136- yield * emitToken ( ) ;
137- inCommentMultiLine = false ;
138- } else {
139- appendTokenValue ( ) ;
140- }
141- } else {
142- switch ( cur ) {
143- case '/' :
144- switch ( next ) {
145- case '/' :
146- curText += next ; skipOne = true ;
147- yield * emitTokenIf ( ) ;
148- setToken ( TOK . Comment ) ;
149- appendToken ( ) ;
150- inCommentSingleLine = true ;
151- break ;
152- case '*' :
153- curText += next ; skipOne = true ;
154- yield * emitTokenIf ( ) ;
155- setToken ( TOK . Comment ) ;
156- appendToken ( ) ;
157- inCommentMultiLine = true ;
158- break ;
159- default :
160- setTokenIf ( TOK . Line ) ;
161- appendTokenValue ( ) ;
162- }
90+ if ( input . length > 0 ) {
91+ let next = input [ 0 ] ;
92+ let cur ;
93+ /* Even though GLSL uses UTF-8 encoding, the actual syntactic charset is ASCII
94+ So we can use JS indexed iteration (UTF-16) for a speedup compared to full Unicode iteration (for of) */
95+ for ( let i = 1 ; i <= input . length ; i ++ ) {
96+ cur = next ;
97+ next = i < input . length ? input [ i ] : undefined ;
98+ col ++ ;
99+ if ( skipOne ) {
100+ skipOne = false ;
101+ continue ;
102+ }
103+ /** Current char */
104+ curText = cur ;
105+ switch ( cur ) {
106+ case '\\' :
107+ switch ( next ) {
108+ case '\r' : case '\n' :
109+ setTokenIf ( TOK . Line ) ;
110+ appendToken ( ) ;
111+ afterLineContinuation = true ;
163112 break ;
164113 default :
165114 setTokenIf ( TOK . Line ) ;
166115 appendTokenValue ( ) ;
167116 }
168- }
117+ break ;
118+ case '\r' :
119+ if ( next === '\n' ) {
120+ curText += next ; skipOne = true ;
121+ }
122+ yield * handleEOL ( ) ;
123+ break ;
124+ case '\n' :
125+ if ( next === '\r' ) {
126+ curText += next ; skipOne = true ;
127+ }
128+ yield * handleEOL ( ) ;
129+ break ;
130+ default :
131+ if ( inCommentSingleLine ) {
132+ appendTokenValue ( ) ;
133+ } else if ( inCommentMultiLine ) {
134+ if ( cur === '*' && next === '/' ) {
135+ curText += next ; skipOne = true ;
136+ appendToken ( ) ;
137+ yield * emitToken ( ) ;
138+ inCommentMultiLine = false ;
139+ } else {
140+ appendTokenValue ( ) ;
141+ }
142+ } else {
143+ switch ( cur ) {
144+ case '/' :
145+ switch ( next ) {
146+ case '/' :
147+ curText += next ; skipOne = true ;
148+ yield * emitTokenIf ( ) ;
149+ setToken ( TOK . Comment ) ;
150+ appendToken ( ) ;
151+ inCommentSingleLine = true ;
152+ break ;
153+ case '*' :
154+ curText += next ; skipOne = true ;
155+ yield * emitTokenIf ( ) ;
156+ setToken ( TOK . Comment ) ;
157+ appendToken ( ) ;
158+ inCommentMultiLine = true ;
159+ break ;
160+ default :
161+ setTokenIf ( TOK . Line ) ;
162+ appendTokenValue ( ) ;
163+ }
164+ break ;
165+ default :
166+ setTokenIf ( TOK . Line ) ;
167+ appendTokenValue ( ) ;
168+ }
169+ }
169170
170- } // End main switch
171- } // End for
172- yield * emitTokenIf ( ) ;
171+ } // End main switch
172+ } // End for
173+ yield * emitTokenIf ( ) ;
174+ } // End if input
173175 yield { type : TOK . EOF , text : '' , col, line, value : '' } ;
174176}
175177
0 commit comments