From 3ef86bfba2e4d3b7736c3c1f89ba2e6ac1366d44 Mon Sep 17 00:00:00 2001 From: Wenhao Ji Date: Wed, 28 Sep 2016 23:50:55 +0800 Subject: [PATCH] Fix a bug of tokenizing identifiers that contain numbers --- .../me/predatorray/bud/lisp/lexer/Lexer.java | 2 +- .../bud/lisp/BudInterpreterTest.java | 5 +++++ .../predatorray/bud/lisp/lexer/LexerTest.java | 22 ++++++++++++++----- .../me/predatorray/bud/lisp/fibonacci.bud | 7 ++++++ 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/me/predatorray/bud/lisp/fibonacci.bud diff --git a/src/main/java/me/predatorray/bud/lisp/lexer/Lexer.java b/src/main/java/me/predatorray/bud/lisp/lexer/Lexer.java index 93427c8..bf94fe0 100644 --- a/src/main/java/me/predatorray/bud/lisp/lexer/Lexer.java +++ b/src/main/java/me/predatorray/bud/lisp/lexer/Lexer.java @@ -197,7 +197,7 @@ public Token next() { if (isWhiteSpace(currChar)) { return new Atmosphere(getCurrentCharLocation()); } - if (PREFIXES_OF_NUMBER.contains(currChar)) { + if (symbolValue.length() == 0 && PREFIXES_OF_NUMBER.contains(currChar)) { numberValue.append(currChar); state = TokenizerState.WITHIN_NUMBER; numberLocation = location.clone(); diff --git a/src/test/java/me/predatorray/bud/lisp/BudInterpreterTest.java b/src/test/java/me/predatorray/bud/lisp/BudInterpreterTest.java index b8dac8d..efcc606 100644 --- a/src/test/java/me/predatorray/bud/lisp/BudInterpreterTest.java +++ b/src/test/java/me/predatorray/bud/lisp/BudInterpreterTest.java @@ -72,4 +72,9 @@ public void testDoubleNumberList() throws Exception { new BudNumber(new BigDecimal(4)), new BudNumber(new BigDecimal(6)))), "double-number-list.bud"); } + + @Test + public void testFibonacci() throws Exception { + assertInterpretCorrectly(new BudNumber(new BigDecimal("573147844013817084101")), "fibonacci.bud"); + } } diff --git a/src/test/java/me/predatorray/bud/lisp/lexer/LexerTest.java b/src/test/java/me/predatorray/bud/lisp/lexer/LexerTest.java index ac56c38..d5c633e 100644 --- a/src/test/java/me/predatorray/bud/lisp/lexer/LexerTest.java +++ b/src/test/java/me/predatorray/bud/lisp/lexer/LexerTest.java @@ -21,7 +21,7 @@ private void assertMatches(List expectedTokens, String input) { } @Test - public void testLexer1() { + public void testNormalApplication() { assertMatches(Arrays.asList( new LeftParenthesis(new TextLocation(1, 1)), new IdentifierToken("+", new TextLocation(1, 2)), @@ -34,7 +34,7 @@ public void testLexer1() { } @Test - public void testLexer2() { + public void testApplyingEscapedString() { assertMatches(Arrays.asList( new LeftParenthesis(new TextLocation(1, 1)), new IdentifierToken("foobar", new TextLocation(1, 2)), @@ -45,7 +45,7 @@ public void testLexer2() { } @Test - public void testLexer3() { + public void testMultipleIdentifiers() { assertMatches(Arrays.asList( new Atmosphere(new TextLocation(1, 1)), new NumberToken(new BigDecimal(123), new TextLocation(2, 1)), @@ -59,7 +59,7 @@ public void testLexer3() { } @Test - public void testLexer4() { + public void testBoolean() { assertMatches(Arrays.asList(new BooleanToken(true, new TextLocation(1, 1)), new Atmosphere(new TextLocation(1, 3)), new BooleanToken(false, new TextLocation(1, 4))), @@ -67,8 +67,20 @@ public void testLexer4() { } @Test - public void testLexer5() { + public void testCharacter() { assertMatches(Collections.singletonList(new CharacterToken((char) 1, new TextLocation(1, 1))), "#\\001"); } + + @Test + public void testNumber() { + assertMatches(Collections.singletonList(new NumberToken(new BigDecimal("0.123"), new TextLocation(1, 1))), + ".123"); + } + + @Test + public void testIdentifierContainingNumber() { + assertMatches(Collections.singletonList(new IdentifierToken("fib0", new TextLocation(1, 1))), + "fib0"); + } } diff --git a/src/test/resources/me/predatorray/bud/lisp/fibonacci.bud b/src/test/resources/me/predatorray/bud/lisp/fibonacci.bud new file mode 100644 index 0000000..41e4e00 --- /dev/null +++ b/src/test/resources/me/predatorray/bud/lisp/fibonacci.bud @@ -0,0 +1,7 @@ +((lambda (x) + (define (fibonacci x a b) + (if (> x 0) + (fibonacci (- x 1) b (+ a b)) + b)) + (fibonacci x 0 1) +) 100)