Browse Source

§1.4 more reserved tokens.

Frederic G. MARAND 5 years ago
parent
commit
debd2ba0de
2 changed files with 99 additions and 59 deletions
  1. 82 52
      lexer/lexer_test.go
  2. 17 7
      token/token.go

+ 82 - 52
lexer/lexer_test.go

@@ -17,65 +17,95 @@ let add = fn(x, y) {
 let result = add(five, ten);
 !-/*5;
 5 < 10 > 5;
-`
+
+if (5 < 10) {
+	return true;
+}
+else {
+	return false;
+}`
 
 	tests := []struct {
 		expectedType    token.TokenType
 		expectedLiteral string
 	}{
-		{ token.LET, "let" },
-		{ token.IDENT, "five" },
-		{ token.ASSIGN, "="},
-		{ token.INT, "5" },
-		{ token.SEMICOLON, ";" },
-
-		{ token.LET, "let" },
-		{ token.IDENT, "ten" },
-		{ token.ASSIGN, "="},
-		{ token.INT, "10" },
-		{ token.SEMICOLON, ";" },
-
-		{ token.LET, "let" },
-		{ token.IDENT, "add" },
-		{ token.ASSIGN, "="},
-		{ token.FUNCTION, "fn" },
-		{ token.LPAREN, "(" },
-		{ token.IDENT, "x" },
-		{ token.COMMA, "," },
-		{ token.IDENT, "y" },
-		{ token.RPAREN, ")" },
-		{ token.LBRACE, "{" },
-		{ token.IDENT, "x" },
-		{ token.PLUS, "+" },
-		{ token.IDENT, "y" },
-		{ token.SEMICOLON, ";" },
-		{ token.RBRACE, "}" },
-
-		{ token.LET, "let" },
-		{ token.IDENT, "result" },
-		{ token.ASSIGN, "="},
-		{ token.IDENT, "add" },
-		{ token.LPAREN, "(" },
-		{ token.IDENT, "five" },
-		{ token.COMMA, "," },
-		{ token.IDENT, "ten" },
-		{ token.RPAREN, ")" },
+		{token.LET, "let"},
+		{token.IDENT, "five"},
+		{token.ASSIGN, "="},
+		{token.INT, "5"},
+		{token.SEMICOLON, ";"},
+
+		// 5
+		{token.LET, "let"},
+		{token.IDENT, "ten"},
+		{token.ASSIGN, "="},
+		{token.INT, "10"},
+		{token.SEMICOLON, ";"},
+
+		// 10
+		{token.LET, "let"},
+		{token.IDENT, "add"},
+		{token.ASSIGN, "="},
+		{token.FUNCTION, "fn"},
+		{token.LPAREN, "("},
+		{token.IDENT, "x"},
+		{token.COMMA, ","},
+		{token.IDENT, "y"},
+		{token.RPAREN, ")"},
+		{token.LBRACE, "{"},
+		{token.IDENT, "x"},
+		{token.PLUS, "+"},
+		{token.IDENT, "y"},
+		{token.SEMICOLON, ";"},
+		{token.RBRACE, "}"},
+
+		// 25
+		{token.LET, "let"},
+		{token.IDENT, "result"},
+		{token.ASSIGN, "="},
+		{token.IDENT, "add"},
+		{token.LPAREN, "("},
+		{token.IDENT, "five"},
+		{token.COMMA, ","},
+		{token.IDENT, "ten"},
+		{token.RPAREN, ")"},
+		{token.SEMICOLON, ";"},
+
+		// 35
+		{token.BANG, "!"},
+		{token.MINUS, "-"},
+		{token.SLASH, "/"},
+		{token.ASTERISK, "*"},
+		{token.INT, "5"},
 		{token.SEMICOLON, ";"},
 
-		{ token.BANG, "!" },
-		{ token.MINUS, "-" },
-		{ token.SLASH, "/" },
-		{ token.ASTERISK, "*" },
-		{ token.INT, "5" },
-		{ token.SEMICOLON, ";" },
-
-		{ token.INT, "5" },
-		{ token.LT, "<" },
-		{ token.INT, "10" },
-		{ token.GT, ">" },
-		{ token.INT, "5" },
-		{ token.SEMICOLON, ";" },
-		{ token.EOF, ""},
+		// 41
+		{token.INT, "5"},
+		{token.LT, "<"},
+		{token.INT, "10"},
+		{token.GT, ">"},
+		{token.INT, "5"},
+		{token.SEMICOLON, ";"},
+
+		// 47
+		{token.IF, "if"},
+		{token.LPAREN, "("},
+		{token.INT, "5"},
+		{token.LT, "<"},
+		{token.INT, "10"},
+		{token.RPAREN, ")"},
+		{token.LBRACE, "{"},
+		{token.RETURN, "return"},
+		{token.TRUE, "true"},
+		{token.SEMICOLON, ";"},
+		{token.RBRACE, "}"},
+		{token.ELSE, "else"},
+		{token.LBRACE, "{"},
+		{token.RETURN, "return"},
+		{token.FALSE, "false"},
+		{token.SEMICOLON, ";"},
+		{token.RBRACE, "}"},
+		{token.EOF, ""},
 	}
 
 	l := New(input)

+ 17 - 7
token/token.go

@@ -16,12 +16,12 @@ const (
 	INT   = "INT"   // 123456, ...
 
 	// Operators.
-	ASSIGN = "="
-	PLUS   = "+"
-	MINUS = "-"
-	BANG = "!"
+	ASSIGN   = "="
+	PLUS     = "+"
+	MINUS    = "-"
+	BANG     = "!"
 	ASTERISK = "*"
-	SLASH = "/"
+	SLASH    = "/"
 
 	LT = "<"
 	GT = ">"
@@ -38,11 +38,21 @@ const (
 	// Keywords
 	FUNCTION = "FUNCTION"
 	LET      = "LET"
+	TRUE     = "TRUE"
+	FALSE    = "FALSE"
+	IF       = "IF"
+	ELSE     = "ELSE"
+	RETURN   = "RETURN"
 )
 
 var keywords = map[string]TokenType{
-	"fn":  FUNCTION,
-	"let": LET,
+	"fn":     FUNCTION,
+	"let":    LET,
+	"true":   TRUE,
+	"false":  FALSE,
+	"if":     IF,
+	"else":   ELSE,
+	"return": RETURN,
 }
 
 // LookupIdent checks the keywords table to see whether the given identifier is