From 7770ccf0e3d929f0db7b58b3e21eac75bc136537 Mon Sep 17 00:00:00 2001 From: William Carroll Date: Mon, 28 Feb 2022 10:51:47 -0800 Subject: feat(wpcarro/simple-select): Support basic Scanner class ...alongside a small REPL to quickly test the functionality. Change-Id: I3c2b3f060d82cd49488e00dec9b72f7b23e2b666 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5337 Reviewed-by: wpcarro Autosubmit: wpcarro Tested-by: BuildkiteCI --- users/wpcarro/scratch/simple-select/main.py | 13 +++++++++++++ users/wpcarro/scratch/simple-select/scanner.py | 27 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 users/wpcarro/scratch/simple-select/main.py create mode 100644 users/wpcarro/scratch/simple-select/scanner.py (limited to 'users/wpcarro/scratch/simple-select') diff --git a/users/wpcarro/scratch/simple-select/main.py b/users/wpcarro/scratch/simple-select/main.py new file mode 100644 index 0000000000..6a86324ef7 --- /dev/null +++ b/users/wpcarro/scratch/simple-select/main.py @@ -0,0 +1,13 @@ +from scanner import Scanner + +def tokenize(x): + s = Scanner(x) + return None + +def main(): + while True: + x = input("> ") + print(tokenize(x)) + +if __name__ == "__main__": + main() diff --git a/users/wpcarro/scratch/simple-select/scanner.py b/users/wpcarro/scratch/simple-select/scanner.py new file mode 100644 index 0000000000..96704ec1ab --- /dev/null +++ b/users/wpcarro/scratch/simple-select/scanner.py @@ -0,0 +1,27 @@ +# According to Crafting Interpreters, the only two primitives that a +# scanner/lexer needs are peek and advance; other functions (e.g. match) are +# nice-to-haves. +class Scanner(object): + def __init__(self, source): + self.i = 0 + self.source = source + + def exhausted(self): + return self.i >= len(self.source) + + def peek(self, n=0): + return self.source[self.i + n] if self.i + n < len(self.source) else '\0' + + def advance(self): + result = self.peek() + self.i += 1 + return result + + def match(self, x): + if self.exhausted(): + return False + if self.peek() == x: + self.advance() + return True + else: + return False -- cgit 1.4.1