OVMS3/OVMS.V3/components/dbc/src/dbc_tokeniser.l

168 lines
4.9 KiB
Text

/*
; Project: Open Vehicle Monitor System
; Date: 15th November 2018
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
;
; With credit due to candbc-lexer.l, for idea and structure
; https://github.com/Polyconseil/libcanardbc
; Copyright (C) 2007-2009,2014 Andreas Heitmann
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
%{
#include <stdio.h>
#include <string.h>
#include "dbc_parser.hpp"
#define YY_NO_INPUT
#define YY_NO_UNPUT
%}
%option yylineno
%option nounput
whitespace [ \t]+
newline [\n\r]
identifier [a-zA-Z_]([_\.a-zA-Z0-9]*)?
string \"([^"\\]|(\\.))*\"
decimal [-+]?[0-9]+
hexadecimal 0x[0-9A-Fa-f]+
floatingpoint [-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)?
%%
"//"[^\n]* ;
"VERSION" { return T_VERSION; }
"BO_" { return T_BO; }
"BS_" { return T_BS; }
"BU_" { return T_BU; }
"SG_" { return T_SG; }
"EV_" { return T_EV; }
"SIG_VALTYPE_" { return T_SIG_VALTYPE; }
"NS_" { return T_NS; }
"INT" { return T_INT; }
"FLOAT" { return T_FLOAT; }
"NAN" { return T_NAN; }
"STRING" { return T_STRING; }
"ENUM" { return T_ENUM; }
"HEX" { return T_HEX; }
"NS_DESC_" { return T_NS_DESC; }
"CM_" { return T_CM; }
"BA_DEF_" { return T_BA_DEF; }
"BA_" { return T_BA; }
"VAL_" { return T_VAL; }
"CAT_DEF_" { return T_CAT_DEF; }
"CAT_" { return T_CAT; }
"FILTER" { return T_FILTER; }
"BA_DEF_DEF_" { return T_BA_DEF_DEF; }
"EV_DATA_" { return T_EV_DATA; }
"ENVVAR_DATA_" { return T_ENVVAR_DATA; }
"SGTYPE_" { return T_SGTYPE; }
"SGTYPE_VAL_" { return T_SGTYPE_VAL; }
"BA_DEF_SGTYPE_" { return T_BA_DEF_SGTYPE; }
"BA_SGTYPE_" { return T_BA_SGTYPE; }
"SIG_TYPE_REF_" { return T_SIG_TYPE_REF; }
"VAL_TABLE_" { return T_VAL_TABLE; }
"SIG_GROUP_" { return T_SIG_GROUP; }
"SIGTYPE_VALTYPE_" { return T_SIGTYPE_VALTYPE; }
"BO_TX_BU_" { return T_BO_TX_BU; }
"BA_DEF_REL_" { return T_BA_DEF_REL; }
"BA_REL_" { return T_BA_REL; }
"BA_DEF_DEF_REL_" { return T_BA_DEF_DEF_REL; }
"BU_SG_REL_" { return T_BU_SG_REL; }
"BU_EV_REL_" { return T_BU_EV_REL; }
"BU_BO_REL_" { return T_BU_BO_REL; }
"SG_MUL_VAL_" { return T_SG_MUL_VAL; }
"DUMMY_NODE_VECTOR"[0-3] {
yylval.number = yytext[17]-'0';
return T_DUMMY_NODE_VECTOR;
}
{newline} ;
{whitespace} ;
{identifier} {
yylval.string = strdup(yytext);
return T_ID;
}
{string} {
int len = strlen(yytext);
if(len>=2)
{
yylval.string = (char *) malloc (len-1);
memcpy (yylval.string, yytext+1, len-2);
yylval.string[len-2]='\0';
}
else
{
yylval.string = NULL;
}
return T_STRING_VAL;
}
{decimal} {
yylval.number = atoll(yytext);
return T_INT_VAL;
}
{hexadecimal} {
yylval.number = strtol(yytext,NULL,16);
return T_INT_VAL;
}
{floatingpoint} {
yylval.double_val = strtod(yytext, NULL);
return T_DOUBLE_VAL;
}
":" { return T_COLON; }
";" { return T_SEMICOLON; }
"|" { return T_SEP; }
"," { return T_COMMA; }
"@" { return T_AT; }
"+" { return T_PLUS; }
"-" { return T_MINUS; }
"[" { return T_BOX_OPEN; }
"]" { return T_BOX_CLOSE; }
"(" { return T_PAR_OPEN; }
")" { return T_PAR_CLOSE; }
<<EOF>> { yyterminate(); }
. { return yytext[0]; }
%%
int
yywrap()
{
return 1;
}