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 <wpcarro@gmail.com>
Autosubmit: wpcarro <wpcarro@gmail.com>
Tested-by: BuildkiteCI
This commit is contained in:
William Carroll 2022-02-28 10:51:47 -08:00 committed by clbot
parent 72b46e8fe8
commit 7770ccf0e3
2 changed files with 40 additions and 0 deletions

View file

@ -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()

View file

@ -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