Add single and multi-line comments
This commit is contained in:
parent
da91a5df33
commit
27b128a6ea
@ -52,7 +52,6 @@ public class Lexer {
|
|||||||
case ']': emitToken(RIGHT_BRACKET); break;
|
case ']': emitToken(RIGHT_BRACKET); break;
|
||||||
case '=': emitToken(EQUALS); break;
|
case '=': emitToken(EQUALS); break;
|
||||||
case '*': emitToken(TIMES); break;
|
case '*': emitToken(TIMES); break;
|
||||||
case '/': emitToken(DIVIDE); break;
|
|
||||||
case '^': emitToken(POWER); break;
|
case '^': emitToken(POWER); break;
|
||||||
|
|
||||||
case '+':
|
case '+':
|
||||||
@ -71,6 +70,16 @@ public class Lexer {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case '/':
|
||||||
|
if (matchChar('/')) {
|
||||||
|
singleLineComment();
|
||||||
|
} else if (matchChar('*')) {
|
||||||
|
multiLineComment();
|
||||||
|
} else {
|
||||||
|
emitToken(DIVIDE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (isAsciiDigit(current)) {
|
if (isAsciiDigit(current)) {
|
||||||
number();
|
number();
|
||||||
@ -82,6 +91,16 @@ public class Lexer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void singleLineComment() {
|
||||||
|
matchWhile(c -> c != '\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
private void multiLineComment() {
|
||||||
|
while (!(matchChar('*') && matchChar('/'))) {
|
||||||
|
popChar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void number() {
|
private void number() {
|
||||||
matchWhile(Lexer::isAsciiDigit);
|
matchWhile(Lexer::isAsciiDigit);
|
||||||
if (matchChar('.') && matchWhile(Lexer::isAsciiDigit) == 0) {
|
if (matchChar('.') && matchWhile(Lexer::isAsciiDigit) == 0) {
|
||||||
|
@ -14,9 +14,9 @@ public class LexerTest {
|
|||||||
final Lexer lexer = new Lexer(
|
final Lexer lexer = new Lexer(
|
||||||
"reduction TestRule_123:\n" +
|
"reduction TestRule_123:\n" +
|
||||||
" x + y * z = -(a_123 +- 3 / 2.2) -> [\n" +
|
" x + y * z = -(a_123 +- 3 / 2.2) -> [\n" +
|
||||||
" x^a_123 = cos(pi) - log(e, e),\n" +
|
" x^a_123 = cos(pi) - log(e, e), // comment\n" +
|
||||||
" undefined,\n" +
|
" undefined, /*\n" +
|
||||||
"]\n"
|
"comment */ ]\n"
|
||||||
);
|
);
|
||||||
final List<Token> expected = Arrays.asList(
|
final List<Token> expected = Arrays.asList(
|
||||||
new Token(REDUCTION, "reduction", 0),
|
new Token(REDUCTION, "reduction", 0),
|
||||||
@ -54,10 +54,10 @@ public class LexerTest {
|
|||||||
new Token(E, "e", 94),
|
new Token(E, "e", 94),
|
||||||
new Token(RIGHT_PAREN, ")", 95),
|
new Token(RIGHT_PAREN, ")", 95),
|
||||||
new Token(COMMA, ",", 96),
|
new Token(COMMA, ",", 96),
|
||||||
new Token(UNDEFINED, "undefined", 102),
|
new Token(UNDEFINED, "undefined", 113),
|
||||||
new Token(COMMA, ",", 111),
|
new Token(COMMA, ",", 122),
|
||||||
new Token(RIGHT_BRACKET, "]", 113),
|
new Token(RIGHT_BRACKET, "]", 138),
|
||||||
new Token(EOF, "", 115)
|
new Token(EOF, "", 140)
|
||||||
);
|
);
|
||||||
assertEquals(expected, lexer.lex());
|
assertEquals(expected, lexer.lex());
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user