diff --git a/assets/test_prelude.ld b/assets/test_prelude.ld index 521b8b9..9813042 100644 --- a/assets/test_prelude.ld +++ b/assets/test_prelude.ld @@ -378,8 +378,9 @@ fn chars/safe { fn ws? { "Tells if a string is a whitespace character." (" ") -> true - ("\n") -> true ("\t") -> true + ("\n") -> true + ("\r") -> true (_) -> false } diff --git a/pkg/rudus.js b/pkg/rudus.js index 0c725ac..c4921c7 100644 --- a/pkg/rudus.js +++ b/pkg/rudus.js @@ -425,7 +425,7 @@ function __wbg_get_imports() { _assertBoolean(ret); return ret; }; - imports.wbg.__wbindgen_closure_wrapper7777 = function() { return logError(function (arg0, arg1, arg2) { + imports.wbg.__wbindgen_closure_wrapper7787 = function() { return logError(function (arg0, arg1, arg2) { const ret = makeMutClosure(arg0, arg1, 347, __wbg_adapter_22); return ret; }, arguments) }; diff --git a/pkg/rudus_bg.wasm b/pkg/rudus_bg.wasm index 43067b0..e6e1cfd 100644 Binary files a/pkg/rudus_bg.wasm and b/pkg/rudus_bg.wasm differ diff --git a/src/lexer.rs b/src/lexer.rs index 9d2ce40..8b6d566 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -68,7 +68,19 @@ pub fn lexer( let keyword = just(':').ignore_then(word).map(Token::Keyword); + let escape = just('\\') + .then(choice(( + just('\\'), + just('"'), + just('n').to('\n'), + just('t').to('\t'), + just('r').to('\r'), + ))) + .ignored(); + let string = none_of("\\\"") + .ignored() + .or(escape) .repeated() .to_slice() .map(Token::String) @@ -104,3 +116,37 @@ pub fn lexer( .repeated() .collect() } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_lexes_nil() { + let spanned_toks = lexer().parse("nil").into_output_errors().0.unwrap(); + let (token, _) = spanned_toks[0].clone(); + assert_eq!(token, Token::Nil); + } + + #[test] + fn it_lexes_strings() { + let spanned_toks = lexer() + .parse("\"foo bar baz\"") + .into_output_errors() + .0 + .unwrap(); + let (token, _) = spanned_toks[0].clone(); + assert_eq!(token, Token::String("foo bar baz")); + } + + #[test] + fn it_lexes_strings_w_escaped_quotes() { + let spanned_toks = lexer() + .parse("\"foo \\\"bar baz\"") + .into_output_errors() + .0 + .unwrap(); + let (token, _) = spanned_toks[0].clone(); + assert_eq!(token, Token::String("foo \\\"bar baz")); + } +}