Commit f466e539ef

Andrew Kelley <superjoe30@gmail.com>
2017-12-09 05:56:07
tokenizing libc hello world
1 parent d431b0f
Changed files (1)
src-self-hosted
src-self-hosted/main.zig
@@ -90,6 +90,10 @@ const Token = struct {
         Arrow,
         Colon,
         Slash,
+        Comma,
+        Ampersand,
+        AmpersandEqual,
+        NumberLiteral,
         Keyword_align,
         Keyword_and,
         Keyword_asm,
@@ -189,6 +193,13 @@ const Tokenizer = struct {
         Minus,
         Slash,
         LineComment,
+        Zero,
+        NumberLiteral,
+        NumberDot,
+        FloatFraction,
+        FloatExponentUnsigned,
+        FloatExponentNumber,
+        Ampersand,
     };
 
     pub fn next(self: &Tokenizer) -> Token {
@@ -241,6 +252,11 @@ const Tokenizer = struct {
                         self.index += 1;
                         break;
                     },
+                    ',' => {
+                        result.id = Token.Id.Comma;
+                        self.index += 1;
+                        break;
+                    },
                     ':' => {
                         result.id = Token.Id.Colon;
                         self.index += 1;
@@ -272,12 +288,34 @@ const Tokenizer = struct {
                     '/' => {
                         state = State.Slash;
                     },
+                    '&' => {
+                        state = State.Ampersand;
+                    },
+                    '0' => {
+                        state = State.Zero;
+                        result.id = Token.Id.NumberLiteral;
+                    },
+                    '1'...'9' => {
+                        state = State.NumberLiteral;
+                        result.id = Token.Id.NumberLiteral;
+                    },
                     else => {
                         result.id = Token.Id.Invalid;
                         self.index += 1;
                         break;
                     },
                 },
+                State.Ampersand => switch (c) {
+                    '=' => {
+                        result.id = Token.Id.AmpersandEqual;
+                        self.index += 1;
+                        break;
+                    },
+                    else => {
+                        result.id = Token.Id.Ampersand;
+                        break;
+                    },
+                },
                 State.Identifier => switch (c) {
                     'a'...'z', 'A'...'Z', '_', '0'...'9' => {},
                     else => {
@@ -353,6 +391,58 @@ const Tokenizer = struct {
                     },
                     else => {},
                 },
+                State.Zero => switch (c) {
+                    'b', 'o', 'x' => {
+                        state = State.NumberLiteral;
+                    },
+                    else => {
+                        // reinterpret as a normal number
+                        self.index -= 1;
+                        state = State.NumberLiteral;
+                    },
+                },
+                State.NumberLiteral => switch (c) {
+                    '.' => {
+                        state = State.NumberDot;
+                    },
+                    'p', 'P', 'e', 'E' => {
+                        state = State.FloatExponentUnsigned;
+                    },
+                    '0'...'9', 'a'...'f', 'A'...'F' => {},
+                    else => break,
+                },
+                State.NumberDot => switch (c) {
+                    '.' => {
+                        self.index -= 1;
+                        state = State.Start;
+                        break;
+                    },
+                    else => {
+                        self.index -= 1;
+                        state = State.FloatFraction;
+                    },
+                },
+                State.FloatFraction => switch (c) {
+                    'p', 'P', 'e', 'E' => {
+                        state = State.FloatExponentUnsigned;
+                    },
+                    '0'...'9', 'a'...'f', 'A'...'F' => {},
+                    else => break,
+                },
+                State.FloatExponentUnsigned => switch (c) {
+                    '+', '-' => {
+                        state = State.FloatExponentNumber;
+                    },
+                    else => {
+                        // reinterpret as a normal exponent number
+                        self.index -= 1;
+                        state = State.FloatExponentNumber;
+                    }
+                },
+                State.FloatExponentNumber => switch (c) {
+                    '0'...'9', 'a'...'f', 'A'...'F' => {},
+                    else => break,
+                },
             }
         }
         result.end = self.index;