diff options
Diffstat (limited to 'users/wpcarro/scratch/simple-select/parser.py')
-rw-r--r-- | users/wpcarro/scratch/simple-select/parser.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/users/wpcarro/scratch/simple-select/parser.py b/users/wpcarro/scratch/simple-select/parser.py new file mode 100644 index 000000000000..d26f970e57a2 --- /dev/null +++ b/users/wpcarro/scratch/simple-select/parser.py @@ -0,0 +1,31 @@ +class Parser(object): + def __init__(self, tokens): + self.tokens = tokens + self.i = 0 + + def exhausted(self): + return self.i >= len(self.tokens) + + def peek(self, n=0): + return self.tokens[self.i + n] + + def advance(self): + if not self.exhausted(): + self.i += 1 + return self.peek(n=-1) + + def match(self, xs): + if self.peek() in xs: + self.advance() + return True + return False + + def test(self, predicate): + return predicate(self.tokens, self.i) + + 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())) |