@@ -87,89 +87,91 @@ function* lexer(input) {
87
87
line ++ ; col = 0 ;
88
88
} ;
89
89
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 ;
163
112
break ;
164
113
default :
165
114
setTokenIf ( TOK . Line ) ;
166
115
appendTokenValue ( ) ;
167
116
}
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
+ }
169
170
170
- } // End main switch
171
- } // End for
172
- yield * emitTokenIf ( ) ;
171
+ } // End main switch
172
+ } // End for
173
+ yield * emitTokenIf ( ) ;
174
+ } // End if input
173
175
yield { type : TOK . EOF , text : '' , col, line, value : '' } ;
174
176
}
175
177
0 commit comments