From bc3eb871320566f6a22e07e85c96e03e68f8918b Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Fri, 30 Dec 2011 15:15:17 -0800 Subject: allow hyphen in variable names --- src/lexer.cc | 40 ++++++++++++++++++++++++---------------- src/lexer.in.cc | 4 ++-- src/lexer_test.cc | 4 +++- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/lexer.cc b/src/lexer.cc index 40d7def..d3ef43f 100644 --- a/src/lexer.cc +++ b/src/lexer.cc @@ -109,7 +109,7 @@ Lexer::Token Lexer::ReadToken() { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 192, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 160, 128, + 128, 128, 128, 128, 128, 160, 160, 128, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 128, 128, 128, 128, 128, 128, 128, 160, 160, 160, 160, 160, 160, 160, @@ -140,7 +140,7 @@ Lexer::Token Lexer::ReadToken() { yych = *p; if (yych <= 'Z') { - if (yych <= '-') { + if (yych <= ',') { if (yych <= 0x1F) { if (yych <= 0x00) goto yy21; if (yych == '\n') goto yy4; @@ -455,7 +455,7 @@ bool Lexer::ReadIdent(string* out) { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 128, 0, + 0, 0, 0, 0, 0, 128, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, @@ -486,7 +486,7 @@ bool Lexer::ReadIdent(string* out) { yych = *p; if (yych <= '@') { if (yych <= '.') { - if (yych <= '-') goto yy83; + if (yych <= ',') goto yy83; } else { if (yych <= '/') goto yy83; if (yych >= ':') goto yy83; @@ -543,7 +543,7 @@ bool Lexer::ReadEvalString(EvalString* eval, bool path, string* err) { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 16, 128, 128, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 160, 128, + 128, 128, 128, 128, 128, 224, 160, 128, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 0, 128, 128, 128, 128, 128, 128, 224, 224, 224, 224, 224, 224, 224, @@ -610,27 +610,35 @@ yy91: } yy93: ++p; - if ((yych = *p) <= '9') { + if ((yych = *p) <= '/') { if (yych <= ' ') { if (yych == '\n') goto yy106; if (yych <= 0x1F) goto yy97; goto yy99; } else { - if (yych == '$') goto yy101; - if (yych <= '/') goto yy97; - goto yy103; + if (yych <= '$') { + if (yych <= '#') goto yy97; + goto yy101; + } else { + if (yych == '-') goto yy103; + goto yy97; + } } } else { - if (yych <= '_') { + if (yych <= '^') { + if (yych <= '9') goto yy103; if (yych <= '@') goto yy97; if (yych <= 'Z') goto yy103; - if (yych <= '^') goto yy97; - goto yy103; - } else { - if (yych <= '`') goto yy97; - if (yych <= 'z') goto yy103; - if (yych <= '{') goto yy105; goto yy97; + } else { + if (yych <= '`') { + if (yych <= '_') goto yy103; + goto yy97; + } else { + if (yych <= 'z') goto yy103; + if (yych <= '{') goto yy105; + goto yy97; + } } } { diff --git a/src/lexer.in.cc b/src/lexer.in.cc index c5d73e1..4d6d132 100644 --- a/src/lexer.in.cc +++ b/src/lexer.in.cc @@ -106,8 +106,8 @@ Lexer::Token Lexer::ReadToken() { re2c:yyfill:enable = 0; nul = "\000"; - simple_varname = [a-zA-Z0-9_]+; - varname = [a-zA-Z0-9_.]+; + simple_varname = [a-zA-Z0-9_-]+; + varname = [a-zA-Z0-9_.-]+; "#"[^\000\n]*"\n" { continue; } [\n] { token = NEWLINE; break; } diff --git a/src/lexer_test.cc b/src/lexer_test.cc index ce8082a..44d1d04 100644 --- a/src/lexer_test.cc +++ b/src/lexer_test.cc @@ -39,7 +39,7 @@ TEST(Lexer, ReadEvalStringEscapes) { } TEST(Lexer, ReadIdent) { - Lexer lexer("foo baR baz_123 blah.dots"); + Lexer lexer("foo baR baz_123 foo-bar"); string ident; EXPECT_TRUE(lexer.ReadIdent(&ident)); EXPECT_EQ("foo", ident); @@ -47,6 +47,8 @@ TEST(Lexer, ReadIdent) { EXPECT_EQ("baR", ident); EXPECT_TRUE(lexer.ReadIdent(&ident)); EXPECT_EQ("baz_123", ident); + EXPECT_TRUE(lexer.ReadIdent(&ident)); + EXPECT_EQ("foo-bar", ident); } TEST(Lexer, ReadIdentCurlies) { -- cgit v0.12