From efd76ff778c0b7b1f8cb9e0485bb9b4b62b149a7 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 8 Sep 2015 12:37:39 +0200 Subject: Implement single quote support --- tests/lexer/buildfile | 4 +++- tests/lexer/driver.cxx | 54 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 48 insertions(+), 10 deletions(-) (limited to 'tests') diff --git a/tests/lexer/buildfile b/tests/lexer/buildfile index 3aca207..a6976cf 100644 --- a/tests/lexer/buildfile +++ b/tests/lexer/buildfile @@ -2,4 +2,6 @@ # copyright : Copyright (c) 2014-2015 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file -exe{driver}: cxx{driver ../../../build/{lexer diagnostics utility}} +import libs = libbutl%lib{butl} + +exe{driver}: cxx{driver ../../build/{lexer diagnostics utility}} $libs diff --git a/tests/lexer/driver.cxx b/tests/lexer/driver.cxx index f77656d..fb5efc3 100644 --- a/tests/lexer/driver.cxx +++ b/tests/lexer/driver.cxx @@ -14,11 +14,14 @@ using namespace std; using namespace build; -typedef vector tokens; +using tokens = vector; static tokens lex (const char*); +ostream& +operator<< (ostream&, const tokens&); + int main () { @@ -54,10 +57,28 @@ main () assert (lex ("fo\\ o\\:") == tokens ({"fo o:", ""})); assert (lex ("foo\\\nbar") == tokens ({"foo\nbar", ""})); assert (lex ("foo \\\nbar") == tokens ({"foo", "bar", ""})); + assert (lex ("\\'foo") == tokens ({"'foo", ""})); assert (lex (" \\") == tokens ({""})); assert (lex (" foo\\") == tokens ({""})); + + // Quoting. + // + assert (lex ("''") == tokens ({"", ""})); + assert (lex ("'foo'") == tokens ({"foo", ""})); + assert (lex ("'foo bar'") == tokens ({"foo bar", ""})); + assert (lex ("'foo 'bar") == tokens ({"foo bar", ""})); + assert (lex ("foo' bar'") == tokens ({"foo bar", ""})); + assert (lex ("'foo ''bar'") == tokens ({"foo bar", ""})); + assert (lex ("foo' 'bar") == tokens ({"foo bar", ""})); + assert (lex ("'foo\nbar'") == tokens ({"foo\nbar", ""})); + assert (lex ("'#:${}()=+\n'") == tokens ({"#:${}()=+\n", ""})); + assert (lex ("'\"'") == tokens ({"\"", ""})); + assert (lex ("'\\'") == tokens ({"\\", ""})); + + assert (lex ("'foo bar") == tokens ({""})); + // Combinations. // assert (lex ("foo: bar") == tokens ({"foo", ":", "bar", ""})); @@ -87,21 +108,27 @@ lex (const char* s) { for (token t (l.next ());; t = l.next ()) { - const char* v (nullptr); + string v; switch (t.type ()) { - case token_type::eos: v= ""; break; - case token_type::newline: v = "\n"; break; - case token_type::colon: v = ":"; break; - case token_type::lcbrace: v = "{"; break; - case token_type::rcbrace: v = "}"; break; - case token_type::name: v = t.name ().c_str (); break; + case token_type::eos: v = ""; break; + case token_type::newline: v = "\n"; break; + case token_type::pair_separator: v = l.pair_separator (); break; + case token_type::colon: v = ":"; break; + case token_type::lcbrace: v = "{"; break; + case token_type::rcbrace: v = "}"; break; + case token_type::equal: v = "="; break; + case token_type::plus_equal: v = "+="; break; + case token_type::dollar: v = "$"; break; + case token_type::lparen: v = "("; break; + case token_type::rparen: v = ")"; break; + case token_type::name: v = t.name ().c_str (); break; } // cerr << t.line () << ':' << t.column () << ':' << v << endl; - r.push_back (v); + r.push_back (move (v)); if (t.type () == token_type::eos) break; @@ -118,3 +145,12 @@ lex (const char* s) return r; } + +ostream& +operator<< (ostream& os, const tokens& ts) +{ + for (const string& t: ts) + os << '"' << t << '"' << ' '; + + return os; +} -- cgit v1.1