From 0a2894f07a2c97390341b306618f86087c474677 Mon Sep 17 00:00:00 2001 From: Ilja Date: Mon, 25 Jul 2022 01:21:02 +0200 Subject: [PATCH] Fix bug when starting with $-sign When a text token was running, it wouldn't stop on a $-sign if it wasn't followed with a "[". This is good. But when a token was finished and the next char was a $-sign, it would consider it an MFMOpen, even when not followed by a "[". This is now fixed. --- lib/lexer.ex | 23 ++++++++++++++++++----- lib/reader.ex | 9 +++++++++ test/lexer_test.exs | 9 +++++++++ test/reader_test.exs | 7 +++++++ 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/lib/lexer.ex b/lib/lexer.ex index d648f9f..54e86a9 100644 --- a/lib/lexer.ex +++ b/lib/lexer.ex @@ -31,11 +31,24 @@ defmodule MfmParser.Lexer do defp get_empty_token(input) do case Reader.peek(input) do - :eof -> :eof - "$" -> %MFM.Open{} - "]" -> %MFM.Close{} - "\n" -> %Newline{} - _ -> %Text{} + :eof -> + :eof + + "$" -> + if Reader.peek(input, 2) == "[" do + %MFM.Open{} + else + %Text{} + end + + "]" -> + %MFM.Close{} + + "\n" -> + %Newline{} + + _ -> + %Text{} end end diff --git a/lib/reader.ex b/lib/reader.ex index 89569b2..d614833 100644 --- a/lib/reader.ex +++ b/lib/reader.ex @@ -8,6 +8,15 @@ defmodule MfmParser.Reader do end end + def peek(input, steps) do + nth_char = input |> String.at(steps - 1) + + case nth_char do + nil -> :eof + _ -> nth_char + end + end + def next(input) do {next_char, rest} = String.split_at(input, 1) diff --git a/test/lexer_test.exs b/test/lexer_test.exs index f8eb0db..177f261 100644 --- a/test/lexer_test.exs +++ b/test/lexer_test.exs @@ -57,6 +57,15 @@ defmodule MfmParser.LexerTest do assert Lexer.peek("Eyes like $$") == %Text{content: "Eyes like $$"} assert Lexer.next("Eyes like $$") == {%Text{content: "Eyes like $$"}, ""} + + assert Lexer.peek("$2 chocolatine") == %Text{content: "$2 chocolatine"} + assert Lexer.next("$2 chocolatine") == {%Text{content: "$2 chocolatine"}, ""} + + assert Lexer.peek("$2") == %Text{content: "$2"} + assert Lexer.next("$2") == {%Text{content: "$2"}, ""} + + assert Lexer.peek("$") == %Text{content: "$"} + assert Lexer.next("$") == {%Text{content: "$"}, ""} end test "it ends when a mfm token closes" do diff --git a/test/reader_test.exs b/test/reader_test.exs index 9de4a32..32aa6b3 100644 --- a/test/reader_test.exs +++ b/test/reader_test.exs @@ -6,12 +6,19 @@ defmodule MfmParser.ReaderTest do assert Reader.peek("chocolatine") == "c" end + test "it can peek at the nth character" do + assert Reader.peek("chocolatine", 7) == "a" + end + test "it step to the next character" do assert Reader.next("chocolatine") == {"c", "hocolatine"} end test "it returns eof" do assert Reader.peek("") == :eof + assert Reader.peek("", 1) == :eof + assert Reader.peek("", 2) == :eof + assert Reader.peek("c", 3) == :eof assert Reader.next("") == :eof end end