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:
parent
72b46e8fe8
commit
7770ccf0e3
2 changed files with 40 additions and 0 deletions
13
users/wpcarro/scratch/simple-select/main.py
Normal file
13
users/wpcarro/scratch/simple-select/main.py
Normal 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()
|
27
users/wpcarro/scratch/simple-select/scanner.py
Normal file
27
users/wpcarro/scratch/simple-select/scanner.py
Normal 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
|
Loading…
Reference in a new issue