diff --git a/src/gherkin_lexer.xrl b/src/gherkin_lexer.xrl
new file mode 100644
index 0000000000000000000000000000000000000000..9882f1dbd15ac84e619b3ff0bb6b68ac1c16bb98
--- /dev/null
+++ b/src/gherkin_lexer.xrl
@@ -0,0 +1,37 @@
+Definitions.
+
+FEATURE = [Ff]eature:
+BACKGROUND = \n\s+[Bb]ackground:
+SCENARIO = \n\s+[Ss]cenario:
+SCENARIO_OUTLINE = \n\s+[Ss]cenario\s[Oo]utline:
+GIVEN = \n\s+[Gg]iven\s
+WHEN = \n\s+[Ww]hen\s
+THEN = \n\s+[Tt]hen\s
+AND = \n\s+[Aa]nd\s
+BUT = \n\s+[Bb]ut\s
+VAR = <[0-9a-zA-Z_]+>
+N = (\r|\n|\r\n)
+W = [\x{21}-\x{7b}\x{7d}-\x{ffff}]
+
+Rules.
+
+{FEATURE} : {token, {feature, TokenLine}}.
+{BACKGROUND} : {token, {background, TokenLine}}.
+{SCENARIO} : {token, {scenario, TokenLine}}.
+{SCENARIO_OUTLINE} : {token, {scenario_outline, TokenLine}}.
+{GIVEN} : {token, {given, TokenLine}}.
+{WHEN} : {token, {'when', TokenLine}}.
+{THEN} : {token, {then, TokenLine}}.
+{AND} : {token, {'and', TokenLine}}.
+{BUT} : {token, {but, TokenLine}}.
+{VAR} : {token, {var, TokenLine, TokenChars}}.
+""" : {token, {docstring, TokenLine}}.
+\x{7c}({W}|\s)+\x{7c} : {token, {cell, TokenLine, string:strip(string:strip(TokenChars, both, $|), both, 32)}, "|"}.
+\x{7c}{N} : {token, {newline, TokenLine}}.
+"({W}|\s)+" : {token, {word, TokenLine, TokenChars}}.
+@{W}+ : {token, {tag, TokenLine, TokenChars}}.
+{W}+ : {token, {word, TokenLine, TokenChars}}.
+\s+ : {token, {space, TokenLine, TokenChars}}.
+{N} : {token, {newline, TokenLine}}.
+
+Erlang code.