You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
400 lines
15 KiB
400 lines
15 KiB
%top {
|
|
#include <cstdint>
|
|
#include <cctype>
|
|
|
|
}
|
|
%{
|
|
#include "a2lscanner.h"
|
|
#undef YY_DECL
|
|
#define YY_DECL int a2l::A2lScanner::a2llex(a2l::A2lParser::value_type* yy_value)
|
|
using token = a2l::A2lParser::token;
|
|
%}
|
|
|
|
%option prefix="a2l"
|
|
%option 8bit
|
|
%option nounistd
|
|
%option noyywrap
|
|
%option debug
|
|
%option never-interactive
|
|
%option c++
|
|
%option yyclass="a2l:A2lScanner"
|
|
%option yylineno
|
|
%option noinput
|
|
%option nounput
|
|
|
|
|
|
ws [ \t\n\v\f\r]+
|
|
signed_number [-+]?[0-9]+
|
|
unsigned_number [0-9]+
|
|
hexnumber 0[xX][0-9a-fA-F]+
|
|
float_val [-+]?[0-9]+(\.[0-9]*)?([eE][-+]?[0-9]+)?
|
|
ident [a-zA-Z_]([\[\]()/_a-zA-Z0-9.-]*)?
|
|
string (\"(\\.|[^\\"])*\")*
|
|
/* \"([^\"\\]|(\\.))*\" */
|
|
nl [\n\r]
|
|
keyword [A-Z_0-9]+
|
|
|
|
|
|
%s PRI VERSION TIMESTAMP HOSTNAME APPNAME PROCID MSGID SD SDELEMENT SDPAR SDVALUE MSG
|
|
%%
|
|
%{
|
|
yylval = yy_value;
|
|
%}
|
|
|
|
|
|
"ASAP2_VERSION" { return token::ASAP2_VERSION; }
|
|
"A2ML_VERSION" { return token::A2ML_VERSION; }
|
|
"ADDR_EPK" { return token::ADDR_EPK; }
|
|
"ADDRESS_TYPE" { return token::ADDRESS_TYPE; }
|
|
"ALIGNMENT_BYTE" { return token::ALIGNMENT_BYTE; }
|
|
"ALIGNMENT_FLOAT16_IEEE" { return token::ALIGNMENT_FLOAT16_IEEE; }
|
|
"ALIGNMENT_FLOAT32_IEEE" { return token::ALIGNMENT_FLOAT32_IEEE; }
|
|
"ALIGNMENT_FLOAT64_IEEE" { return token::ALIGNMENT_FLOAT64_IEEE; }
|
|
"ALIGNMENT_INT64" { return token::ALIGNMENT_INT64; }
|
|
"ALIGNMENT_LONG" { return token::ALIGNMENT_LONG; }
|
|
"ALIGNMENT_WORD" { return token::ALIGNMENT_WORD; }
|
|
"ANNOTATION" { return token::ANNOTATION; }
|
|
"ANNOTATION_LABEL" { return token::ANNOTATION_LABEL; }
|
|
"ANNOTATION_ORIGIN" { return token::ANNOTATION_ORIGIN; }
|
|
"ANNOTATION_TEXT" { return token::ANNOTATION_TEXT; }
|
|
"ARRAY_SIZE" { return token::ARRAY_SIZE; }
|
|
"AR_COMPONENT" { return token::AR_COMPONENT; }
|
|
"AR_PROTOTYPE_OF" { return token::AR_PROTOTYPE_OF; }
|
|
"AXIS_DESCR" { return token::AXIS_DESCR; }
|
|
"AXIS_PTS" { return token::AXIS_PTS; }
|
|
"AXIS_PTS_REF" { return token::AXIS_PTS_REF; }
|
|
"AXIS_PTS_X" { return token::AXIS_PTS_X; }
|
|
"AXIS_PTS_Y" { return token::AXIS_PTS_Y; }
|
|
"AXIS_PTS_Z" { return token::AXIS_PTS_Z; }
|
|
"AXIS_PTS_4" { return token::AXIS_PTS_4; }
|
|
"AXIS_PTS_5" { return token::AXIS_PTS_5; }
|
|
"AXIS_RESCALE_X" { return token::AXIS_RESCALE_X; }
|
|
"BIT_MASK" { return token::BIT_MASK; }
|
|
"BIT_OPERATION" { return token::BIT_OPERATION; }
|
|
"BLOB" { return token::BLOB; }
|
|
"BYTE_ORDER" { return token::A2L_BYTE_ORDER; }
|
|
"CALIBRATION_ACCESS" { return token::CALIBRATION_ACCESS; }
|
|
"CALIBRATION_HANDLE" { return token::CALIBRATION_HANDLE; }
|
|
"CALIBRATION_HANDLE_TEXT" { return token::CALIBRATION_HANDLE_TEXT; }
|
|
"CALIBRATION_METHOD" { return token::CALIBRATION_METHOD; }
|
|
"CHARACTERISTIC" { return token::CHARACTERISTIC; }
|
|
"COEFFS" { return token::COEFFS; }
|
|
"COEFFS_LINEAR" { return token::COEFFS_LINEAR; }
|
|
"COMPARISON_QUANTITY" { return token::COMPARISON_QUANTITY; }
|
|
"COMPU_METHOD" { return token::COMPU_METHOD; }
|
|
"COMPU_TAB" { return token::COMPU_TAB; }
|
|
"COMPU_TAB_REF" { return token::COMPU_TAB_REF; }
|
|
"COMPU_VTAB" { return token::COMPU_VTAB; }
|
|
"COMPU_VTAB_RANGE" { return token::COMPU_VTAB_RANGE; }
|
|
"CONSISTENT_EXCHANGE" { return token::CONSISTENT_EXCHANGE; }
|
|
"CONTROLLER_ADDRESSES" { return token::CONTROLLER_ADDRESSES; }
|
|
"CONVERSION" { return token::CONVERSION; }
|
|
"CPU_TYPE" { return token::CPU_TYPE; }
|
|
"CURVE_AXIS_REF" { return token::CURVE_AXIS_REF; }
|
|
"CUSTOMER" { return token::CUSTOMER; }
|
|
"CUSTOMER_NO" { return token::CUSTOMER_NO; }
|
|
"DATA_SIZE" { return token::DATA_SIZE; }
|
|
"DEF_CHARACTERISTIC" { return token::DEF_CHARACTERISTIC; }
|
|
"DEFAULT_VALUE" { return token::DEFAULT_VALUE; }
|
|
"DEFAULT_VALUE_NUMERIC" { return token::DEFAULT_VALUE_NUMERIC; }
|
|
"DEPENDENT_CHARACTERISTIC" { return token::DEPENDENT_CHARACTERISTIC; }
|
|
"DEPOSIT" { return token::DEPOSIT; }
|
|
"DISCRETE" { return token::DISCRETE; }
|
|
"DISPLAY_IDENTIFIER" { return token::DISPLAY_IDENTIFIER; }
|
|
"DIST_OP_X" { return token::DIST_OP_X; }
|
|
"DIST_OP_Y" { return token::DIST_OP_Y; }
|
|
"DIST_OP_Z" { return token::DIST_OP_Z; }
|
|
"DIST_OP_4" { return token::DIST_OP_4; }
|
|
"DIST_OP_5" { return token::DIST_OP_5; }
|
|
"ECU" { return token::ECU; }
|
|
"ECU_ADDRESS" { return token::ECU_ADDRESS; }
|
|
"ECU_ADDRESS_EXTENSION" { return token::ECU_ADDRESS_EXTENSION; }
|
|
"ECU_CALIBRATION_OFFSET" { return token::ECU_CALIBRATION_OFFSET; }
|
|
"ENCODING" { return token::ENCODING; }
|
|
"EPK" { return token::EPK; }
|
|
"ERROR_MASK" { return token::ERROR_MASK; }
|
|
"EXTENDED_LIMITS" { return token::EXTENDED_LIMITS; }
|
|
"FIX_AXIS_PAR" { return token::FIX_AXIS_PAR; }
|
|
"FIX_AXIS_PAR_DIST" { return token::FIX_AXIS_PAR_DIST; }
|
|
"FIX_AXIS_PAR_LIST" { return token::FIX_AXIS_PAR_LIST; }
|
|
"FIX_NO_AXIS_PTS_X" { return token::FIX_NO_AXIS_PTS_X; }
|
|
"FIX_NO_AXIS_PTS_Y" { return token::FIX_NO_AXIS_PTS_Y; }
|
|
"FIX_NO_AXIS_PTS_Z" { return token::FIX_NO_AXIS_PTS_Z; }
|
|
"FIX_NO_AXIS_PTS_4" { return token::FIX_NO_AXIS_PTS_4; }
|
|
"FIX_NO_AXIS_PTS_5" { return token::FIX_NO_AXIS_PTS_5; }
|
|
"FNC_VALUES" { return token::FNC_VALUES; }
|
|
"FORMAT" { return token::FORMAT; }
|
|
"FORMULA" { return token::FORMULA; }
|
|
"FORMULA_INV" { return token::FORMULA_INV; }
|
|
"FRAME" { return token::FRAME; }
|
|
"FRAME_MEASUREMENT" { return token::FRAME_MEASUREMENT; }
|
|
"FUNCTION" { return token::FUNCTION; }
|
|
"FUNCTION_LIST" { return token::FUNCTION_LIST; }
|
|
"FUNCTION_VERSION" { return token::FUNCTION_VERSION; }
|
|
"GROUP" { return token::GROUP; }
|
|
"GUARD_RAILS" { return token::GUARD_RAILS; }
|
|
"HEADER" { return token::HEADER; }
|
|
"IDENTIFICATION" { return token::IDENTIFICATION; }
|
|
"IN_MEASUREMENT" { return token::IN_MEASUREMENT; }
|
|
"INPUT_QUANTITY" { return token::INPUT_QUANTITY; }
|
|
"INSTANCE" { return token::INSTANCE; }
|
|
"LAYOUT" { return token::LAYOUT; }
|
|
"LEFT_SHIFT" { return token::LEFT_SHIFT; }
|
|
"LIMITS" { return token::LIMITS; }
|
|
"LOC_MEASUREMENT" { return token::LOC_MEASUREMENT; }
|
|
"MAP_LIST" { return token::MAP_LIST; }
|
|
"MATRIX_DIM" { return token::MATRIX_DIM; }
|
|
"MAX_GRAD" { return token::MAX_GRAD; }
|
|
"MAX_REFRESH" { return token::MAX_REFRESH; }
|
|
"MEASUREMENT" { return token::MEASUREMENT; }
|
|
"MEMORY_LAYOUT" { return token::MEMORY_LAYOUT; }
|
|
"MEMORY_SEGMENT" { return token::MEMORY_SEGMENT; }
|
|
"MOD_COMMON" { return token::MOD_COMMON; }
|
|
"MOD_PAR" { return token::MOD_PAR; }
|
|
"MODEL_LINK" { return token::MODEL_LINK; }
|
|
"MODULE" { return token::MODULE; }
|
|
"MONOTONY" { return token::MONOTONY; }
|
|
"NO_AXIS_PTS_X" { return token::NO_AXIS_PTS_X; }
|
|
"NO_AXIS_PTS_Y" { return token::NO_AXIS_PTS_Y; }
|
|
"NO_AXIS_PTS_Z" { return token::NO_AXIS_PTS_Z; }
|
|
"NO_AXIS_PTS_4" { return token::NO_AXIS_PTS_4; }
|
|
"NO_AXIS_PTS_5" { return token::NO_AXIS_PTS_5; }
|
|
"NO_OF_INTERFACES" { return token::NO_OF_INTERFACES; }
|
|
"NO_RESCALE_X" { return token::NO_RESCALE_X; }
|
|
"NUMBER" { return token::NUMBER; }
|
|
"OFFSET_X" { return token::OFFSET_X; }
|
|
"OFFSET_Y" { return token::OFFSET_Y; }
|
|
"OFFSET_Z" { return token::OFFSET_Z; }
|
|
"OFFSET_4" { return token::OFFSET_4; }
|
|
"OFFSET_5" { return token::OFFSET_5; }
|
|
"OUT_MEASUREMENT" { return token::OUT_MEASUREMENT; }
|
|
"OVERWRITE" { return token::OVERWRITE; }
|
|
"PHONE_NO" { return token::PHONE_NO; }
|
|
"PHYS_UNIT" { return token::PHYS_UNIT; }
|
|
"PROJECT" {
|
|
found_ = true;
|
|
return token::PROJECT;
|
|
}
|
|
"PROJECT_NO" { return token::PROJECT_NO; }
|
|
"READ_ONLY" { return token::READ_ONLY; }
|
|
"READ_WRITE" { return token::READ_WRITE; }
|
|
"RECORD_LAYOUT" { return token::RECORD_LAYOUT; }
|
|
"REF_CHARACTERISTIC" { return token::REF_CHARACTERISTIC; }
|
|
"REF_GROUP" { return token::REF_GROUP; }
|
|
"REF_MEASUREMENT" { return token::REF_MEASUREMENT; }
|
|
"REF_MEMORY_SEGMENT" { return token::REF_MEMORY_SEGMENT; }
|
|
"REF_UNIT" { return token::REF_UNIT; }
|
|
"RESERVED" { return token::RESERVED; }
|
|
"RIGHT_SHIFT" { return token::RIGHT_SHIFT; }
|
|
"RIP_ADDR_W" { return token::RIP_ADDR_W; }
|
|
"RIP_ADDR_X" { return token::RIP_ADDR_X; }
|
|
"RIP_ADDR_Y" { return token::RIP_ADDR_Y; }
|
|
"RIP_ADDR_Z" { return token::RIP_ADDR_Z; }
|
|
"RIP_ADDR_4" { return token::RIP_ADDR_4; }
|
|
"RIP_ADDR_5" { return token::RIP_ADDR_5; }
|
|
"ROOT" { return token::ROOT; }
|
|
"S_REC_LAYOUT" { return token::S_REC_LAYOUT; } /* Deprecated */
|
|
"SHIFT_OP_X" { return token::SHIFT_OP_X; }
|
|
"SHIFT_OP_Y" { return token::SHIFT_OP_Y; }
|
|
"SHIFT_OP_Z" { return token::SHIFT_OP_Z; }
|
|
"SHIFT_OP_4" { return token::SHIFT_OP_4; }
|
|
"SHIFT_OP_5" { return token::SHIFT_OP_5; }
|
|
"SIGN_EXTEND" { return token::SIGN_EXTEND; }
|
|
"SI_EXPONENTS" { return token::SI_EXPONENTS; }
|
|
"SRC_ADDR_X" { return token::SRC_ADDR_X; }
|
|
"SRC_ADDR_Y" { return token::SRC_ADDR_Y; }
|
|
"SRC_ADDR_Z" { return token::SRC_ADDR_Z; }
|
|
"SRC_ADDR_4" { return token::SRC_ADDR_4; }
|
|
"SRC_ADDR_5" { return token::SRC_ADDR_5; }
|
|
"STATIC_ADDRESS_OFFSETS" { return token::STATIC_ADDRESS_OFFSETS; }
|
|
"STATIC_RECORD_LAYOUT" { return token::STATIC_RECORD_LAYOUT; }
|
|
"STATUS_STRING_REF" { return token::STATUS_STRING_REF; }
|
|
"STEP_SIZE" { return token::STEP_SIZE; }
|
|
"STRUCTURE_COMPONENT" { return token::STRUCTURE_COMPONENT; }
|
|
"SUB_FUNCTION" { return token::SUB_FUNCTION; }
|
|
"SUB_GROUP" { return token::SUB_GROUP; }
|
|
"SUPPLIER" { return token::SUPPLIER; }
|
|
"SYMBOL_LINK" { return token::SYMBOL_LINK; }
|
|
"SYMBOL_TYPE_LINK" { return token::SYMBOL_TYPE_LINK; }
|
|
"SYSTEM_CONSTANT" { return token::SYSTEM_CONSTANT; }
|
|
"TRANSFORMER" { return token::TRANSFORMER; }
|
|
"TRANSFORMER_IN_OBJECTS" { return token::TRANSFORMER_IN_OBJECTS; }
|
|
"TRANSFORMER_OUT_OBJECTS" { return token::TRANSFORMER_OUT_OBJECTS; }
|
|
"TYPEDEF_AXIS" { return token::TYPEDEF_AXIS; }
|
|
"TYPEDEF_BLOB" { return token::TYPEDEF_BLOB; }
|
|
"TYPEDEF_CHARACTERISTIC" { return token::TYPEDEF_CHARACTERISTIC; }
|
|
"TYPEDEF_MEASUREMENT" { return token::TYPEDEF_MEASUREMENT; }
|
|
"TYPEDEF_STRUCTURE" { return token::TYPEDEF_STRUCTURE; }
|
|
"UNIT" { return token::UNIT; }
|
|
"UNIT_CONVERSION" { return token::UNIT_CONVERSION; }
|
|
"USER" { return token::USER; }
|
|
"USER_RIGHTS" { return token::USER_RIGHTS; }
|
|
"VAR_ADDRESS" { return token::VAR_ADDRESS; }
|
|
"VAR_CHARACTERISTIC" { return token::VAR_CHARACTERISTIC; }
|
|
"VAR_CRITERION" { return token::VAR_CRITERION; }
|
|
"VAR_FORBIDDEN_COMB" { return token::VAR_FORBIDDEN_COMB; }
|
|
"VAR_MEASUREMENT" { return token::VAR_MEASUREMENT; }
|
|
"VAR_NAMING" { return token::VAR_NAMING; }
|
|
"VAR_SELECTION_CHARACTERISTIC" { return token::VAR_SELECTION_CHARACTERISTIC; }
|
|
"VAR_SEPARATOR" { return token::VAR_SEPARATOR; }
|
|
"VARIANT_CODING" { return token::VARIANT_CODING; }
|
|
"VERSION" { return token::A2L_VERSION; }
|
|
"VIRTUAL" { return token::VIRTUAL; }
|
|
"VIRTUAL_CHARACTERISTIC" { return token::VIRTUAL_CHARACTERISTIC; }
|
|
|
|
"/begin"{ws}"A2ML" {
|
|
// Read in the format specification
|
|
if (yylval != nullptr) {
|
|
yylval->emplace<std::string>(ReadA2ML());
|
|
}
|
|
return token::A2ML;
|
|
}
|
|
|
|
"/begin"{ws}"IF_DATA" {
|
|
// Read in the if_data string
|
|
if (yylval != nullptr) {
|
|
yylval->emplace<std::string>(ReadIfData());
|
|
}
|
|
return token::IF_DATA;
|
|
}
|
|
"IF_DATA"{ws}"{" {
|
|
// Read in the if_data string until end of line
|
|
if(yylval != nullptr ) {
|
|
yylval->emplace<std::string>(ReadIfDataMultiLine());
|
|
}
|
|
return token::IF_DATA;
|
|
}
|
|
"IF_DATA" {
|
|
// Read in the if_data string until end of line
|
|
if (yylval != nullptr) {
|
|
yylval->emplace<std::string>(ReadIfDataSingleLine());
|
|
}
|
|
return token::IF_DATA;
|
|
}
|
|
"FUNCTION"{ws}"{" { SkipUntil('}'); }
|
|
|
|
"/begin" { return token::A2L_BEGIN; }
|
|
"/end" { return token::A2L_END; }
|
|
|
|
"/include" {
|
|
FixIncludeFile();
|
|
}
|
|
|
|
|
|
|
|
{ident} {
|
|
const std::string temp(yytext);
|
|
if (yylval != nullptr) {
|
|
yylval->emplace<std::string>(temp);
|
|
}
|
|
return token::IDENT;
|
|
}
|
|
|
|
{string} {
|
|
const size_t len = strlen(yytext);
|
|
std::string temp;
|
|
if (len > 2) {
|
|
temp = yytext + 1;
|
|
temp.pop_back();
|
|
}
|
|
yylval->emplace<std::string>(temp);
|
|
return token::STRING;
|
|
}
|
|
|
|
{hexnumber} {
|
|
uint64_t address = 0;
|
|
for ( size_t index = 0; yytext[ index ] != '\0'; ++index ) {
|
|
if ( index < 2 ) continue;
|
|
const char token = yytext[index];
|
|
switch ( token ) {
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
address *= 16;
|
|
address += token - '0';
|
|
break;
|
|
|
|
case 'A':
|
|
case 'B':
|
|
case 'C':
|
|
case 'D':
|
|
case 'E':
|
|
case 'F':
|
|
address *= 16;
|
|
address += token - 'A' + 10;
|
|
break;
|
|
|
|
case 'a':
|
|
case 'b':
|
|
case 'c':
|
|
case 'd':
|
|
case 'e':
|
|
case 'f':
|
|
address *= 16;
|
|
address += token - 'a' + 10;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
yylval->emplace<uint64_t>(address);
|
|
return token::HEX;
|
|
}
|
|
{unsigned_number} {
|
|
uint64_t temp = 0;
|
|
try {
|
|
temp = std::stoull(yytext);
|
|
} catch (const std::exception& ) {
|
|
|
|
}
|
|
yylval->emplace<uint64_t>(temp);
|
|
return token::UINT;
|
|
}
|
|
{signed_number} {
|
|
int64_t temp = 0;
|
|
try {
|
|
temp = std::stoll(yytext);
|
|
} catch (const std::exception& ) {
|
|
|
|
}
|
|
yylval->emplace<int64_t>(temp);
|
|
return token::INT;
|
|
}
|
|
{float_val} {
|
|
double temp = 0.0;
|
|
try {
|
|
temp = std::stod(yytext);
|
|
} catch (const std::exception&) {
|
|
|
|
}
|
|
yylval->emplace<double>(temp);
|
|
return token::FLOAT;
|
|
}
|
|
|
|
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] { } /* Multi line comments */
|
|
"//".* { /* Single line comment */ }
|
|
{ws} {}
|
|
. {}
|
|
<<EOF>> {
|
|
if (file_stack_.size() <= 1) {
|
|
yyterminate();
|
|
} else {
|
|
auto& last_item = file_stack_.back();
|
|
yy_delete_buffer(last_item.buffer_state);
|
|
file_stack_.pop_back();
|
|
auto& current_item = file_stack_.back();
|
|
yy_switch_to_buffer(current_item.buffer_state);
|
|
}
|
|
}
|
|
%%
|
|
|
|
|
|
|