Initial Contribution
diff --git a/sh/token.h b/sh/token.h
new file mode 100644
index 0000000..c961f01
--- /dev/null
+++ b/sh/token.h
@@ -0,0 +1,112 @@
+#define TEOF 0
+#define TNL 1
+#define TSEMI 2
+#define TBACKGND 3
+#define TAND 4
+#define TOR 5
+#define TPIPE 6
+#define TLP 7
+#define TRP 8
+#define TENDCASE 9
+#define TENDBQUOTE 10
+#define TREDIR 11
+#define TWORD 12
+#define TIF 13
+#define TTHEN 14
+#define TELSE 15
+#define TELIF 16
+#define TFI 17
+#define TWHILE 18
+#define TUNTIL 19
+#define TFOR 20
+#define TDO 21
+#define TDONE 22
+#define TBEGIN 23
+#define TEND 24
+#define TCASE 25
+#define TESAC 26
+#define TNOT 27
+
+/* Array indicating which tokens mark the end of a list */
+const char tokendlist[] = {
+	1,
+	0,
+	0,
+	0,
+	0,
+	0,
+	0,
+	0,
+	1,
+	1,
+	1,
+	0,
+	0,
+	0,
+	1,
+	1,
+	1,
+	1,
+	0,
+	0,
+	0,
+	1,
+	1,
+	0,
+	1,
+	0,
+	1,
+	0,
+};
+
+const char *const tokname[] = {
+	"end of file",
+	"newline",
+	"\";\"",
+	"\"&\"",
+	"\"&&\"",
+	"\"||\"",
+	"\"|\"",
+	"\"(\"",
+	"\")\"",
+	"\";;\"",
+	"\"`\"",
+	"redirection",
+	"word",
+	"\"if\"",
+	"\"then\"",
+	"\"else\"",
+	"\"elif\"",
+	"\"fi\"",
+	"\"while\"",
+	"\"until\"",
+	"\"for\"",
+	"\"do\"",
+	"\"done\"",
+	"\"{\"",
+	"\"}\"",
+	"\"case\"",
+	"\"esac\"",
+	"\"!\"",
+};
+
+#define KWDOFFSET 13
+
+const char *const parsekwd[] = {
+	"if",
+	"then",
+	"else",
+	"elif",
+	"fi",
+	"while",
+	"until",
+	"for",
+	"do",
+	"done",
+	"{",
+	"}",
+	"case",
+	"esac",
+	"!",
+	0
+};