Initial commit
diff --git a/dtc-lexer.l b/dtc-lexer.l
new file mode 100644
index 0000000..02283a9
--- /dev/null
+++ b/dtc-lexer.l
@@ -0,0 +1,140 @@
+/*
+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
+ *
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  General Public License for more details.
+ *                                                                       
+ *  You should have received a copy of the GNU General Public License    
+ *  along with this program; if not, write to the Free Software          
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 
+ *                                                                   USA 
+ */
+
+%option noyywrap
+
+%x CELLDATA
+%x BYTESTRING
+
+PROPCHAR	[a-zA-Z0-9,._+*#?-]
+UNITCHAR	[0-9a-f,]
+WS		[ \t\n]
+
+%%
+
+%{
+#include "dtc.h"
+
+#include "y.tab.h"
+
+#undef LEXDEBUG	1
+
+%}
+
+\"[^"]*\"	{
+#ifdef LEXDEBUG
+			fprintf(stderr, "String: %s\n", yytext);
+#endif
+			yylval.data = data_copy_escape_string(yytext+1,
+					yyleng-2);
+			return DT_STRING;
+		}
+
+<CELLDATA>[0-9a-fA-F]+	{
+			if (yyleng > 2*sizeof(yylval.cval)) {
+				fprintf(stderr,
+					"Cell value %s too long\n", yytext);
+			}
+			yylval.cval = strtol(yytext, NULL, 16);
+#ifdef LEXDEBUG
+			fprintf(stderr, "Cell: %x\n", yylval.cval);
+#endif
+			return DT_CELL;
+		}
+
+<CELLDATA>">"	{
+#ifdef LEXDEBUG
+			fprintf(stderr, "/CELLDATA\n");
+#endif
+			BEGIN(INITIAL);
+			return '>';
+		}
+
+<BYTESTRING>[0-9a-fA-F]{2} {
+			yylval.byte = strtol(yytext, NULL, 16);
+#ifdef LEXDEBUG
+			fprintf(stderr, "Byte: %02x\n", (int)yylval.byte);
+#endif
+			return DT_BYTE;
+		}
+
+<BYTESTRING>"]"	{
+#ifdef LEXDEBUG
+			fprintf(stderr, "/BYTESTRING\n");
+#endif
+			BEGIN(INITIAL);
+			return ']';
+		}
+
+{PROPCHAR}+(@{UNITCHAR}+)?/{WS}*\{ {
+#ifdef LEXDEBUG
+			fprintf(stderr, "NodeName: %s\n", yytext);
+#endif
+			yylval.str = strdup(yytext);
+			return DT_NODENAME;
+		}
+
+{PROPCHAR}+	{
+#ifdef LEXDEBUG
+			fprintf(stderr, "PropName: %s\n", yytext);
+#endif
+			yylval.str = strdup(yytext);
+			return DT_PROPNAME;
+		}
+
+
+<*>{WS}+	/* eat whitespace */
+
+<*>"/*"([^*]|\*+[^*/])*\*+"/"	{
+#ifdef LEXDEBUG
+			fprintf(stderr, "Comment: %s\n", yytext);
+			/* eat comments */
+#endif
+		}
+
+<*>"//".*\n	/* eat line comments */
+
+.		{
+			switch (yytext[0]) {
+				case '<':
+#ifdef LEXDEBUG
+					fprintf(stderr, "CELLDATA\n");
+#endif
+					BEGIN(CELLDATA);
+					break;
+				case '[':
+#ifdef LEXDEBUG
+					fprintf(stderr, "BYTESTRING\n");
+#endif
+					BEGIN(BYTESTRING);
+					break;
+				default:
+
+#ifdef LEXDEBUG
+			fprintf(stderr, "Char: %c (\\x%02x)\n", yytext[0],
+				(unsigned)yytext[0]);
+#endif
+					break;
+			}
+
+			return yytext[0];
+		}
+
+%%