dect
/
dectmon
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
dectmon/src/cmd-scanner.l

200 lines
4.2 KiB
Plaintext

%{
#include <stdint.h>
#include <cli.h>
#include "cmd-parser.h"
static void init_pos(struct parser_state *state)
{
state->lineno = 1;
state->column = 1;
state->token_offset = 0;
state->line_offset = 0;
}
static void update_pos(struct parser_state *state, struct location *loc,
int len)
{
loc->first_line = state->lineno;
loc->first_column = state->column;
loc->last_column = state->column + len - 1;
state->column += len;
}
static void update_offset(struct parser_state *state, struct location *loc,
unsigned int len)
{
state->token_offset += len;
loc->token_offset = state->token_offset;
loc->line_offset = state->line_offset;
}
static void reset_pos(struct parser_state *state, struct location *loc)
{
state->line_offset = state->token_offset;
state->lineno += 1;
state->column = 1;
loc->line_offset = state->line_offset;
}
#define YY_USER_ACTION { \
update_pos(yyget_extra(yyscanner), yylloc, yyleng); \
update_offset(yyget_extra(yyscanner), yylloc, yyleng); \
}
/* avoid warnings with -Wmissing-prototypes */
extern int yyget_column(yyscan_t);
extern void yyset_column(int, yyscan_t);
%}
%option reentrant
%option noyywrap
%option nounput
%option bison-bridge
%option bison-locations
%option debug
%option yylineno
%option nodefault
%option warn
%option case-insensitive
space [ ]
tab \t
newline \n
digit [0-9]
hexdigit [0-9a-fA-F]
decstring {digit}+
hexstring 0[xX]{hexdigit}+
range ({decstring}?:{decstring}?)
letter [a-zA-Z]
string ({letter})({letter}|{digit}|[/\-_\.])*
quotedstring \"[^"]*\"
comment #.*$
slash \/
%%
"(" { return '('; }
")" { return ')'; }
"=" { return '='; }
"," { return ','; }
"debug" { return TOK_DEBUG; }
"cluster" { return CLUSTER; }
"portable" { return PORTABLE; }
"tbc" { return TBC; }
"show" { return SHOW; }
"set" { return SET; }
"on" { return ON; }
"off" { return OFF; }
"lce" { return LCE; }
"cc" { return CC; }
"ss" { return SS; }
"clms" { return CLMS; }
"mm" { return MM; }
"llme" { return LLME; }
"MNCC_SETUP-req" { return MNCC_SETUP_REQ; }
"MNCC_INFO-req" { return MNCC_INFO_REQ; }
"MNSS_FACILITY-req" { return MNSS_FACILITY_REQ; }
"portable-identity" { return PORTABLE_IDENTITY; }
"sending-complete" { return SENDING_COMPLETE; }
"keypad" { return KEYPAD; }
"basic-service" { return BASIC_SERVICE; }
"escape-to-proprietary" { return ESCAPE_TO_PROPRIETARY; }
"IPEI" { return IPEI; }
"info" { return INFO; }
"service" { return SERVICE; }
"class" { return CLASS; }
"LIA" { return LIA; }
"message" { return MESSAGE; }
"dect/isdn" { return DECT_ISDN; }
"normal" { return NORMAL; }
"internal" { return INTERNAL; }
"emergency" { return EMERGENCY; }
"external-handover" { return EXTERNAL_HO; }
"QA&M" { return QA_M; }
"basic-speech" { return BASIC_SPEECH; }
"GSM" { return GSM; }
"UMTS" { return UMTS; }
"LRMS" { return LRMS; }
"GSM-SMS" { return GSM_SMS; }
"wideband-speech" { return WIDEBAND_SPEECH; }
"SUOTA-class-4" { return SUOTA_CLASS_4; }
"SUOTA-class-3" { return SUOTA_CLASS_3; }
"other" { return OTHER; }
"EMC" { return EMC; }
"content" { return CONTENT; }
{string} {
yylval->string = strdup(yytext);
return STRING;
}
{quotedstring} {
yylval->string = strndup(yytext + 1, yyleng - 2);
return STRING;
}
{decstring} {
yylval->val = strtoul(yytext, NULL, 0);
return NUMBER;
}
\\{newline} {
reset_pos(yyget_extra(yyscanner), yylloc);
}
{newline} {
reset_pos(yyget_extra(yyscanner), yylloc);
return NEWLINE;
}
{space}+
. { return JUNK; }
%%
void scanner_push_buffer(void *scanner, const char *buffer)
{
struct parser_state *state = yyget_extra(scanner);
YY_BUFFER_STATE b;
if (state->buffer_state != NULL)
yy_delete_buffer(state->buffer_state, scanner);
b = yy_scan_string(buffer, scanner);
state->buffer_state = b;
init_pos(state);
}
void *scanner_init(struct parser_state *state)
{
yyscan_t scanner;
yylex_init(&scanner);
yyset_extra(state, scanner);
yyset_out(NULL, scanner);
return scanner;
}
void scanner_destroy(struct parser_state *scanner)
{
struct parser_state *state = yyget_extra(scanner);
if (state->buffer_state != NULL)
yy_delete_buffer(state->buffer_state, scanner);
yylex_destroy(scanner);
}