Skip to content

Commit 5970d20

Browse files
committed
Улучшен лексер
1 parent 4cb076c commit 5970d20

File tree

1 file changed

+36
-23
lines changed

1 file changed

+36
-23
lines changed

src/com/annimon/ownlang/parser/Lexer.java

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,31 @@ public final class Lexer {
5555
OPERATORS.put(">>", TokenType.GTGT);
5656
OPERATORS.put(">>>", TokenType.GTGTGT);
5757
}
58+
59+
private static final Map<String, TokenType> KEYWORDS;
60+
static {
61+
KEYWORDS = new HashMap<String, TokenType>();
62+
KEYWORDS.put("print", TokenType.PRINT);
63+
KEYWORDS.put("println", TokenType.PRINTLN);
64+
KEYWORDS.put("if", TokenType.IF);
65+
KEYWORDS.put("else", TokenType.ELSE);
66+
KEYWORDS.put("while", TokenType.WHILE);
67+
KEYWORDS.put("for", TokenType.FOR);
68+
KEYWORDS.put("do", TokenType.DO);
69+
KEYWORDS.put("break", TokenType.BREAK);
70+
KEYWORDS.put("continue", TokenType.CONTINUE);
71+
KEYWORDS.put("def", TokenType.DEF);
72+
KEYWORDS.put("return", TokenType.RETURN);
73+
KEYWORDS.put("use", TokenType.USE);
74+
KEYWORDS.put("match", TokenType.MATCH);
75+
KEYWORDS.put("case", TokenType.CASE);
76+
}
5877

5978
private final String input;
6079
private final int length;
6180

6281
private final List<Token> tokens;
82+
private final StringBuilder buffer;
6383

6484
private int pos;
6585
private int row, col;
@@ -69,6 +89,7 @@ public Lexer(String input) {
6989
length = input.length();
7090

7191
tokens = new ArrayList<>();
92+
buffer = new StringBuilder();
7293
row = col = 1;
7394
}
7495

@@ -93,7 +114,7 @@ else if (OPERATOR_CHARS.indexOf(current) != -1) {
93114
}
94115

95116
private void tokenizeNumber() {
96-
final StringBuilder buffer = new StringBuilder();
117+
clearBuffer();
97118
char current = peek(0);
98119
while (true) {
99120
if (current == '.') {
@@ -108,7 +129,7 @@ private void tokenizeNumber() {
108129
}
109130

110131
private void tokenizeHexNumber() {
111-
final StringBuilder buffer = new StringBuilder();
132+
clearBuffer();
112133
char current = peek(0);
113134
while (Character.isDigit(current) || isHexNumber(current)) {
114135
buffer.append(current);
@@ -136,7 +157,7 @@ private void tokenizeOperator() {
136157
return;
137158
}
138159
}
139-
final StringBuilder buffer = new StringBuilder();
160+
clearBuffer();
140161
while (true) {
141162
final String text = buffer.toString();
142163
if (!OPERATORS.containsKey(text + current) && !text.isEmpty()) {
@@ -149,7 +170,7 @@ private void tokenizeOperator() {
149170
}
150171

151172
private void tokenizeWord() {
152-
final StringBuilder buffer = new StringBuilder();
173+
clearBuffer();
153174
char current = peek(0);
154175
while (true) {
155176
if (!Character.isLetterOrDigit(current) && (current != '_') && (current != '$')) {
@@ -160,37 +181,25 @@ private void tokenizeWord() {
160181
}
161182

162183
final String word = buffer.toString();
163-
switch (word) {
164-
case "print": addToken(TokenType.PRINT); break;
165-
case "println": addToken(TokenType.PRINTLN); break;
166-
case "if": addToken(TokenType.IF); break;
167-
case "else": addToken(TokenType.ELSE); break;
168-
case "while": addToken(TokenType.WHILE); break;
169-
case "for": addToken(TokenType.FOR); break;
170-
case "do": addToken(TokenType.DO); break;
171-
case "break": addToken(TokenType.BREAK); break;
172-
case "continue": addToken(TokenType.CONTINUE); break;
173-
case "def": addToken(TokenType.DEF); break;
174-
case "return": addToken(TokenType.RETURN); break;
175-
case "use": addToken(TokenType.USE); break;
176-
case "match": addToken(TokenType.MATCH); break;
177-
case "case": addToken(TokenType.CASE); break;
178-
default:
179-
addToken(TokenType.WORD, word);
180-
break;
184+
if (KEYWORDS.containsKey(word)) {
185+
addToken(KEYWORDS.get(word));
186+
} else {
187+
addToken(TokenType.WORD, word);
181188
}
182189
}
183190

184191
private void tokenizeText() {
185192
next();// skip "
186-
final StringBuilder buffer = new StringBuilder();
193+
clearBuffer();
187194
char current = peek(0);
188195
while (true) {
189196
if (current == '\0') throw error("Reached end of file while parsing text string.");
190197
if (current == '\\') {
191198
current = next();
192199
switch (current) {
193200
case '"': current = next(); buffer.append('"'); continue;
201+
case 'b': current = next(); buffer.append('\b'); continue;
202+
case 'f': current = next(); buffer.append('\f'); continue;
194203
case 'n': current = next(); buffer.append('\n'); continue;
195204
case 't': current = next(); buffer.append('\t'); continue;
196205
}
@@ -224,6 +233,10 @@ private void tokenizeMultilineComment() {
224233
next(); // /
225234
}
226235

236+
private void clearBuffer() {
237+
buffer.setLength(0);
238+
}
239+
227240
private char next() {
228241
pos++;
229242
final char result = peek(0);

0 commit comments

Comments
 (0)