2013-07-26 14:22:18 +02:00
|
|
|
/*
|
|
|
|
Copyright (c) 2013, Matthias Schiffer <mschiffer@universe-factory.net>
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
|
|
modification, are permitted provided that the following conditions are met:
|
|
|
|
|
|
|
|
1. Redistributions of source code must retain the above copyright notice,
|
|
|
|
this list of conditions and the following disclaimer.
|
|
|
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
|
|
this list of conditions and the following disclaimer in the documentation
|
|
|
|
and/or other materials provided with the distribution.
|
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
|
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
|
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
|
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
|
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
%option prefix="mmss_config_yy"
|
|
|
|
%option noyywrap
|
|
|
|
%option nounput
|
|
|
|
%option noinput
|
|
|
|
%option bison-bridge
|
|
|
|
%option bison-locations
|
|
|
|
%option reentrant
|
|
|
|
%option warn
|
|
|
|
|
|
|
|
|
|
|
|
%top {
|
|
|
|
#include <config.yy.hpp>
|
2013-07-28 22:12:35 +02:00
|
|
|
|
|
|
|
#include <cassert>
|
|
|
|
#include <cstdio>
|
2013-07-26 14:22:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
%s NEEDSPACE
|
|
|
|
%s STRING
|
|
|
|
%s COMMENT
|
|
|
|
|
|
|
|
%%
|
|
|
|
%{
|
|
|
|
#define UPDATE_LOCATION do { \
|
|
|
|
yylloc->first_line = yylloc->last_line; \
|
|
|
|
yylloc->first_column = yylloc->last_column+1; \
|
|
|
|
yylloc->last_column += yyleng; \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define TOKEN(tok) do { UPDATE_LOCATION; BEGIN(NEEDSPACE); return tok; } while (0)
|
|
|
|
%}
|
|
|
|
|
|
|
|
<INITIAL>{
|
2013-07-29 21:00:11 +02:00
|
|
|
[0-9]+ { UPDATE_LOCATION; yylval->num = std::atoi(yytext); BEGIN(NEEDSPACE); return TOK_INTEGER; }
|
|
|
|
[0-9]*\.[0-9]+ { UPDATE_LOCATION; yylval->fnum = float(std::atof(yytext)); BEGIN(NEEDSPACE); return TOK_FLOAT; }
|
2013-07-26 14:22:18 +02:00
|
|
|
|
|
|
|
yes { TOKEN(TOK_YES); }
|
|
|
|
no { TOKEN(TOK_NO); }
|
|
|
|
network { TOKEN(TOK_NETWORK); }
|
2013-07-28 22:12:35 +02:00
|
|
|
protocol { TOKEN(TOK_PROTOCOL); }
|
|
|
|
node { TOKEN(TOK_NODE); }
|
|
|
|
load { TOKEN(TOK_LOAD); }
|
|
|
|
default { TOKEN(TOK_DEFAULT); }
|
|
|
|
interface { TOKEN(TOK_INTERFACE); }
|
|
|
|
address { TOKEN(TOK_ADDRESS); }
|
2013-07-29 21:00:11 +02:00
|
|
|
etx { TOKEN(TOK_ETX); }
|
|
|
|
const { TOKEN(TOK_CONST); }
|
|
|
|
min { TOKEN(TOK_MIN); }
|
|
|
|
max { TOKEN(TOK_MAX); }
|
|
|
|
sine { TOKEN(TOK_SINE); }
|
|
|
|
period { TOKEN(TOK_PERIOD); }
|
|
|
|
phase { TOKEN(TOK_PHASE); }
|
2013-07-28 22:12:35 +02:00
|
|
|
|
|
|
|
([[:xdigit:]]{2}:){7}[[:xdigit:]]{2} {
|
|
|
|
UPDATE_LOCATION;
|
|
|
|
|
|
|
|
assert(std::sscanf(yytext, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
|
|
|
|
&yylval->addr.d[0], &yylval->addr.d[1], &yylval->addr.d[2], &yylval->addr.d[3],
|
|
|
|
&yylval->addr.d[4], &yylval->addr.d[5], &yylval->addr.d[6], &yylval->addr.d[7]) == 8);
|
|
|
|
|
|
|
|
return TOK_GMRF_ADDRESS;
|
|
|
|
}
|
2013-07-26 14:22:18 +02:00
|
|
|
|
|
|
|
[;:\{\}] { UPDATE_LOCATION; return yytext[0]; }
|
|
|
|
|
|
|
|
[ \t] { yylloc->last_column++; }
|
|
|
|
\n { yylloc->last_column = 0; yylloc->last_line++; }
|
|
|
|
\r ;
|
|
|
|
}
|
|
|
|
|
2013-07-29 21:00:11 +02:00
|
|
|
<INITIAL,NEEDSPACE>{
|
|
|
|
s { TOKEN(TOK_S); }
|
|
|
|
m { TOKEN(TOK_M); }
|
|
|
|
h { TOKEN(TOK_H); }
|
|
|
|
days { TOKEN(TOK_DAYS); }
|
|
|
|
}
|
|
|
|
|
2013-07-26 14:22:18 +02:00
|
|
|
<NEEDSPACE>{
|
|
|
|
[;:\{\}] { UPDATE_LOCATION; BEGIN(INITIAL); return yytext[0]; }
|
|
|
|
|
|
|
|
[ \t] { yylloc->last_column++; BEGIN(INITIAL); }
|
|
|
|
\n { yylloc->last_column = 0; yylloc->last_line++; BEGIN(INITIAL); }
|
|
|
|
\r ;
|
|
|
|
}
|
|
|
|
|
|
|
|
<INITIAL>\" { UPDATE_LOCATION; BEGIN(STRING); }
|
|
|
|
<STRING>[^"\\\n\r] { yylloc->last_column++; yymore(); }
|
|
|
|
<STRING>\n { yylloc->last_line++; yylloc->last_column = 0; yymore(); }
|
|
|
|
<STRING>\r { yymore(); }
|
|
|
|
<STRING>\\. { yylloc->last_column+=2; yymore(); }
|
|
|
|
<STRING>\\\n { yylloc->last_line++; yylloc->last_column = 0; yymore(); }
|
|
|
|
<STRING>\" {
|
|
|
|
int i, esc = 0;
|
|
|
|
|
|
|
|
for (i = 0; i < yyleng; i++) {
|
|
|
|
if (yytext[i] == '\\') {
|
|
|
|
i++;
|
|
|
|
if (yytext[i] == '\n') {
|
|
|
|
esc+=2;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
yytext[i-esc-1] = yytext[i];
|
|
|
|
esc++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(esc) {
|
|
|
|
yytext[i-esc] = yytext[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
yytext[yyleng-esc-1] = 0;
|
2013-07-26 17:45:15 +02:00
|
|
|
yylval->str = strdup(yytext);
|
2013-07-26 14:22:18 +02:00
|
|
|
BEGIN(NEEDSPACE);
|
|
|
|
yylloc->last_column++;
|
|
|
|
return TOK_STRING;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
<INITIAL,NEEDSPACE>#.* { yylloc->last_column += yyleng; }
|
|
|
|
<INITIAL,NEEDSPACE>\/\/.* { yylloc->last_column += yyleng; }
|
|
|
|
|
|
|
|
<INITIAL,NEEDSPACE>\/\* { UPDATE_LOCATION; BEGIN(COMMENT); }
|
|
|
|
<COMMENT>\*\/ { yylloc->last_column += yyleng; BEGIN(INITIAL); }
|
|
|
|
<COMMENT>[^\n\r] { yylloc->last_column++; }
|
|
|
|
<COMMENT>\n { yylloc->last_line++; yylloc->last_column = 0; }
|
|
|
|
<COMMENT>\r {}
|
|
|
|
|
|
|
|
. {
|
|
|
|
yylloc->first_line = yylloc->last_line;
|
|
|
|
yylloc->first_column = yylloc->last_column+1;
|
|
|
|
yylval->error = "syntax error";
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
<INITIAL><<EOF>> { return 0; }
|
|
|
|
<COMMENT><<EOF>> { yylval->error = "unterminated block comment"; return -1; }
|
|
|
|
<STRING><<EOF>> { yylval->error = "unterminated string"; return -1; }
|
|
|
|
%%
|