about summary refs log tree commit diff
path: root/users/wpcarro
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2022-02-28T18·51-0800
committerclbot <clbot@tvl.fyi>2022-02-28T18·55+0000
commit7770ccf0e3d929f0db7b58b3e21eac75bc136537 (patch)
treec62e66d7080ae80f6876dd1d83997ed26ecb56fc /users/wpcarro
parent72b46e8fe80d9c8c708602387b4d46cce6bb266d (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
Diffstat (limited to 'users/wpcarro')
-rw-r--r--users/wpcarro/scratch/simple-select/main.py13
-rw-r--r--users/wpcarro/scratch/simple-select/scanner.py27
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