Accept underscores in integers
diff --git a/lexer.go b/lexer.go
index 7cb789b..b8ba2ed 100644
--- a/lexer.go
+++ b/lexer.go
@@ -527,6 +527,8 @@
 			}
 		} else if isDigit(next) {
 			digitSeen = true
+		} else if next == '_' {
+			l.pos++
 		} else {
 			l.backup()
 			break
diff --git a/lexer_test.go b/lexer_test.go
index d1cd130..37535e5 100644
--- a/lexer_test.go
+++ b/lexer_test.go
@@ -434,6 +434,27 @@
 		token{Position{1, 7}, tokenFloat, "-4.2"},
 		token{Position{1, 11}, tokenEOF, ""},
 	})
+
+	testFlow(t, "foo = 1_000", []token{
+		token{Position{1, 1}, tokenKey, "foo"},
+		token{Position{1, 5}, tokenEqual, "="},
+		token{Position{1, 7}, tokenInteger, "1_000"},
+		token{Position{1, 12}, tokenEOF, ""},
+	})
+
+	testFlow(t, "foo = 5_349_221", []token{
+		token{Position{1, 1}, tokenKey, "foo"},
+		token{Position{1, 5}, tokenEqual, "="},
+		token{Position{1, 7}, tokenInteger, "5_349_221"},
+		token{Position{1, 16}, tokenEOF, ""},
+	})
+
+	testFlow(t, "foo = 1_2_3_4_5", []token{
+		token{Position{1, 1}, tokenKey, "foo"},
+		token{Position{1, 5}, tokenEqual, "="},
+		token{Position{1, 7}, tokenInteger, "1_2_3_4_5"},
+		token{Position{1, 16}, tokenEOF, ""},
+	})
 }
 
 func TestMultiline(t *testing.T) {
diff --git a/parser.go b/parser.go
index e550967..59f513b 100644
--- a/parser.go
+++ b/parser.go
@@ -224,7 +224,8 @@
 	case tokenFalse:
 		return false
 	case tokenInteger:
-		val, err := strconv.ParseInt(tok.val, 10, 64)
+		cleanedVal := strings.Replace(tok.val, "_", "", -1)
+		val, err := strconv.ParseInt(cleanedVal, 10, 64)
 		if err != nil {
 			p.raiseError(tok, "%s", err)
 		}
diff --git a/parser_test.go b/parser_test.go
index 2998913..9bdf9b2 100644
--- a/parser_test.go
+++ b/parser_test.go
@@ -68,6 +68,23 @@
 	})
 }
 
+func TestIntegersWithUnderscores(t *testing.T) {
+	tree, err := Load("a = 1_000")
+	assertTree(t, tree, err, map[string]interface{}{
+		"a": int64(1000),
+	})
+
+	tree, err = Load("a = 5_349_221")
+	assertTree(t, tree, err, map[string]interface{}{
+		"a": int64(5349221),
+	})
+
+	tree, err = Load("a = 1_2_3_4_5")
+	assertTree(t, tree, err, map[string]interface{}{
+		"a": int64(12345),
+	})
+}
+
 func TestFloatsWithExponents(t *testing.T) {
 	tree, err := Load("a = 5e+22\nb = 5E+22\nc = -5e+22\nd = -5e-22\ne = 6.626e-34")
 	assertTree(t, tree, err, map[string]interface{}{