Skip to content

Commit 21ed735

Browse files
committed
Parser: fix
1 parent 3c57beb commit 21ed735

File tree

1 file changed

+79
-77
lines changed

1 file changed

+79
-77
lines changed

src/lib/parse.js

Lines changed: 79 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)