From ee41c4d891520bc2506d108220583be06b1a1d39 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sat, 1 Aug 2009 05:52:04 +0000 Subject: [PATCH] lit: Fix two sh lexing bugs. - '\\\\' inside a "..." string becomes '\\'. - The '<' token wasn't being recognized. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77777 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/test/ShUtil.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/utils/test/ShUtil.py b/utils/test/ShUtil.py index 3878f5961d..76d3f585b1 100644 --- a/utils/test/ShUtil.py +++ b/utils/test/ShUtil.py @@ -2,6 +2,9 @@ import itertools import Util +# FIXME: It would be nice to at least match a few other things like `...`, $( +# ... ), $VAR, etc., if only so we can nicely say "we don't support this". + class ShLexer: def __init__(self, data): self.data = data @@ -82,9 +85,12 @@ class ShLexer: self.data) return str c = self.eat() - if c != delim: + if c == '"': # + str += '"' + elif c == '\\': str += '\\' - str += c + else: + str += '\\' + c else: str += c Util.warning("missing quote character in %r" % self.data) @@ -135,6 +141,7 @@ class ShLexer: return ('<&',) if self.maybe_eat('>'): return ('<<',) + return (c,) return self.lex_arg(c) @@ -282,8 +289,9 @@ class TestShLexer(unittest.TestCase): return list(ShLexer(str).lex()) def test_basic(self): - self.assertEqual(self.lex('a|b>c&d'), - ['a', ('|',), 'b', ('>',), 'c', ('&',), 'd']) + self.assertEqual(self.lex('a|b>c&d',), 'c', ('&',), 'd', + ('<',), 'e']) def test_redirection_tokens(self): self.assertEqual(self.lex('a2>c'), @@ -298,6 +306,8 @@ class TestShLexer(unittest.TestCase): ['hello"world']) self.assertEqual(self.lex(""" "hello\\'world" """), ["hello\\'world"]) + self.assertEqual(self.lex(""" "hello\\\\world" """), + ["hello\\world"]) self.assertEqual(self.lex(""" he"llo wo"rld """), ["hello world"]) -- 2.40.0