1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * Command format string lexer for CLI backend.
6 * Copyright (C) 2015 Cumulus Networks, Inc.
15 /* ignore flex generated code in static analyzer */
16 #ifndef __clang_analyzer__
18 /* ignore harmless bugs in old versions of flex */
19 #pragma GCC diagnostic ignored "-Wsign-compare"
20 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
22 #include "lib/command_parse.h"
24 #define YY_USER_ACTION yylloc->last_column += yyleng;
25 #define LOC_STEP do { if (yylloc) { \
26 yylloc->first_column = yylloc->last_column; \
27 yylloc->first_line = yylloc->last_line; \
32 IPV4_PREFIX A\.B\.C\.D\/M
34 IPV6_PREFIX X:X::X:X\/M
36 MAC_PREFIX X:X:X:X:X:X\/M
37 VARIABLE [A-Z][-_A-Z:0-9]+
38 WORD (\-|\+)?[a-zA-Z0-9\*][-+_a-zA-Z0-9\*]*
39 NUMBER (\-|\+)?[0-9]{1,20}
40 RANGE \({NUMBER}[ ]?\-[ ]?{NUMBER}\)
42 /* yytext shall be a pointer */
47 %option outfile="lib/command_lex.c"
48 %option header-file="lib/command_lex.h"
49 %option prefix="cmd_yy"
52 %option bison-locations
59 [ \t]+ LOC_STEP /* ignore whitespace */;
60 {IPV4} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4;}
61 {IPV4_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4_PREFIX;}
62 {IPV6} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6;}
63 {IPV6_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6_PREFIX;}
64 {MAC} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC;}
65 {MAC_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC_PREFIX;}
66 {VARIABLE} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return VARIABLE;}
67 {WORD} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return WORD;}
68 {RANGE} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return RANGE;}
69 !\[ {yylval->string = NULL; return EXCL_BRACKET;}
73 static YY_BUFFER_STATE buffer;
75 void set_lexer_string (yyscan_t *scn, const char *string)
79 buffer = yy_scan_string (string, *scn);
82 void cleanup_lexer (yyscan_t *scn)
84 // yy_delete_buffer (buffer, *scn);
88 #endif /* __clang_analyzer__ */