diff options
author | David Gibson <dgibson@sneetch.(none)> | 2005-06-08 17:18:34 +1000 |
---|---|---|
committer | David Gibson <dgibson@sneetch.(none)> | 2005-06-08 17:18:34 +1000 |
commit | fc14dad7692d84d5f0f547fd0456b3f98526b6cc (patch) | |
tree | 9fba031b6dfd273fcb78d23e9ff6e869cce9df97 /dtc-lexer.l | |
download | dtc-fc14dad7692d84d5f0f547fd0456b3f98526b6cc.tar.gz |
Initial commit
Diffstat (limited to 'dtc-lexer.l')
-rw-r--r-- | dtc-lexer.l | 140 |
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]; + } + +%% |