]> git.proxmox.com Git - mirror_frr.git/blob - lib/command_lex.l
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / lib / command_lex.l
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * Command format string lexer for CLI backend.
4 *
5 * --
6 * Copyright (C) 2015 Cumulus Networks, Inc.
7 */
8
9 %top{
10 #ifdef HAVE_CONFIG_H
11 #include "config.h"
12 #endif
13 }
14 %{
15 /* ignore flex generated code in static analyzer */
16 #ifndef __clang_analyzer__
17
18 /* ignore harmless bugs in old versions of flex */
19 #pragma GCC diagnostic ignored "-Wsign-compare"
20 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
21
22 #include "lib/command_parse.h"
23
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; \
28 } } while(0)
29 %}
30
31 IPV4 A\.B\.C\.D
32 IPV4_PREFIX A\.B\.C\.D\/M
33 IPV6 X:X::X:X
34 IPV6_PREFIX X:X::X:X\/M
35 MAC X:X:X:X:X:X
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}\)
41 ASNUM ASNUM
42
43 /* yytext shall be a pointer */
44 %pointer
45 %option noyywrap
46 %option nounput
47 %option noinput
48 %option outfile="lib/command_lex.c"
49 %option header-file="lib/command_lex.h"
50 %option prefix="cmd_yy"
51 %option reentrant
52 %option bison-bridge
53 %option bison-locations
54
55 %%
56 %{
57 LOC_STEP;
58 %}
59
60 [ \t]+ LOC_STEP /* ignore whitespace */;
61 {ASNUM} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return ASNUM;}
62 {IPV4} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4;}
63 {IPV4_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4_PREFIX;}
64 {IPV6} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6;}
65 {IPV6_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6_PREFIX;}
66 {MAC} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC;}
67 {MAC_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC_PREFIX;}
68 {VARIABLE} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return VARIABLE;}
69 {WORD} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return WORD;}
70 {RANGE} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return RANGE;}
71 !\[ {yylval->string = NULL; return EXCL_BRACKET;}
72 . {return yytext[0];}
73 %%
74
75 static YY_BUFFER_STATE buffer;
76
77 void set_lexer_string (yyscan_t *scn, const char *string)
78 {
79 *scn = NULL;
80 yylex_init(scn);
81 buffer = yy_scan_string (string, *scn);
82 }
83
84 void cleanup_lexer (yyscan_t *scn)
85 {
86 // yy_delete_buffer (buffer, *scn);
87 yylex_destroy(*scn);
88 }
89
90 #endif /* __clang_analyzer__ */