-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLexer.js
59 lines (55 loc) · 2.39 KB
/
Lexer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
export class Token{
constructor(type, val) {
this.type = type;
this.val = val;
}
}
export function lex(inputStream){
let token = null;
let char;
switch (char = inputStream.read()){
case ' ': case '\n': return lex(inputStream);
case null: token = new Token('EOP', ''); break;
case '+': token = new Token('SUM', 'ADD'); break;
case '-': token = new Token('SUM', 'SUB'); break;
case '*': token = new Token('PROD', 'MUL'); break;
case '/': token = new Token('PROD', 'DIV'); break;
case '(': token = new Token('LBR', ''); break;
case ')': token = new Token('RBR', ''); break;
case '{': token = new Token('LCB', ''); break;
case '}': token = new Token('RCB', ''); break;
case ';': token = new Token('SEM', ''); break;
case '=': token = inputStream.peek('=') ? new Token('CMP', 'EQ') : new Token('ASSN', ''); break;
case '<': token = new Token('CMP', inputStream.peek('=') ? 'LEQ' : 'LE'); break;
case '>': token = new Token('CMP', inputStream.peek('=') ? 'GEQ' : 'GE'); break;
case '!': token = inputStream.peek('=') ? new Token('CMP', 'NEQ') : new Token('LOG', 'NOT'); break;
default:
// ID
if(/^[A-Za-z]+$/.test(char)){
let val = char;
while((char = inputStream.read()) && /^[A-Za-z]+$/.test(char)) val += char;
switch (val){
case 'if': token = new Token('IF', '');break;
case 'else': token = new Token('ELSE', '');break;
case 'for': token = new Token('FOR', '');break;
case 'true': case 'false': token = new Token('BOOL', val);break;
case 'int': case 'bool': token = new Token('TYPE', val);break;
case 'function': token = new Token('FUNC', val);break;
default: token = new Token('ID', val);break;
}
}
// NUMBER
else if(/^[0-9]+$/.test(char)){
let val = char;
while((char = inputStream.read()) && /^[0-9]+$/.test(char)) val += char;
token = new Token('NUM', val);
}
// ERROR
else{
console.error(`Lexer Unresolved symbol: ${char}`)
}
inputStream.unread();
break;
}
return token;
}