summaryrefslogtreecommitdiff
path: root/dtc-lexer.l
diff options
context:
space:
mode:
authorDavid Gibson <dgibson@sneetch.(none)>2005-06-08 17:18:34 +1000
committerDavid Gibson <dgibson@sneetch.(none)>2005-06-08 17:18:34 +1000
commitfc14dad7692d84d5f0f547fd0456b3f98526b6cc (patch)
tree9fba031b6dfd273fcb78d23e9ff6e869cce9df97 /dtc-lexer.l
downloaddtc-fc14dad7692d84d5f0f547fd0456b3f98526b6cc.tar.gz
Initial commit
Diffstat (limited to 'dtc-lexer.l')
-rw-r--r--dtc-lexer.l140
1 files changed, 140 insertions, 0 deletions
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];
+ }
+
+%%