summaryrefslogtreecommitdiff
path: root/src/main/smp/sys/scan.smp
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-08-10 11:11:18 -0700
committerCliff Click <cliffc@acm.org>2026-10-19 14:56:14 -0700
commit495c3fb44ff91c75f9258e5a34a8fbe5dcdbff9c (patch)
tree8085242d90310d32e1dc34d5e5b8fbfb9c81d439 /src/main/smp/sys/scan.smp
parentf613348651956d68e225ffc184dd6eabaea5326a (diff)
downloadSimple-495c3fb44ff91c75f9258e5a34a8fbe5dcdbff9c.tar.gz
Simple-495c3fb44ff91c75f9258e5a34a8fbe5dcdbff9c.zip
Chapter 25: Modules, Separate Compilation, and SSA Constructionlinear
Co-authored-by: Hsiang-Ying Fu <66062782+fuhsnn@users.noreply.github.com> Co-authored-by: fuhsnn <66062782+fuhsnn@users.noreply.github.com> Co-authored-by: Symious <14933944+symious@users.noreply.github.com> Co-authored-by: Jun Kawasaki <jun784@gmail.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'src/main/smp/sys/scan.smp')
-rw-r--r--src/main/smp/sys/scan.smp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/main/smp/sys/scan.smp b/src/main/smp/sys/scan.smp
new file mode 100644
index 00000000..44bedaaa
--- /dev/null
+++ b/src/main/smp/sys/scan.smp
@@ -0,0 +1,39 @@
+
+// Scanner; a simple string parser.
+struct scan {
+ int !x; // Cursor
+ bool !bad; // True after a malformed token
+ u8[~] buf; // Buffer to parse
+
+ new scan = { u8[~] b -> buf = b; };
+
+ // Skip whitespace
+ val skip = { ->
+ while( x < buf# && buf[x] <= ' ' )
+ x++;
+ return self;
+ };
+
+ // True if find required character, and skip it; else False.
+ val match = { u8 c ->
+ skip();
+ if( x >= buf# ) return false;
+ if( buf[x] != c ) return false;
+ x++;
+ return true;
+ };
+
+ // Parse a simple number
+ val number = { ->
+ skip();
+ bool neg = match('-');
+ if( x >= buf# || buf[x] < '0' || '9' < buf[x] ) {
+ bad = true;
+ return 0;
+ }
+ i64 n = 0;
+ while( x < buf# && '0' <= buf[x] & buf[x] <= '9' )
+ n = n*10 + (buf[x++] - '0');
+ return neg ? -n : n;
+ };
+};