From eb412699b66e3bd222c6421b3cf363fb1af8fbbc Mon Sep 17 00:00:00 2001 From: William Carroll Date: Mon, 28 Feb 2022 18:02:31 -0800 Subject: feat(wpcarro/simple-select): Parse query language 🎉 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Seems to successfully handle inputs like... ``` > (-fname:"William" lname:/C.*l/) OR (fname:"William" -lname:"Carroll") ``` Change-Id: I5277cfbc7d102158eab5e1e71b2d95aaf13508fd Reviewed-on: https://cl.tvl.fyi/c/depot/+/5340 Reviewed-by: wpcarro Autosubmit: wpcarro Tested-by: BuildkiteCI --- users/wpcarro/scratch/simple-select/parser.py | 29 +++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'users/wpcarro/scratch/simple-select/parser.py') diff --git a/users/wpcarro/scratch/simple-select/parser.py b/users/wpcarro/scratch/simple-select/parser.py index 407bff61c980..d26f970e57a2 100644 --- a/users/wpcarro/scratch/simple-select/parser.py +++ b/users/wpcarro/scratch/simple-select/parser.py @@ -3,26 +3,29 @@ class Parser(object): self.tokens = tokens self.i = 0 - def prev(self): - return self.tokens[self.i - 1] + def exhausted(self): + return self.i >= len(self.tokens) - def curr(self): - return self.tokens[self.i] + def peek(self, n=0): + return self.tokens[self.i + n] - def consume(self): + def advance(self): if not self.exhausted(): self.i += 1 - return self.prev() + return self.peek(n=-1) def match(self, xs): - if not self.exhausted() and self.curr() in xs: - self.consume() + if self.peek() in xs: + self.advance() return True return False - def expect(self, xs): - if not self.match(xs): - raise Exception("Expected token \"{}\" but received \"{}\"".format(xs, self.curr())) + def test(self, predicate): + return predicate(self.tokens, self.i) - def exhausted(self): - return self.i >= len(self.tokens) + def expect(self, predicate): + if self.exhausted(): + raise Exception("Unexpected EOL") + if predicate(self.peek()): + return self.advance() + raise Exception("Unexpected token: \"{}\"".format(self.peek())) -- cgit 1.4.1