diff options
author | William Carroll <wpcarro@gmail.com> | 2022-02-28T18·51-0800 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2022-02-28T18·55+0000 |
commit | 7770ccf0e3d929f0db7b58b3e21eac75bc136537 (patch) | |
tree | c62e66d7080ae80f6876dd1d83997ed26ecb56fc | |
parent | 72b46e8fe80d9c8c708602387b4d46cce6bb266d (diff) |
feat(wpcarro/simple-select): Support basic Scanner class r/3879
...alongside a small REPL to quickly test the functionality. Change-Id: I3c2b3f060d82cd49488e00dec9b72f7b23e2b666 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5337 Reviewed-by: wpcarro <wpcarro@gmail.com> Autosubmit: wpcarro <wpcarro@gmail.com> Tested-by: BuildkiteCI
-rw-r--r-- | users/wpcarro/scratch/simple-select/main.py | 13 | ||||
-rw-r--r-- | users/wpcarro/scratch/simple-select/scanner.py | 27 |
2 files changed, 40 insertions, 0 deletions
diff --git a/users/wpcarro/scratch/simple-select/main.py b/users/wpcarro/scratch/simple-select/main.py new file mode 100644 index 000000000000..6a86324ef73f --- /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 000000000000..96704ec1ab3c --- /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 |